Ответ 1
Чтобы немного расширить комментарий @sung-kim:
- CNN используются в первую очередь для проблем с компьютерной визуализацией, таких как классифицируя изображения. Они моделируются на животных визуальной коре, они в основном имеют сеть соединений, так что есть плитки которые частично перекрываются. Обычно они требуют много данных, более 30 тыс. примеров.
- Autoencoder используется для создания функций и уменьшения размерности. Они начинаются с множества нейронов на каждом слое, затем это число уменьшается, а затем снова увеличивается. Каждый предмет обучается сам по себе. Это приводит к средним уровням (низкое число нейронов), обеспечивающим значимую проекцию пространственного объекта в малой размерности.
- Хотя я мало знаю о DBN, они, как представляется, являются контролируемым расширением Autoencoder. Множество параметров для тренировки.
- Снова я не очень разбираюсь в машинах Boltzmann, но они широко не используются для такого рода проблем (насколько мне известно).
Как и во всех проблемах моделирования, я бы предложил начать с самой базовой модели, чтобы искать сигнал. Возможно, хорошее место для начала - Логистическая регрессия, прежде чем беспокоиться о глубоком обучении.
Если вы дошли до того, что хотите попробовать глубокое обучение по каким-либо причинам. Тогда для этого типа данных основная сеть для прямой передачи - это лучшее место для начала. С точки зрения глубокого обучения 30 тыс. Точек данных невелики, поэтому всегда лучше начинать с небольшой сети (1-3 скрытых слоя, 5-10 нейронов), а затем увеличиваться. При выполнении оптимизации параметров убедитесь, что у вас есть приличная проверка. Если вы поклонник API scikit-learn
, я предлагаю, чтобы Keras было хорошим местом для запуска
Еще один комментарий, вы захотите использовать OneHotEncoder на своих ярлыках класса, прежде чем выполнять какие-либо тренировки.
ИЗМЕНИТЬ
Я вижу из щедрот и комментариев, что вы хотите увидеть немного больше о том, как работают эти сети. См. Пример создания модели с подачей вперед и простейшего выбора параметров
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