输入维度错误在pytorch的前向检查

我正在使用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。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注