【发布时间】:2019-05-07 03:47:10
【问题描述】:
我想在 pytorch 中挂钩 LSTMCell 函数的反向传递,因此在初始化传递中我执行以下操作(num_layers=4,hidden_size=1000,input_size=1000):
self.layers = nn.ModuleList([
LSTMCell(
input_size=input_size,
hidden_size=hidden_size,
)
for layer in range(num_layers)
])
for l in self.layers:
l.register_backward_hook(backward_hook)
在前向传递中,我只是在序列长度和 num_layers 上迭代 LSTMCell,如下所示:
for j in range(seqlen):
input = #some tensor of size (batch_size, input_size)
for i, rnn in enumerate(self.layers):
# recurrent cell
hidden, cell = rnn(input, (prev_hiddens[i], prev_cells[i]))
输入的大小为(batch_size, input_size),prev_hiddens[i] 的大小为(batch_size, hidden_size),prev_cells[i] 的大小为(batch_size, hidden_size)。
在backward_hook 中,我打印输入到此函数的张量的大小:
def backward_hook(module, grad_input, grad_output):
for grad in grad_output:
print ("grad_output {}".format(grad))
for grad in grad_input:
print ("grad_input.size () {}".format(grad.size()))
作为结果,第一次调用backward_hook,例如:
[A] 对于grad_output,我得到2个张量,其中第二个张量是None。这是可以理解的,因为在后向阶段,我们有内部状态梯度(c)和输出梯度(h)。时间维度的最后一次迭代没有隐藏未来,所以它的梯度是无。
[B] 对于 grad_input,我得到 5 个张量 (batch_size=9):
grad_input.size () torch.Size([9, 4000])
grad_input.size () torch.Size([9, 4000])
grad_input.size () torch.Size([9, 1000])
grad_input.size () torch.Size([4000])
grad_input.size () torch.Size([4000])
我的问题是:
(1) 我对 [A] 的理解正确吗?
(2) 如何解释 grad_input 元组中的 5 个张量?我认为应该只有 3 个,因为 LSTMCell forward() 只有 3 个输入?
谢谢
【问题讨论】:
标签: neural-network lstm pytorch recurrent-neural-network