# 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,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]) |
好像出了点问题,但是突然想到反向的话反向的最后一个 t 实际上是正向的第一个 t,于是修改代码。
print('output', output[0, 0, 100:110]) | |
print("h_n", h_n[-1, 0, :10]) |
嗯~这下就没啥问题了。