Keras ile LSTM'deki input_shape parametresini anlama


20

"Sıra sınıflandırması için Yığılmış LSTM" (aşağıdaki kodu bakın) adlı Keras belgelerinde açıklanan örneği kullanmaya çalışıyorum ve input_shapeverilerim bağlamında parametre anlayamıyorum .

Ben girdi olarak maksimum uzunluğu 31 dolgulu bir diziye tamsayılar kodlanmış 25 olası karakter dizisi bir matris var. Sonuç olarak, benim x_trainşekil (1085420, 31)anlamı vardır (n_observations, sequence_length).

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# Generate dummy training data
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# Generate dummy validation data
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

Bu kodda x_train, (1000, 8, 16)16 elemandan oluşan 8 diziden oluşan 1000 diziden oluşan bir dizide olduğu gibi. Orada verilerimin bu şekle ne ve nasıl erişebileceği konusunda tamamen kayboluyorum.

Keras doc ve çeşitli öğreticiler ve soru-cevap bölümlerine baktığımda, bariz bir şey eksik gibi görünüyor. Birisi bana neyi arayacağımız hakkında bir ipucu verebilir mi?

Yardımın için teşekkürler !

Yanıtlar:


23

LSTM şekilleri zordur, bu yüzden kötü hissetmeyin, birkaç gün kendimle savaşmak zorunda kaldım:

Her seferinde 1 karakter veri besleyecekseniz, girişinizde 31 karakter sayısı, her biri 1 karakter olduğu için giriş şekliniz (31,1) olmalıdır. Bu komutla kolayca yapılan x_train'inizi (1085420, 31) 'den (1085420, 31,1)' e yeniden biçimlendirmeniz gerekir:

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))

2

Bu git deposu LSTM Keras özet şemasını kontrol edin ve her şeyi berraklaştırmanız gerektiğine inanıyorum.

Bu git repo'su aşağıdakileri gösteren bir Keras LSTM özet şemasını içerir:

  • parametrelerin kullanılması gibi return_sequences, batch_size, time_step...
  • lstm katmanlarının gerçek yapısı
  • keralarda bu katmanların kavramı
  • giriş ve çıkış verilerinizi model gereksinimlerinize uyacak şekilde nasıl değiştireceğiniz LSTM katmanlarının nasıl yığınlanacağı

Ve dahası


Bunun için teşekkürler, @MohammadFneish. Bu şimdi daha yararlı olur gibi görünüyor. Ancak, bunun yararlı bir öneri yerine sorunun oldukça cevabı olduğu açık değildir . Unutmayın Çapraz Onaylı kesinlikle bir Q & A sitesi değil, bir forumdur. Giriş şekli parametresini açıklamak için [daha fazla] bilgi ekleyebilir misiniz?
gung - Monica'yı eski durumuna getirin

3
@gung i gerçekten standartları korumak için bu cevapları gözden yönetmek için yönetme yolu için teşekkür ederiz, ama ben bununla ilgili birçok teknik detaylar nerede bu parametreler hakkında daha fazla ayrıntı düşünemiyorum düşünüyorum. Sadece cevabımın keras girdileriyle benzer sorunlarla karşılaşan geliştiriciler için yararlı olabileceğini düşünüyorum, bu özel sorun değil. Teşekkürler
Mohammad Fneish

1

Sorunuzun doğrudan cevabı olmadığını biliyorum. Bu, yalnızca bir LSTM hücresi ile basitleştirilmiş bir örnektir ve giriş verileri için yeniden şekillendirme işlemini anlamama yardımcı olur.

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
import numpy as np

# define model
inputs1 = Input(shape=(2, 3))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])

# define input data
data = np.random.rand(2, 3)
data = data.reshape((1,2,3))

# make and show prediction
print(model.predict(data))

Bu, yalnızca tek bir LSTM hücresi ve belirli bir şekildeki giriş verileri ile LSTM ağına bir örnek olacaktır.

Anlaşıldığı üzere, burada sadece tahmin ediyoruz, eğitim basitlik için mevcut değil, ancak predictyöntemden önce verileri yeniden şekillendirmek (ek boyut eklemek için) için nasıl gerekli olduğumuza bakın .

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.