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

将nn.Softmax转换为torch.tensor时遇RuntimeError错误求助

解决nn.Softmax使用错误及正确实现方式

让我来帮你拆解这个问题,你踩了两个PyTorch模块使用的常见小坑:

你的操作问题在哪?

  • nn.Softmax是模块类,不是直接可调用的函数:你得先指定维度参数(比如dim=1,决定在哪个维度上做归一化)实例化它,才能用它处理张量。直接写nn.Softmax(x)是完全错误的——这相当于把张量x传给了Softmax类的构造函数,而不是用它来计算概率。
  • 没必要用torch.tensor()包裹输出:Softmax处理张量后本身返回的就是torch.Tensor类型的概率值,你额外用torch.tensor()去包裹模块实例/类,完全不符合这个函数的使用场景(它是用来创建新张量的),这才触发了“无法推断dtype”的错误。

正确的两种实现方式

方式1:用nn.Softmax模块(适合嵌入神经网络结构)

如果要把Softmax作为模型的固定层,先实例化模块(必须指定dim),再在forward流程中调用:

import torch
import torch.nn as nn

# 实例化Softmax,dim=1表示在类别维度上归一化(比如每个样本的类别概率和为1)
softmax_layer = nn.Softmax(dim=1)

# 模拟模型输出的logits(3个样本,5个类别)
logits = torch.randn(3, 5)

# 计算概率,直接得到torch.Tensor类型结果
probabilities = softmax_layer(logits)
print(type(probabilities))  # 输出:<class 'torch.Tensor'>
print(probabilities.sum(dim=1))  # 验证:每个样本的概率和应为1

方式2:用F.softmax函数(适合临时概率计算)

如果只是临时计算softmax概率,不需要把它作为模型层,用函数式API更轻便:

import torch
import torch.nn.functional as F

logits = torch.randn(3, 5)
probabilities = F.softmax(logits, dim=1)
print(type(probabilities))  # 同样返回torch.Tensor

额外提醒

  • 务必显式指定dim:如果不指定,PyTorch的默认行为可能不符合你的需求(比如默认dim=0会在样本维度归一化,这在分类任务里是错的)。
  • 训练时别瞎加Softmax:如果你的模型最后是线性层,且用nn.CrossEntropyLoss做损失,不需要加Softmax——因为CrossEntropyLoss已经内置了LogSoftmax的计算,额外加会导致数值不稳定,只有在需要输出概率给下游任务时才加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:47:39