PyTorch GRU分类任务训练时维度不匹配错误如何解决?
代码问题分析与修复
直接报错原因
损失计算的输入和标签维度不匹配:模型输出形状为[1, 64, 1],标签形状为[64],二者形状不统一导致BCE损失计算失败。
具体问题点&修复方案
1. 模型forward返回值维度处理错误
PyTorch的GRU返回的隐藏状态tensor形状固定为 [num_layers * 方向数, batch_size, hidden_dim],你直接将这个三维张量传入全连接层,得到的输出多了两个冗余维度,和标签形状不匹配。
修复:修改forward方法的返回逻辑,同时补上你定义了但未使用的dropout层:
def forward(self, text, text_lengths, hidden = None): embedded = self.embedding(text) packed_embedded = nn.utils.rnn.pack_padded_sequence(embedded, text_lengths) output, hidden = self.rnn(packed_embedded, hidden) # 取出最后一层的隐藏状态,形状变为 [batch_size, hidden_dim] last_hidden = hidden[-1, :, :] # 过dropout和全连接层,输出形状 [batch_size, 1] fc_out = self.fc(self.dropout(last_hidden)) # 挤压掉最后一维,输出形状 [batch_size] 与标签对齐 return fc_out.squeeze(1)
2. GRU层初始化参数缺失
你定义的n_layers、dropout、bidirectional超参数没有传入GRU层,导致配置不生效,默认使用1层、无dropout的单向GRU。
修复:修改GRU初始化代码:
self.rnn = nn.GRU( input_size=embedding_dim, hidden_size=hidden_dim, num_layers=n_layers, bidirectional=bidirectional, dropout=dropout if n_layers > 1 else 0 )
3. 损失计算逻辑错误
训练和验证阶段你直接将单步损失赋值给总损失变量,不是累加,导致最终epoch平均损失计算完全错误,同时验证阶段没有关闭梯度计算,会额外占用显存。
修复:
- 训练阶段修改单步损失计算逻辑:
opt.zero_grad() input = text.to(device) labels = label.to(device) output = model(input, txt_len.type(torch.int64).cpu()) loss = loss_func(output, labels) train_loss += loss.item() loss.backward() opt.step()
- 验证阶段修改单步损失计算逻辑:
input = text.to(device) labels = label.to(device) with torch.no_grad(): output = model(input, txt_len.type(torch.int64).cpu()) loss = loss_func(output, labels) val_loss += loss.item()
内容的提问来源于stack exchange,提问作者ALiCe P.
相关产品推荐
相关产品推荐

