稍微扩展@sung-kim 的评论:
- CNN 主要用于解决计算机成像中的问题,例如
图像分类。它们以动物的视觉皮层为模型,它们
基本上有一个连接网络,这样就有瓷砖
有一些重叠的特征。通常他们需要很多
数据,超过 3 万个示例。
- 自动编码器用于特征生成和降维。他们从每一层的大量神经元开始,然后这个数字减少,然后再次增加。每个对象都是针对自身进行训练的。这会导致中间层(神经元数量少)在低维度上提供特征空间的有意义的投影。
- 虽然我不太了解 DBN,但它们似乎是自动编码器的监督扩展。需要训练的大量参数。
- 再次重申,我对玻尔兹曼机了解不多,但它们并未广泛用于此类问题(据我所知)
与所有建模问题一样,我建议从最基本的模型开始寻找信号。在您担心深度学习之前,也许一个好的起点是Logistic Regression。
如果您已经到了想要尝试深度学习的地步,无论出于何种原因。那么对于这种类型的数据,基本的前馈网络是最好的起点。就深度学习而言,30k 个数据点并不是一个很大的数字,所以总是最好从一个小型网络(1-3 个隐藏层,5-10 个神经元)开始,然后变得更大。不过,在执行参数优化时,请确保您有一个不错的验证集。如果您是scikit-learn API 的粉丝,我建议您从Keras 开始
进一步评论,在进行任何培训之前,您需要在班级标签上使用 OneHotEncoder。
编辑
我从赏金和 cmets 中看到,您希望更多地了解这些网络的工作原理。请参阅如何构建前馈模型并进行一些简单的参数优化的示例
import numpy as np
from sklearn import preprocessing
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
# Create some random data
np.random.seed(42)
X = np.random.random((10, 50))
# Similar labels
labels = ['good', 'bad', 'soso', 'amazeballs', 'good']
labels += labels
labels = np.array(labels)
np.random.shuffle(labels)
# Change the labels to the required format
numericalLabels = preprocessing.LabelEncoder().fit_transform(labels)
numericalLabels = numericalLabels.reshape(-1, 1)
y = preprocessing.OneHotEncoder(sparse=False).fit_transform(numericalLabels)
# Simple Keras model builder
def buildModel(nFeatures, nClasses, nLayers=3, nNeurons=10, dropout=0.2):
model = Sequential()
model.add(Dense(nNeurons, input_dim=nFeatures))
model.add(Activation('sigmoid'))
model.add(Dropout(dropout))
for i in xrange(nLayers-1):
model.add(Dense(nNeurons))
model.add(Activation('sigmoid'))
model.add(Dropout(dropout))
model.add(Dense(nClasses))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd')
return model
# Do an exhaustive search over a given parameter space
for nLayers in xrange(2, 4):
for nNeurons in xrange(5, 8):
model = buildModel(X.shape[1], y.shape[1], nLayers, nNeurons)
modelHist = model.fit(X, y, batch_size=32, nb_epoch=10,
validation_split=0.3, shuffle=True, verbose=0)
minLoss = min(modelHist.history['val_loss'])
epochNum = modelHist.history['val_loss'].index(minLoss)
print '{0} layers, {1} neurons best validation at'.format(nLayers, nNeurons),
print 'epoch {0} loss = {1:.2f}'.format(epochNum, minLoss)
哪些输出
2 layers, 5 neurons best validation at epoch 0 loss = 1.18
2 layers, 6 neurons best validation at epoch 0 loss = 1.21
2 layers, 7 neurons best validation at epoch 8 loss = 1.49
3 layers, 5 neurons best validation at epoch 9 loss = 1.83
3 layers, 6 neurons best validation at epoch 9 loss = 1.91
3 layers, 7 neurons best validation at epoch 9 loss = 1.65