You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:27:04