我正在建立一个简单的LSTM模型,如下所示:
model = Sequential()
model.add(LSTM(10, return_sequences = False, input_shape = (8, 8)))
model.add(Activation('softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics = ['accuracy'])
在这里,我输入的是形状为(8,8)的ndarray。从该网络中经过训练的模型中,当我抛弃权重时,得到的值如下:
print(model.layers.layer[0].get_weights[0].shape) # W [W_i, W_f, W_c, W_o]
print(model.layers.layer[0].get_weights[1].shape) # U
print(model.layers.layer[0].get_weights[2].shape) # b
输出:
(8, 40)
(10, 40)
(40,)
W是W_i
,W_f
,W_c
和W_o
和(8, 10)
的组合矩阵。但这与方程式不符:
f_t = sigmoid( W_f * x + U_f * h_{t-1} + b_f )
如果仅考虑上述方程式的矩阵维数,则结果如下:
W_f' * x + U_f' * h_{t-1} + b_f
--> [10, 8] x [8, 8] + [10, 10] x [10, 1] + [10, 1]
--> [10, 8] + [10, 1] + [10, 1]
因此,从以上方程式可以看出,X(input_tensor)
的形状似乎不正确。似乎只有矢量输入形状适合上述公式。有人可以帮我理解上述以输入形状为2-D的方程式吗?
TIA
答案 0 :(得分:1)
您提到的方程式用于计算第t
个时间步的输出。因此,仅使用时间步t
上的输入(即x_t
),而不是所有输入(即x
):
f_t = sigmoid( W_f * x_{t} + U_f * h_{t-1} + b_f )
结果,我们将拥有:
W_f' * x + U_f' * h_{t-1} + b_f
--> [10, 8] x [8, 1] + [10, 10] x [10, 1] + [10, 1]
--> [10, 1] + [10, 1] + [10, 1]
--> [10, 1] # output at timestep t
这与LSTM层的含义一致:它们在时间步t
处获取输入,并基于该输入和根据处理第一个到{{1}所得到的状态给出输出}个时间步长。