Многомерный вход для LSTM в Keras

Я хотел бы понять, как RNN, в частности, LSTM работает с несколькими входными измерениями, используя Keras и Tensorflow. Я имею в виду, что форма ввода (batch_size, timesteps, input_dim), где input_dim > 1.
Я думаю, что приведенные ниже иллюстрации достаточно хорошо иллюстрируют концепцию LSTM, если input_dim = 1.
Означает ли это, если input_dim > 1, то x больше не одно значение, а массив? Но если это так, тогда веса также становятся массивами, такими же, как x + контекст?

Структура LSTM

введите описание изображения здесь

Ответ 1

Keras создает вычислительный граф, который выполняет последовательность в вашем нижнем изображении для каждой функции (но для всех единиц). Это означает, что значение состояния C всегда является скаляром, по одному на единицу. Он не обрабатывает функции сразу, он обрабатывает единицы одновременно, а функции - отдельно.

import keras.models as kem
import keras.layers as kel

model = kem.Sequential()
lstm = kel.LSTM(units, input_shape=(timesteps, features))
model.add(lstm)
model.summary()

free_params = (4 * features * units) + (4 * units * units) + (4 * num_units)
print('free_params ', free_params)
print('kernel_c', lstm.kernel_c.shape)
print('bias_c', lstm.bias_c .shape)

где 4 представляет собой один для каждого из внутренних путей f, i, c и o в вашем нижнем изображении. Первый член - это число весов для ядра, второе слагаемое для рекуррентного ядра и последнее для смещения, если оно применяется. Для

units = 1
timesteps = 1
features = 1

мы видим, что

Layer (type)                 Output Shape              Param #
=================================================================
lstm_1 (LSTM)                (None, 1)                 12
=================================================================
Total params: 12.0
Trainable params: 12
Non-trainable params: 0.0
_________________________________________________________________
num_params 12
kernel_c (1, 1)
bias_c (1,)

и для

units = 1
timesteps = 1
features = 2

мы видим, что

Layer (type)                 Output Shape              Param #
=================================================================
lstm_1 (LSTM)                (None, 1)                 16
=================================================================
Total params: 16.0
Trainable params: 16
Non-trainable params: 0.0
_________________________________________________________________
num_params 16
kernel_c (2, 1)
bias_c (1,)

где bias_c является прокси для выходной формы состояния C. Обратите внимание, что существуют различные реализации, касающиеся внутреннего создания устройства. Подробности здесь (http://deeplearning.net/tutorial/lstm.html), а реализация по умолчанию использует Eq.7. Надеюсь, это поможет.