【问题标题】:Trying to understand Pytorch's implementation of LSTM试图理解Pytorch对LSTM的实现
【发布时间】:2019-08-19 20:37:49
【问题描述】:

我有一个包含 1000 个示例的数据集,其中每个示例都有 5 个特征(a、b、c、d、e)。我想将 7 个示例提供给 LSTM,以便它预测第 8 天的特征 (a)。

阅读 nn.LSTM() 的 Pytorchs 文档我想出了以下内容:

input_size = 5
hidden_size = 10
num_layers = 1
output_size = 1

lstm = nn.LSTM(input_size, hidden_size, num_layers)
fc = nn.Linear(hidden_size, output_size)

out, hidden = lstm(X)  # Where X's shape is ([7,1,5])
output = fc(out[-1])

output  # output's shape is ([7,1])

根据文档:

nn.LSTM 的输入是“input of shape (seq_len, batch, input_size)”,其中“input_size – 预期特征的数量输入 x",

输出是:“形状的输出(seq_len,batch,num_directions * hidden_​​size):包含LSTM最后一层的输出特征(h_t)的张量,每个t。”

在这种情况下,我认为seq_len 将是 7 个示例的序列,batch 是 1,input_size 是 5。所以 lstm 会消耗每个包含 5 个特征的示例,每次迭代都重新输入隐藏层。

我错过了什么?

【问题讨论】:

    标签: machine-learning deep-learning lstm pytorch recurrent-neural-network


    【解决方案1】:

    当我将您的代码扩展为完整示例时——我还添加了一些 cmets 可能会有所帮助——我得到以下信息:

    import torch
    import torch.nn as nn
    
    input_size = 5
    hidden_size = 10
    num_layers = 1
    output_size = 1
    
    lstm = nn.LSTM(input_size, hidden_size, num_layers)
    fc = nn.Linear(hidden_size, output_size)
    
    X = [
        [[1,2,3,4,5]],
        [[1,2,3,4,5]],
        [[1,2,3,4,5]],
        [[1,2,3,4,5]],
        [[1,2,3,4,5]],
        [[1,2,3,4,5]],
        [[1,2,3,4,5]],
    ]
    
    X = torch.tensor(X, dtype=torch.float32)
    
    print(X.shape)         # (seq_len, batch_size, input_size) = (7, 1, 5)
    out, hidden = lstm(X)  # Where X's shape is ([7,1,5])
    print(out.shape)       # (seq_len, batch_size, hidden_size) = (7, 1, 10)
    out = out[-1]          # Get output of last step
    print(out.shape)       # (batch, hidden_size) = (1, 10)
    out = fc(out)          # Push through linear layer
    print(out.shape)       # (batch_size, output_size) = (1, 1)
    

    考虑到您的batch_size = 1output_size = 1,这对我来说是有意义的(我假设您正在做回归)。我不知道你的output.shape = (7, 1)来自哪里。

    您确定您的X 的尺寸正确吗?您是否使用batch_first=True 创建了nn.LSTM?有很多小东西可以偷偷溜进去。

    【讨论】:

    • 由于seq_len=7 lstm 的每次迭代都会消耗一行包含 [1,2,3,4,5] 的 X,对吗?我无法想象 lstm 每次迭代都在做什么。
    • “行”一词可能具有误导性。在这个玩具示例中,[1,2,3,4,5] 是一个向量,表示序列中的单个点。例如,在处理文本时,这个向量是单个词的词嵌入(例如大小为 300)——也就是说,每个词由 300 个特征表示。在您的情况下,每个点由 5 个特征表示。
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2022-07-17
    • 2018-03-02
    • 2019-11-18
    • 2012-08-14
    • 2011-07-10
    • 2021-06-02
    相关资源
    最近更新 更多