我正在使用pytorch
创建一个RNN,它的结构如下:
class MyRNN(nn.Module): def __init__(self, batch_size, n_inputs, n_neurons, n_outputs): super(MyRNN, self).__init__() self.n_neurons = n_neurons self.batch_size = batch_size self.n_inputs = n_inputs self.n_outputs = n_outputs self.basic_rnn = nn.RNN(self.n_inputs, self.n_neurons) self.FC = nn.Linear(self.n_neurons, self.n_outputs) def init_hidden(self, ): # (num_layers, batch_size, n_neurons) return torch.zeros(1, self.batch_size, self.n_neurons) def forward(self, X): self.batch_size = X.size(0) self.hidden = self.init_hidden() lstm_out, self.hidden = self.basic_rnn(X, self.hidden) out = self.FC(self.hidden) return out.view(-1, self.n_outputs)
我的输入x
看起来像这样:
tensor([[-1.0173e-04, -1.5003e-04, -1.0218e-04, -7.4541e-05, -2.2869e-05, -7.7171e-02, -4.4630e-03, -5.0750e-05, -1.7911e-04, -2.8082e-04, -9.2992e-06, -1.5608e-05, -3.5471e-05, -4.9127e-05, -3.2883e-01], [-1.1193e-04, -1.6928e-04, -1.0218e-04, -7.4541e-05, -2.2869e-05, -7.7171e-02, -4.4630e-03, -5.0750e-05, -1.7911e-04, -2.8082e-04, -9.2992e-06, -1.5608e-05, -3.5471e-05, -4.9127e-05, -3.2883e-01], ... [-6.9490e-05, -8.9197e-05, -1.0218e-04, -7.4541e-05, -2.2869e-05, -7.7171e-02, -4.4630e-03, -5.0750e-05, -1.7911e-04, -2.8082e-04, -9.2992e-06, -1.5608e-05, -3.5471e-05, -4.9127e-05, -3.2883e-01]], dtype=torch.float64)
这是一个包含64个向量的批次,每个向量的大小为15。
当我尝试通过以下方式测试这个模型时:
BATCH_SIZE = 64N_INPUTS = 15N_NEURONS = 150N_OUTPUTS = 1model = MyRNN(BATCH_SIZE, N_INPUTS, N_NEURONS, N_OUTPUTS)model(x)
我得到了以下错误:
File "/home/tt/anaconda3/envs/venv/lib/python3.6/site-packages/torch/nn/modules/rnn.py", line 126, in check_forward_args expected_input_dim, input.dim()))RuntimeError: input must have 3 dimensions, got 2
我该如何修复它?
回答:
你缺少了RNN层所需的一个维度。
根据文档,你的输入大小需要是(序列长度,批次大小,输入大小)的形状。
所以 – 在上面的例子中,你缺少了其中一个维度。根据你的变量名,看起来你试图传递64个每个包含15个输入的样本…如果这是真的,你缺少的是序列长度。
对于RNN,序列长度是你希望层重复执行的次数。例如,在NLP中,你的序列长度可能等于句子中的单词数量,而批次大小则是你传递的句子数量,输入大小则是每个单词的向量大小。
如果你只是想使用64个大小为15的样本,你可能并不需要使用RNN。