Z samouczka RNN firmy Keras: „RNN są trudne. Wybór wielkości partii jest ważny, wybór straty i optymalizatora ma kluczowe znaczenie itp. Niektóre konfiguracje nie będą zbieżne”.
Jest to więc bardziej ogólne pytanie dotyczące dostrajania hiperparametrów LSTM-RNN w Keras. Chciałbym wiedzieć o podejściu do znalezienia najlepszych parametrów dla Twojego RNN.
Zacząłem od przykładu IMDB na Githubie Keras .
główny model wygląda następująco:
(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 to dobry wynik, a co ważniejsze, oznacza to, że model, choć nie w pełni zoptymalizowany, działa.
Moje dane to Szeregi czasowe, a zadaniem jest przewidywanie binarne, tak samo jak w przykładzie. A teraz mój problem wygląda następująco:
#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
Model jest w zasadzie taki sam jak IMDB. Chociaż wynik oznacza, że niczego się nie uczy. Kiedy jednak używam wanilii MLP-NN, nie mam tego samego problemu, model uczy się, a wynik rośnie. Próbowałem zwiększyć liczbę epok i zwiększyć-zmniejszyć liczbę jednostek LTSM, ale wynik nie wzrośnie.
Chciałbym więc poznać standardowe podejście do dostrajania sieci, ponieważ teoretycznie algorytm powinien działać lepiej niż wielowarstwowa sieć perceptronowa specjalnie dla danych szeregów czasowych.