了解具有2D输入张量的LSTM单元的权重形状

时间:2018-09-04 11:05:21

标签: python keras lstm rnn mnist

我正在建立一个简单的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_iW_fW_cW_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

1 个答案:

答案 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}所得到的状态给出输出}个时间步长。