当我本人在使用pytorch框架调用GRU的时候,出现了want 3,get 2的错误,这个错误是因为GRU的输入需要的是三个维数,即:数据量、时间步长、数据特征数量,传统的BPNN网络只需要两个数据即:数据量、数据特征数量,因此传统的BPNN网络可以直接从利用torch.utils.data.DataLoader(dataset=X_train, batch_size=batch_size, shuffle=False)这个语句得到对应的二维数据(数据量、数据特征数量),但是却不适用于GRU,因此GRU需要在开始利用np.loadtxt(open("xxx"), delimiter=",", skiprows=0)的时候使用
X_train = X_train.reshape( X_train.shape[0], 1, X_train.shape[1])语句,这句话的意思是在原有的二维数据中间位置添加时间步长为1的一个维度,使整个数据重组,从原有的二维成为三维。 但是假如我们只使用这一条语句,那么会出现这个报错:
ValueError: Expected target size (128, 10), got torch.Size([128])
在这个报错里由于我设置的batch_size = 128,原有的输出层为10,所以有这个报错,这个报错并非单纯的是输出的错误,这是由于你在输入前使原本的二维数据变成了三维,因此这里需要在GRU隐层输出与全连接层之间添加语句将原有的GRU输出的三维数据变回之前的二维,即我们在这里添加如下的语句:
添加前:
def forward(self, x): # h_n of shape (num_layers * num_directions, batch, hidden_size) # 这里不用显式地传入隐层状态 self.hidden x, self.hidden = self.GRU_layer(x) x = self.output_linear(x) # x = torch.log_softmax(x, dim=1) return x
添加后:
def forward(self, x): # h_n of shape (num_layers * num_directions, batch, hidden_size) # 这里不用显式地传入隐层状态 self.hidden x, self.hidden = self.GRU_layer(x) x = x[:,-1] x = self.output_linear(x) # x = torch.log_softmax(x, dim=1) return x