Memahami parameter input_shape di LSTM dengan Keras

20

Saya mencoba menggunakan contoh yang dijelaskan dalam dokumentasi Keras bernama "Stacked LSTM untuk klasifikasi urutan" (lihat kode di bawah) dan tidak dapat menemukan input_shapeparameter dalam konteks data saya.

Saya telah memasukkan matriks urutan 25 karakter yang mungkin dikodekan dalam bilangan bulat ke urutan empuk dengan panjang maksimum 31. Sebagai hasilnya, saya x_trainmemiliki (1085420, 31)makna bentuk (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))

Dalam kode ini x_trainmemiliki bentuk (1000, 8, 16), seperti untuk array 1000 array 8 array 16 elemen. Di sana saya benar-benar tersesat pada apa dan bagaimana data saya dapat mencapai bentuk ini.

Melihat Keras doc dan berbagai tutorial dan T&J, sepertinya saya kehilangan sesuatu yang jelas. Bisakah seseorang memberi saya petunjuk tentang apa yang harus dicari?

Terima kasih atas bantuan Anda !

mazieres
sumber

Jawaban:

23

Bentuk LSTM sulit jadi jangan merasa buruk, saya harus menghabiskan beberapa hari berjuang sendiri:

Jika Anda akan memasukkan 1 karakter data sekaligus, bentuk input Anda seharusnya (31,1) karena input Anda memiliki 31 tanda waktu, masing-masing 1 karakter. Anda perlu membentuk kembali x_train Anda dari (1085420, 31) hingga (1085420, 31,1) yang mudah dilakukan dengan perintah ini:

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

Periksa diagram ringkasan git LSTM Keras ini dan saya yakin Anda harus menjelaskan semuanya.

Repo git ini mencakup diagram ringkasan Keras LSTM yang menunjukkan:

  • penggunaan parameter seperti return_sequences, batch_size, time_step...
  • struktur sebenarnya dari lapisan lstm
  • konsep lapisan ini dalam keras
  • bagaimana memanipulasi input dan output data Anda agar sesuai dengan persyaratan model Anda cara menumpuk lapisan LSTM

Dan lagi

Mohammad Fneish
sumber
Terima kasih untuk itu, @MohammadFneish. Sepertinya ini akan lebih membantu sekarang. Namun, tidak jelas apakah ini merupakan jawaban atas pertanyaan tersebut , dan bukan saran yang bermanfaat. Ketahuilah bahwa Cross Validated hanyalah situs T&J, bukan forum. Bisakah Anda menambahkan informasi [lebih banyak lagi] untuk menjelaskan parameter bentuk input?
gung - Reinstate Monica
3
@ung saya sangat menghargai cara Anda mengelola untuk meninjau jawaban ini untuk tetap pada standar, tetapi saya pikir saya tidak bisa menguraikan lebih lanjut tentang parameter ini di mana ada banyak rincian teknis mengenai hal itu. Saya hanya berpikir bahwa jawaban saya dapat bermanfaat bagi pengembang yang menghadapi masalah serupa dengan input keras dan belum tentu masalah khusus ini. Terima kasih
Mohammad Fneish
1

Saya tahu ini bukan jawaban langsung untuk pertanyaan Anda. Ini adalah contoh yang disederhanakan dengan hanya satu sel LSTM, membantu saya memahami operasi pembentukan kembali untuk data input.

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))

Ini akan menjadi contoh jaringan LSTM dengan hanya satu sel LSTM dan dengan data input bentuk tertentu.

Ternyata, kami hanya memprediksi di sini, pelatihan tidak hadir untuk kesederhanaan, tetapi lihat bagaimana kami perlu membentuk kembali data (untuk menambah dimensi tambahan) sebelum predictmetode.

prosti
sumber