Keras RNN Tutorial : " RNN 은 까다 롭습니다. 배치 크기 선택이 중요하고, 손실 및 최적화 선택이 중요합니다. 일부 구성은 수렴되지 않습니다."
따라서 이것은 Keras에서 LSTM-RNN의 하이퍼 파라미터를 튜닝하는 것에 대한 일반적인 질문입니다. RNN에 가장 적합한 매개 변수를 찾는 방법에 대해 알고 싶습니다.
Keras 'Github 에서 IMDB 예제로 시작했습니다 .
기본 모델은 다음과 같습니다.
(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는 공정한 점수이며 더 중요한 것은 모델이 완전히 최적화되지는 않았지만 작동한다는 것을 의미합니다.
내 데이터는 시계열이고 작업은 예제와 같은 이진 예측입니다. 이제 내 문제는 다음과 같습니다.
#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
모델은 기본적으로 IMDB 모델과 동일합니다. 결과는 아무것도 배우지 않는다는 것을 의미합니다. 그러나 바닐라 MLP-NN을 사용할 때 동일한 문제가 없으며 모델이 배우고 점수가 증가합니다. 에포크 수를 늘리고 LTSM 단위 수를 줄이려고 시도했지만 점수는 증가하지 않습니다.
이론적으로 알고리즘이이 시계열 데이터에 대해 멀티 레이어 퍼셉트론 네트워크보다 성능이 우수해야하므로 네트워크 튜닝에 대한 표준 접근 방식을 알고 싶습니다.