了解具有二维输入张量的 LSTM 单元的权重形状
Understanding Weights shape of an LSTM cell with 2-D input tensor
我正在构建一个简单的 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)
的形状是不对的。只有矢量输入形状似乎符合上述等式。有人可以帮我理解上面输入形状为二维的等式吗?
TIA
您提到的方程式用于计算第 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
获得输入,并根据该输入和处理第一个到 [=第 17=] 个时间步。
我正在构建一个简单的 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)
的形状是不对的。只有矢量输入形状似乎符合上述等式。有人可以帮我理解上面输入形状为二维的等式吗?
TIA
您提到的方程式用于计算第 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
获得输入,并根据该输入和处理第一个到 [=第 17=] 个时间步。