การทำความเข้าใจกับพารามิเตอร์ input_shape ใน LSTM ด้วย Keras


20

ฉันพยายามใช้ตัวอย่างที่อธิบายไว้ในเอกสารประกอบของ Kerasชื่อ "Stacked LSTM สำหรับการจำแนกลำดับ" (ดูรหัสด้านล่าง) และไม่สามารถหาinput_shapeพารามิเตอร์ในบริบทของข้อมูลของฉัน

ฉันมีเป็น input เมทริกซ์ของลำดับของ 25 ตัวอักษรที่เป็นไปได้เข้ารหัสในจำนวนเต็มลำดับเบาะของความยาวสูงสุด 31 เป็นผลให้ฉันx_trainมีรูปร่างความหมาย(1085420, 31)(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))

ในรหัสนี้x_trainมีรูปร่าง(1000, 8, 16)เช่นเดียวกับอาร์เรย์ 1,000 อาร์เรย์ 8 อาร์เรย์ 16 องค์ประกอบ ที่นั่นฉันได้หายไปอย่างสมบูรณ์ในสิ่งที่เป็นอย่างไรและข้อมูลของฉันสามารถเข้าถึงรูปร่างนี้ได้อย่างไร

ดู Keras doc และแบบฝึกหัดและถาม - ตอบที่หลากหลายดูเหมือนว่าฉันขาดอะไรบางอย่างที่ชัดเจน ใครสามารถให้คำแนะนำในสิ่งที่ฉันต้องการได้

ขอบคุณสำหรับความช่วยเหลือของคุณ !

คำตอบ:


23

รูปทรง LSTM นั้นยากดังนั้นอย่ารู้สึกแย่ฉันต้องใช้เวลาสองสามวันในการต่อสู้กับพวกเขา:

หากคุณจะป้อนข้อมูล 1 ตัวอักษรในแต่ละครั้งที่รูปร่างป้อนเข้าของคุณควรเป็น (31,1) เนื่องจากการป้อนข้อมูลของคุณมี 31 การประทับเวลาแต่ละตัวอักษร 1 ตัว คุณจะต้องปรับแต่ง x_train ของคุณจาก (1085420, 31) ถึง (1085420, 31,1) ซึ่งทำได้ง่ายด้วยคำสั่งนี้:

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

2

ตรวจสอบที่เก็บ git LSTM Keras นี้แผนภาพสรุปและฉันเชื่อว่าคุณควรทำให้ทุกอย่างชัดเจน

repo คอมไพล์นี้มีไดอะแกรมสรุป Keras LSTM ที่แสดง:

  • การใช้พารามิเตอร์ชอบreturn_sequences, batch_size, time_step...
  • โครงสร้างที่แท้จริงของเลเยอร์ lstm
  • แนวคิดของเลเยอร์เหล่านี้ใน keras
  • วิธีจัดการกับข้อมูลอินพุทและเอาท์พุทของคุณเพื่อให้ตรงกับความต้องการของโมเดลของคุณวิธีการซ้อนเลเยอร์ของ LSTM

และอื่น ๆ


ขอบคุณสำหรับสิ่งนั้น @MohammadFneish ดูเหมือนว่าจะเป็นประโยชน์มากขึ้นในขณะนี้ อย่างไรก็ตามมันไม่ชัดเจนว่านี่เป็นคำตอบสำหรับคำถามตรงข้ามกับข้อเสนอแนะที่เป็นประโยชน์ โปรดทราบว่าCross Validatedเป็นเว็บไซต์ถามตอบอย่างเคร่งครัดไม่ใช่ฟอรัม คุณสามารถเพิ่มข้อมูล [ยังเพิ่มเติม] เพื่ออธิบายพารามิเตอร์รูปร่างที่ป้อนเข้าได้หรือไม่
gung - Reinstate Monica

3
@ gung ฉันชื่นชมวิธีที่คุณจัดการเพื่อทบทวนคำตอบเหล่านี้เพื่อรักษามาตรฐาน แต่ฉันคิดว่าฉันไม่สามารถอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับพารามิเตอร์เหล่านี้ได้ในที่ซึ่งมีรายละเอียดทางเทคนิคมากมายที่เกี่ยวข้อง ฉันแค่คิดว่าคำตอบของฉันอาจเป็นประโยชน์สำหรับนักพัฒนาที่ประสบปัญหาคล้ายกันกับอินพุต keras และไม่จำเป็นต้องเป็นปัญหานี้โดยเฉพาะ ขอบคุณ
Mohammad Fneish

1

ฉันรู้ว่ามันไม่ใช่คำตอบสำหรับคำถามของคุณโดยตรง นี่เป็นตัวอย่างแบบง่าย ๆ ที่มีเซลล์ LSTM เพียงเซลล์เดียวช่วยให้ฉันเข้าใจการดำเนินการปรับรูปร่างสำหรับข้อมูลอินพุต

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

นี่จะเป็นตัวอย่างของเครือข่าย LSTM ที่มีเซลล์ LSTM เพียงเซลล์เดียวและมีข้อมูลอินพุตของรูปร่างที่เฉพาะเจาะจง

ตามที่ปรากฎเราเพิ่งคาดการณ์ไว้ที่นี่การฝึกอบรมไม่ได้เกิดขึ้นเพื่อความเรียบง่าย แต่ดูวิธีที่เราต้องการในการเปลี่ยนรูปร่างของข้อมูล (เพื่อเพิ่มมิติเพิ่มเติม) ก่อนpredictวิธี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.