Hiểu tham số input_shape trong LSTM với Keras


20

Tôi đang cố gắng sử dụng ví dụ được mô tả trong tài liệu Keras có tên "LSTM xếp chồng để phân loại theo trình tự" (xem mã bên dưới) và không thể tìm ra input_shapetham số trong ngữ cảnh dữ liệu của tôi.

Tôi có một ma trận gồm 25 ký tự có thể được mã hóa trong các số nguyên thành một chuỗi có độ dài tối đa 31. Kết quả là, tôi x_train(1085420, 31)ý nghĩa hình dạng (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))

Trong mã x_trainnày có hình dạng (1000, 8, 16), như đối với một mảng gồm 1000 mảng gồm 8 mảng gồm 16 phần tử. Ở đó tôi hoàn toàn bị mất về những gì và làm thế nào dữ liệu của tôi có thể đạt đến hình dạng này.

Nhìn vào tài liệu của Keras và các hướng dẫn và hỏi đáp khác nhau, có vẻ như tôi đang thiếu một cái gì đó rõ ràng. Ai đó có thể cho tôi một gợi ý về những gì cần tìm?

Cảm ơn bạn đã giúp đỡ !

Câu trả lời:


23

Hình dạng LSTM rất khó khăn nên đừng cảm thấy tồi tệ, tôi đã phải mất vài ngày để tự mình chiến đấu với chúng:

Nếu bạn sẽ cung cấp dữ liệu 1 ký tự tại một thời điểm, hình dạng đầu vào của bạn phải là (31,1) vì đầu vào của bạn có 31 dấu thời gian, mỗi ký tự 1 ký tự. Bạn sẽ cần định hình lại x_train của mình từ (1085420, 31) đến (1085420, 31,1) dễ dàng thực hiện với lệnh này:

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

2

Kiểm tra kho lưu trữ git LSTM Keras sơ đồ tóm tắt này và tôi tin rằng bạn sẽ nhận được mọi thứ rõ ràng.

Repo git này bao gồm một sơ đồ tóm tắt LSTM của Keras cho thấy:

  • việc sử dụng các thông số thích return_sequences, batch_size, time_step...
  • cấu trúc thực sự của các lớp lstm
  • khái niệm về các lớp này trong máy ảnh
  • cách thao tác dữ liệu đầu vào và đầu ra của bạn để phù hợp với yêu cầu mô hình của bạn cách xếp chồng các lớp của LSTM

Và hơn thế nữa


Cảm ơn bạn vì điều đó, @MohammadFneish. Điều này có vẻ như nó sẽ hữu ích hơn bây giờ. Tuy nhiên, không rõ ràng rằng đây là một câu trả lời cho câu hỏi , trái ngược với một gợi ý hữu ích. Xin lưu ý rằng Cross xác thực đúng là một trang web hỏi đáp, không phải là một diễn đàn. Bạn có thể thêm [vẫn còn] thông tin để giải thích tham số hình dạng đầu vào không?
gung - Phục hồi Monica

3
@gung tôi thực sự đánh giá cao cách bạn đang quản lý để xem xét các câu trả lời này để tuân thủ các tiêu chuẩn, nhưng tôi nghĩ rằng tôi không thể giải thích nhiều hơn về các tham số này khi có nhiều chi tiết kỹ thuật liên quan đến nó. Tôi chỉ nghĩ rằng câu trả lời của tôi có thể hữu ích cho các nhà phát triển phải đối mặt với các vấn đề tương tự với đầu vào của máy ảnh và không nhất thiết là vấn đề cụ thể này. Cảm ơn
Mohammad Fneish

1

Tôi biết đó không phải là câu trả lời trực tiếp cho câu hỏi của bạn. Đây là một ví dụ đơn giản hóa chỉ với một ô LSTM, giúp tôi hiểu hoạt động định hình lại cho dữ liệu đầu vào.

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

Đây sẽ là một ví dụ về mạng LSTM chỉ với một ô LSTM duy nhất và với dữ liệu đầu vào có hình dạng cụ thể.

Hóa ra, chúng tôi chỉ dự đoán ở đây, đào tạo không phải là đơn giản, nhưng hãy xem cách chúng tôi cần định hình lại dữ liệu (để thêm kích thước bổ sung) trước predictphương thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.