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
相关产品推荐
相关产品推荐

