Форматирование входных данных для слоя LSTM с переменным временным шагом с использованием Tensorflow - PullRequest
0 голосов
/ 17 февраля 2019

Согласно документации, слой LSTM должен обрабатывать входные данные в форме (None, CONST, CONST).Для переменного временного шага он должен иметь возможность обрабатывать входные данные в форме (None, None, CONST) .

Допустим, мои данные следующие:

X = [
    [
        [1, 2, 3],
        [4, 5, 6]
    ],
    [
        [7, 8, 9]
    ]
]
Y = [0, 1]

И моя модель:

model = tf.keras.models.Sequential([
    tf.keras.layers.LSTM(32, activation='tanh',input_shape=(None, 3)),
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='categorical_crossentropy', optimizer='adam')
model.fit(X, Y)

Мой вопрос: как мне отформатировать эти входные данные , чтобы этот код работал?

Я не могу использоватьпанды, вот как я привык.Если я запускаю приведенный выше код, я получаю эту ошибку:

Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 2 arrays:

И если я изменяю последнюю строку на:

model.fit(np.array(X), np.array(Y))

Ошибка теперь:

Error when checking input: expected lstm_8_input to have 3 dimensions, but got array with shape (2, 1)

1 Ответ

0 голосов
/ 17 февраля 2019

Вы близки, но в Keras / Tensorflow вам необходимо pad ваших последовательностей и затем использовать Masking , чтобы LSTM пропустил эти дополненные. Почему? Потому что ваши записи в вашем тензоре должны иметь одинаковую форму (batch_size, max_length, features).Поэтому, если у вас переменная длина, последовательность дополняется.

Вы можете использовать keras.preprocessing.sequence.pad_sequence , чтобы дополнить свои последовательности, чтобы получить что-то вроде:

X = [
    [
        [1, 2, 3],
        [4, 5, 6]
    ],
    [
        [7, 8, 9],
        [0, 0, 0],
    ]
]
X.shape == (2, 2, 3)
Y = [0, 1]
Y.shape == (2, 1)

А затем используйте маскирующий слой:

model = tf.keras.models.Sequential([
    tf.keras.layers.Masking(), # this tells LSTM to skip certain timesteps
    tf.keras.layers.LSTM(32, activation='tanh',input_shape=(None, 3)),
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam')
model.fit(X, Y)

Вы также хотите binary_crossentropy, поскольку у вас есть проблема двоичной классификации с выводом sigmoid.

...