关于使用pytorch实现GRU所遇到的问题记录

当我本人在使用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 

你可能感兴趣的:(pytorch,python,深度学习)