stackoverflow.com/questions/46144191/...
я есть вопрос, касающийся разной длины последовательностей для LSTM в Керасе. Я передаю пакеты размером 200 и последовательности переменной длины (= x) с 100 объектами для каждого объекта в последовательности (=> [200, x, 100]) в LSTM:
LSTM(100, return_sequences=True, stateful=True, input_shape=(None, 100), batch_input_shape=(200, None, 100))
Я подгоняю модель к следующим случайно созданным матрицам:
x_train = np.random.random((1000, 50, 100))
x_train_2 = np.random.random((1000, 10,100))
Насколько я правильно понял LSTM (и реализацию Keras), x должен относиться к числу ячеек LSTM. Для каждой ячейки LSTM необходимо выучить состояние и три матрицы (для ввода, состояния и выхода ячейки). Как можно передать переменную длину последовательности в LSTM без заполнения до макс. указана длина, как у меня? Код работает, но на самом деле не должен (в моем понимании). Впоследствии можно даже передать другой x_train_3 с длиной последовательности 60, но не должно быть состояний и матриц для дополнительных 10 ячеек.
Кстати, я использую Keras версии 1.0.8 и Tensorflow GPU 0.9.
Вот мой пример кода:
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
from keras import backend as K
with K.get_session():
# create model
model = Sequential()
model.add(LSTM(100, return_sequences=True, stateful=True, input_shape=(None, 100),
batch_input_shape=(200, None, 100)))
model.add(LSTM(100))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# Generate dummy training data
x_train = np.random.random((1000, 50, 100))
x_train_2 = np.random.random((1000, 10, 100))
y_train = np.random.random((1000, 2))
y_train_2 = np.random.random((1000, 2))
# Generate dummy validation data
x_val = np.random.random((200, 50, 100))
y_val = np.random.random((200, 2))
# fit and eval models
model.fit(x_train, y_train, batch_size=200, nb_epoch=1, shuffle=False, validation_data=(x_val, y_val), verbose=1)
model.fit(x_train_2, y_train_2, batch_size=200, nb_epoch=1, shuffle=False, validation_data=(x_val, y_val), verbose=1)
score = model.evaluate(x_val, y_val, batch_size=200, verbose=1)