Keras (Python) kullanarak LSTM-RNN için hiperparametre araması


18

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.


1
Ne kadar verinin var? Dizilerinizin uzunluğu nedir? LSTM'ler sadece çok fazla veri ve uzun süreli bağımlılığı olan problemler için faydalıdır.
pir

Rastgele arama veya Bayes optimizasyonu hiperparametreleri bulmanın standart yoludur :)
pir

1
Gömme katmanına ihtiyacınız olduğundan emin misiniz? Birçok zaman serisi veri kümesine ihtiyaç duymaz.
pir

Yaklaşık 100 bin veri noktası ve IMDB örneğinin iki katı kadar özelliği var, bu yüzden sorun olduğunu düşünmüyorum. Gömme katmanına gelince, LSTM katmanını girişe tam olarak nasıl bağlarsınız? Belgelere göre keras.io/layers/recurrent/#lstm Keras'ın LSTM'si yalnızca başlatma, etkinleştirme ve çıktı_dümelerini bağımsız değişken olarak alır. Hatanın kaynağı bu ise, katıştırma katmanının nasıl ortadan kaldırılacağını açıklayan kod çok takdir edilecektir.
wacax

Lütfen cevabımı gör. Gömme katmanına ihtiyacınız yok gibi görünüyor.
pir

Yanıtlar:


5

Gömme katmanı pozitif tam sayıları (indeksler) sabit boyutlu yoğun vektörlere dönüştürür. Örneğin [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]],. Bu gösterim dönüşümü, Keras'taki gömme katmanı ile otomatik olarak öğrenilir ( belgelere bakın ).

Ancak, verilerinizin bir dönüşüm gerçekleştirmek için böyle bir katıştırma katmanına ihtiyacı olmadığı görülüyor. Gereksiz gömme katmanına sahip olmanız, muhtemelen LSTM'nizin düzgün çalışmasını sağlayamazsınız. Bu durumda, gömme katmanını kaldırmanız yeterlidir.

Ağınızdaki ilk katmana input_shape, verilerinizin boyutları hakkında bilgi içeren bir bağımsız değişken eklenmelidir ( örneklere bakın ). Bu bağımsız değişkeni herhangi bir katmana ekleyebileceğinizi unutmayın - belirli bir katmanın belgelerinde bulunmayacaktır.


Bu arada, hiperparametreler genellikle rastgele arama veya Bayes optimizasyonu kullanılarak ayarlanır. Ben RMSProp kullanın ve toplu iş boyutu (32, 64, 128, 256 ve 512 gibi boyutlar), degrade kırpma (0.1-10 aralığında) ve bırakma (0.1-0.6 aralığında) odaklanmak istiyorum. Elbette ayrıntılar verilerinize ve model mimarinize bağlıdır.


Gömme katmanını neyle değiştirmeyi öneriyorsunuz? Gömme katmanını kaldırmayı denedim ama bu işe yaramıyor.
wacax

1
Diğer örneklere bakın - örn. Doğrudan Yoğun katman ile başlayın. İnput_shape parametresini ayarlamayı unutmayın.
pir



2

Talos tam aradığınız şey; Keras modelleri için hiperparametre kombinasyonlarını aramak için otomatik bir çözüm. Yazar olduğum için objektif olmayabilirim, ancak amaç Keras işlevselliğini tamamen ortaya koyarken mümkün olan en düşük öğrenme eğrisine sahip bir alternatif sunmaktı.

Alternatif olarak, daha önce de belirtildiği gibi, Hyperas'a , sonra SKlearn veya AutoKeras'a bakabilirsiniz . Bildiğim kadarıyla, yazarken, bu 4 özellikle Keras kullanıcıları için seçenekler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.