केर आरएनएन ट्यूटोरियल से: " आरएनएन मुश्किल हैं। बैच आकार की पसंद महत्वपूर्ण है, नुकसान की पसंद और ऑप्टिमाइज़र महत्वपूर्ण है, आदि। कुछ विन्यास अभिसरण नहीं करेंगे।"
इसलिए यह केरस पर एक LSTM-RNN के हाइपरपैरमीटर को ट्यून करने के बारे में एक सामान्य प्रश्न है। मैं आपके RNN के सर्वोत्तम मापदंडों को खोजने के लिए एक दृष्टिकोण के बारे में जानना चाहूंगा।
मैंने Keras के गितुब पर 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 एक के समान है। हालांकि परिणाम का मतलब है कि यह कुछ भी नहीं सीख रहा है। हालांकि, जब मैं एक वेनिला एमएलपी-एनएन का उपयोग करता हूं तो मुझे समान समस्या नहीं होती है, मॉडल सीखता है और स्कोर बढ़ता है। मैंने युगों की संख्या बढ़ाने और एलटीएसएम इकाइयों की संख्या को बढ़ाने और घटने की कोशिश की लेकिन स्कोर नहीं बढ़ेगा।
इसलिए मैं नेटवर्क को ट्यूनिंग करने के लिए एक मानक दृष्टिकोण जानना चाहूंगा क्योंकि सिद्धांत रूप में एल्गोरिथ्म को इस समय श्रृंखला डेटा के लिए विशेष रूप से एक बहुपरत अवधारणात्मक नेटवर्क से बेहतर प्रदर्शन करना चाहिए।