RNN层的输入格式

时间:2019-10-19 19:43:49

标签: python pytorch recurrent-neural-network

我目前正在尝试使用PyTorch来实现RNN,以完成基本的学习任务。 以前,我尝试仅使用线性和简单的非线性层来解决同一任务,但效果很好,但现在我对如何在网络中实际使用PyTorch RNN感到困惑。具体来说,我不理解数据必须采用的格式才能将其输入到RNN中。

这是我目前拥有的网

import torch
import torch.nn as nn
import hyperparameters as hyper

class FirstNet(nn.Module):
    def __init__(self):
        super(FirstNet, self).__init__()
        self.hidden_dim = 10
        self.rnn = nn.RNN(hyper.batch_size, self.hidden_dim, 2)
        self.linear = nn.Linear(self.hidden_dim, 1)

    def forward(self, x, h):
        x, h1 = self.rnn(x, h)
        x = self.linear(x)
        return x, h1

现在,如果我尝试通过调用
将一批数据(在这种情况下为一批2x1向量[x,y])馈入该网络, out, h = net(batch, h)
我得到一个
RuntimeError: input.size(-1) must be equal to input_size. Expected 850, got 1,其中850是我当前的批量大小。

documentation指出输入应采用(seq_len, batch, input_size)的形式,在我看来,这应该是(850, data, 2),但显然我在这里必须误解了。
我尝试了不同的方式将输入归为一组,但似乎找不到正确的格式,因此,如果有人可以针对我做错的事情向我指出正确的方向,我将不胜感激。

例如输入:
我无法重现以前收到的错误消息,但为了给出一个示例输入,我尝试将元组(850, batch, 2)馈入网络,其中batch是尺寸为850x2x1的张量,但随后收到了错误消息
AttributeError: 'tuple' object has no attribute 'size'
在我看来,元组的格式不正确(尽管在文档中它是作为元组编写的。)

编辑2:我现在也设法重现了第一个错误:

batch_in = torch.zeros(hyper.batch_size, 1, 2)
seq_ls = []
for i in range(0,len(lbatch)):
    batch_in[i] = lbatch[i]
    seq_ls.append(2)

packed_batch = pack_sequence(batch_in, seq_ls)

我得到RuntimeError: input.size(-1) must be equal to input_size. Expected 850, got 2,我完全不知道为什么这么做。

0 个答案:

没有答案