Keras RNN Öğreticisinden: "RNN'ler zor. Toplu iş boyutu seçimi önemlidir, kayıp ve optimize edici seçimi kritiktir, vb. Bazı yapılandırmalar yakınsama yapmaz."
Yani bu daha çok bir LSTM-RNN'nin hiperparametrelerinin Keras üzerinde ayarlanması hakkında genel bir soru. RNN'niz için en iyi parametreleri bulma yaklaşımını bilmek istiyorum.
Keras'ın Github'daki IMDB örneğiyle başladım .
ana model şöyle görünür:
(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 adil bir puan ve daha da önemlisi, modelin tam olarak optimize edilmemesine rağmen çalıştığı anlamına geliyor.
Verilerim Zaman Serisi ve görev ikili tahmin, örnekle aynı. Ve şimdi benim sorunum şöyle:
#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 temel olarak IMDB modeliyle aynıdır. Sonuç, hiçbir şey öğrenmediği anlamına gelir. Ancak, vanilya MLP-NN kullandığımda aynı problemim yok, model öğrenir ve puan artar. Dönem sayısını artırmayı ve LTSM birimlerinin sayısını azaltmayı denedim ama puan artmayacak.
Bu yüzden ağın ayarlanması için standart bir yaklaşım bilmek istiyorum çünkü teoride algoritma, bu zaman serisi verileri için özel olarak çok katmanlı bir algılayıcı ağından daha iyi performans göstermelidir.