LSTM 网络中有关维数的理解

2022-07-22 20:31:10 +08:00
 Richard14

pytorch 调用 nn.LSTM 的代码,github 上搜了一些范例代码感觉那些写代码的人思路上也挺混乱的。比如 batch_size 是 32, 最大序列长度 50 ,每个词用 10 个向量表示,那么 dataloader 给出的数据形状应该是[32, 50, 10]

import torch.nn as nn

input = torch.randn(32, 50, 10)
lstm_layer = nn.LSTM(10, 20, 1, batch_first=True)
output, (_, _) = lstm_layer(input)
# 输出形状是[32, 50, 20]

看网上很多文章都是按上述代码的方式输入的,是不是使用错误了?网上文章都说输入序列在 batch_first 的情况下应该是[batch_size, seq_len, input_dim],包括 torch 的文档里也是这么写的。

但是又有些代码的写法是要转换-1 和-2 维,即输入[32, 10, 50]->LSTM(50,100,batch_first=True)->输出[32, 10, 100]这种感觉的形状。

想问一下按人类的逻辑( RNN 应该按序列顺序循环输入,即循环 50 次)应该采用上述哪种写法?正常来说应该是按文档要求的写,但是诡异的是转换维数的那些代码也能跑而且还能收敛,这是咋回事。。

974 次点击
所在节点    程序员
3 条回复
heqing
2022-07-22 21:14:09 +08:00
[batch_size, seq_len, input_dim]应该是正确写法
rpman
2022-07-22 21:57:32 +08:00
一般习惯是[batch_size, seq_len, input_dim]
Richard14
2022-07-22 23:27:36 +08:00
@heqing
@rpman 那是不是可以理解为,它会循环 seq_len 次,然后把词向量升维到某维度,比如 lstm 的 input 是 10 ,hiddenlayer 是 512 的话就是等于 10 维升到 512 维,然后比如双向 lstm 的话就到 1024 维这样?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868100

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX