pytorch LSTM中output和hidden关系
1.LSTM模型简介
能点进来的相信大家也都清楚LSTM是个什么东西,我在这里就不加赘述了。具体介绍模型结构的也有不少。
如何简单的理解LSTM——其实没有那么复杂
人人都能看懂的LSTM
2.pytorch中的LSTM
这里附上一张pytorch官方文档的截图,h_n和c_n我都理解分别是上图中横向箭头中的下方箭头和上方的箭头,那output是干什么用的?在学习seq2seq时用的比较多基本上都是把encoder端的h_n和c_n输入的decoder端,output没怎么用过(听研究NER的同学说,他们用output不用h_n和c_n)。
简单翻译一下就是output是每个时间t的h_t的集合,LSTM最后一层的输出特征h_t。
3.关于h和output之间的关系进行实验
output, (hn,cn) = self.lstm(packed_embedding)
print('output', output.size())
print('hn', hn.size())
# 输出
output torch.Size([17, 1, 200])
h torch.Size([2, 1, 100])
这时我想到一个问题既然output是所有的h_n,那最后一维output是不是就是h_n?但是这里因为我们用的是双向LSTM所以output的第三维是200,而h_n是100,但是h_n的第一维是2(2【双向】*1【一层】)。
那是不是output[-1,0,:10]就是h_n[0,0,:10]?这里取前10维进行观察
print('output ', output[-1, 0, :10])
print("h_n", h_n[0, 0, :10])
再实验一下,反向h_n第一维取-1,output取第三维取后100维。
print('output', output[-1, 0, 100:110])
print("h_n", h_n[-1, 0, :10])
好像出了点问题,但是突然想到双向LSTM里反向部分的张量反向的最后一个t实际上是正向的第一个t,于是修改代码。
print('output', output[0, 0, 100:110])
print("h_n", h_n[-1, 0, :10])
嗯~这下就没啥问题了。