我目前正在尝试使用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
,我完全不知道为什么这么做。