V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Richard14
V2EX  ›  程序员

LSTM 网络中有关维数的理解

  •  
  •   Richard14 · 2022-07-22 20:31:10 +08:00 · 1067 次点击
    这是一个创建于 855 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 次)应该采用上述哪种写法?正常来说应该是按文档要求的写,但是诡异的是转换维数的那些代码也能跑而且还能收敛,这是咋回事。。

    3 条回复    2022-07-22 23:27:36 +08:00
    heqing
        1
    heqing  
       2022-07-22 21:14:09 +08:00
    [batch_size, seq_len, input_dim]应该是正确写法
    rpman
        2
    rpman  
       2022-07-22 21:57:32 +08:00 via iPhone
    一般习惯是[batch_size, seq_len, input_dim]
    Richard14
        3
    Richard14  
    OP
       2022-07-22 23:27:36 +08:00
    @heqing
    @rpman 那是不是可以理解为,它会循环 seq_len 次,然后把词向量升维到某维度,比如 lstm 的 input 是 10 ,hiddenlayer 是 512 的话就是等于 10 维升到 512 维,然后比如双向 lstm 的话就到 1024 维这样?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2634 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:33 · PVG 12:33 · LAX 20:33 · JFK 23:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.