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)