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

PyTorch多模型测试中LogSoftmax与张量维度系列报错求助

问题解决步骤

1. 修复torch.logsoftmax替代后的参数冲突错误

旧版本PyTorch确实没有torch.logsoftmax接口,你选择nn.LogSoftmax替代是对的,但错误写法导致了参数冲突:

  • 错误写法:nn.LogSoftmax(pred1[:, :10], dim=1)(把张量直接传给类的构造函数,和dim参数重复传入)
  • 正确写法分两种:
    • 类实例化后调用:
      log_softmax = nn.LogSoftmax(dim=1)
      log_pred = log_softmax(pred1[:, :10])
      
    • 更推荐的函数式写法(避免类实例化的繁琐):
      import torch.nn.functional as F
      log_pred = F.log_softmax(pred1[:, :10], dim=1)
      

2. 解决sum()参数无效问题

你遇到的sum()报错是因为旧版本PyTorch中,sum方法的参数是keepdim(无下划线),而非keep_dim。把代码里的keep_dim=True改成keepdim=True即可。

3. 修复张量维度不匹配问题

RuntimeError: The size of tensor a (10) must match the size of tensor b (128)是因为模型输出和目标张量的维度/形状不匹配:

  • 假设你的模型输出pred1[:, :10]形状是[128, 10](128是batch size,10是类别数),目标张量应该是一维的[128](每个元素是0-9的类别索引)。
  • 如果目标是one-hot编码格式(形状[128, 10]),需要转换成索引格式:target = torch.argmax(target, dim=1)。
  • 确认pred1[:, :10]的batch size和目标张量的batch size完全一致,避免出现维度错位。

完整可运行示例代码

import torch
import torch.nn as nn
import torch.nn.functional as F

# 模拟模型输出和目标张量
pred1 = torch.randn(128, 20)  # 假设原输出有20类,取前10类
target = torch.randint(0, 10, (128,))  # 目标为128个类别索引

# 用函数式log_softmax处理输出
log_pred = F.log_softmax(pred1[:, :10], dim=1)
# 计算损失(以NLLLoss为例)
loss = F.nll_loss(log_pred, target)

# 如果用类写法
log_softmax_layer = nn.LogSoftmax(dim=1)
log_pred = log_softmax_layer(pred1[:, :10])
loss = F.nll_loss(log_pred, target)

内容的提问来源于stack exchange,提问作者Khawar Islam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:40:25