De Keras RNN Tutorial: "Los RNN son complicados. La elección del tamaño del lote es importante, la elección de la pérdida y el optimizador es crítica, etc. Algunas configuraciones no convergen".
Entonces, esta es una pregunta más general sobre cómo ajustar los hiperparámetros de un LSTM-RNN en Keras. Me gustaría saber acerca de un enfoque para encontrar los mejores parámetros para su RNN.
Comencé con el ejemplo de IMDB en Keras 'Github .
el modelo principal se ve así:
(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words=max_features,
test_split=0.2)
max_features = 20000
maxlen = 100 # cut texts after this number of words (among top max_features most common words)
batch_size = 32
model = Sequential()
model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
optimizer='adam',
class_mode="binary")
print("Train...")
model.fit(X_train, y_train, batch_size=batch_size, nb_epoch=3,
validation_data=(X_test, y_test), show_accuracy=True)
score, acc = model.evaluate(X_test, y_test,
batch_size=batch_size,
show_accuracy=True)
print('Test accuracy:', acc)
Test accuracy:81.54321846
81.5 es un puntaje justo y, lo que es más importante, significa que el modelo, aunque no está completamente optimizado, funciona.
Mis datos son series temporales y la tarea es predicción binaria, igual que en el ejemplo. Y ahora mi problema se ve así:
#Training Data
train = genfromtxt(os.getcwd() + "/Data/trainMatrix.csv", delimiter=',', skip_header=1)
validation = genfromtxt(os.getcwd() + "/Data/validationMatrix.csv", delimiter=',', skip_header=1)
#Targets
miniTrainTargets = [int(x) for x in genfromtxt(os.getcwd() + "/Data/trainTarget.csv", delimiter=',', skip_header=1)]
validationTargets = [int(x) for x in genfromtxt(os.getcwd() + "/Data/validationTarget.csv", delimiter=',', skip_header=1)]
#LSTM
model = Sequential()
model.add(Embedding(train.shape[0], 64, input_length=train.shape[1]))
model.add(LSTM(64))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
optimizer='adam',
class_mode="binary")
model.fit(train, miniTrainTargets, batch_size=batch_size, nb_epoch=5,
validation_data=(validation, validationTargets), show_accuracy=True)
valid_preds = model.predict_proba(validation, verbose=0)
roc = metrics.roc_auc_score(validationTargets, valid_preds)
print("ROC:", roc)
ROC:0.5006526
El modelo es básicamente el mismo que el IMDB. Aunque el resultado significa que no está aprendiendo nada. Sin embargo, cuando uso un MLP-NN de vainilla no tengo el mismo problema, el modelo aprende y la puntuación aumenta. Intenté aumentar el número de épocas y aumentar-disminuir el número de unidades LTSM pero la puntuación no aumentará.
Por lo tanto, me gustaría conocer un enfoque estándar para ajustar la red porque, en teoría, el algoritmo debería funcionar mejor que una red de perceptrón multicapa, especialmente para los datos de esta serie de tiempo.