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。希望这会有所帮助。