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