จากการสอนของ Keras RNN: "RNN นั้นยุ่งยากการเลือกขนาดแบตช์เป็นสิ่งสำคัญตัวเลือกการสูญเสียและออพติไมเซอร์เป็นสิ่งสำคัญ ฯลฯ การกำหนดค่าบางอย่างจะไม่มาบรรจบกัน"
ดังนั้นนี่เป็นคำถามทั่วไปเกี่ยวกับการปรับพารามิเตอร์ไฮเปอร์พารามิเตอร์ของ LSTM-RNN บน Keras ฉันต้องการทราบวิธีการในการค้นหาพารามิเตอร์ที่ดีที่สุดสำหรับ RNN ของคุณ
ผมเริ่มต้นด้วยตัวอย่างเช่นไอเอ็มบน Keras' Github
โมเดลหลักมีลักษณะดังนี้:
(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 ที่ลดลง แต่คะแนนจะไม่เพิ่มขึ้น
ดังนั้นฉันอยากจะรู้วิธีการมาตรฐานในการปรับแต่งเครือข่ายเพราะในทางทฤษฎีแล้วอัลกอริทึมควรทำงานได้ดีกว่าเครือข่ายแบบหลายจุดโดยเฉพาะสำหรับข้อมูลอนุกรมเวลานี้