【Pytorch】torch.nn. Softmax()

在这里插入图片描述

简介

Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
 
ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
 
唯有努力💪
 
本文仅记录自己感兴趣的内容

torch.nn.Softmax()

语法

torch.nn.Softmax(dim=None)

  • dim (int) :计算 Softmax 的维度(因此沿 dim 的每个切片的总和为 1)。

return

  • 一个与输入具有相同维度和形状的张量,其值在 [0, 1] 范围内

作用

将 Softmax 函数应用于 n 维输入张量,重新缩放它们,使 n 维输出张量的元素位于 [0,1] 范围内并且总和为 1

Applies the Softmax function to an n-dimensional input Tensor rescaling them so that the elements of the n-dimensional output Tensor lie in the range [0,1] and sum to 1.

Softmax定义:

在这里插入图片描述

当输入张量是稀疏张量时,未指定的值将被视为 -inf

举例

m = nn.Softmax(dim=0)
input = torch.tensor([[1.,2,3],[4,5,6]])
output = m(input)

print('input : \n', input)
print('output : \n', output)

在这里插入图片描述


m = nn.Softmax(dim=1)
input = torch.tensor([[1.,2,3],[4,5,6]])
output = m(input)

print('input : \n', input)
print('output : \n', output)

在这里插入图片描述

以上的区别在于dim=0 or dim=1

也就是进行softmax运算选择的那一维度

dim=0,第一维,Pytorch是列优先

在这里插入图片描述

dim=1,第二维,按行

在这里插入图片描述

注意:

  • dim = -1 也就是按最后一维
  • 进入softmax需为float类型

参考

  • https://pytorch.org/docs/stable/generated/torch.nn.Softmax.html#torch.nn.Softmax

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述

<think>我们正在讨论torch.nn.Softmax的使用方法。根据引用[3]和[4],我们知道Softmax函数的作用是将一个向量转换成概率分布,使得每个元素的值在0到1之间,且所有元素的和为1。在PyTorch中,有两种方式使用Softmax:一种是使用torch.nn.functional.softmax(即F.softmax),另一种是使用torch.nn.Softmax模块。 根据用户的问题,我们需要详细解释torch.nn.Softmax的用法。torch.nn.Softmax是一个模块,通常在定义神经网络层时使用。它需要指定一个维度(dim),在该维度上应用Softmax函数。 我们来看引用[1]中的示例代码,它使用了F.softmax,但我们可以将其转换为使用torch.nn.Softmax模块的形式。此外,引用[3]也提到了Softmax的基本概念和简单示例。 步骤: 1. 导入必要的库。 2. 创建一个张量。 3. 实例化nn.Softmax对象,并指定维度。 4. 调用该实例对张量进行Softmax转换。 我们将按照不同维度(dim)展示Softmax的效果,并解释每个维度的含义。 注意:在PyTorch中,dim参数指定了沿着哪个维度进行Softmax计算。例如,对于一个二维张量(矩阵): - dim=0:对每一列进行Softmax(即沿着行方向,对同一列的所有行元素进行Softmax) - dim=1:对每一行进行Softmax(即沿着列方向,对同一行的所有列元素进行Softmax) 对于三维张量,维度0、1、2分别代表不同的轴。我们可以通过一个三维张量的例子来展示不同维度的效果。 下面我们使用引用[1]中的三维张量示例,但使用torch.nn.Softmax模块来实现。 示例代码: 创建一个形状为(2,2,3)的三维张量,然后分别在dim=0, dim=1, dim=2(即dim=-1)上应用Softmax。 注意:在三维张量中,我们可以理解为有2个2x3的矩阵。那么: dim=0:沿着第一个维度(即两个矩阵之间)进行Softmax。结果是在每个相同位置(即每个矩阵的对应位置)上,两个矩阵的值进行Softmax。 dim=1:沿着第二个维度(即每个矩阵的行方向)进行Softmax。对每个矩阵的每一列,分别对两行进行Softmax。 dim=2:沿着第三个维度(即每个矩阵的列方向)进行Softmax。对每个矩阵的每一行,分别对三列进行Softmax。 我们将分别展示这三种情况。 另外,引用[5]中提到了在注意力机制中使用了Softmax,但这里我们主要关注基础用法。 下面给出详细的代码示例和解释。</think>### torch.nn.Softmax 用法详解及示例代码 `torch.nn.Softmax` 是 PyTorch 中用于计算 Softmax 函数的模块,它将输入张量转换为概率分布,满足两个关键性质: 1. 每个输出值在 $[0,1]$ 区间内 2. 所有输出值之和为 1 其数学定义为: $$ \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}} $$ #### 参数说明 ```python torch.nn.Softmax(dim=None) ``` - **dim** (int):指定计算 Softmax 的维度,沿此维度求和为 1(必需参数) #### 核心特性 1. **维度敏感**:不同 `dim` 值会导致完全不同的计算结果 2. **概率转换**:输出值表示各类别的概率分布 3. **可微分性**:支持反向传播,适用于神经网络 --- ### 三维张量示例代码 ```python import torch import torch.nn as nn # 创建三维张量 (2x2x3) # 可理解为:2个样本,每个样本是2x3矩阵 tensor = torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [1, 2, 4]]], dtype=torch.float32) # 实例化 Softmax 模块 softmax = nn.Softmax(dim=0) # 沿第0维计算 # 应用 Softmax result = softmax(tensor) print("dim=0 结果:\n", result) ``` #### 不同维度的效果对比 | 维度 | 计算方向 | 适用场景 | |------|----------|----------| | **dim=0** | 跨样本计算 | 批量样本间的概率比较 | | **dim=1** | 行方向计算 | 处理序列数据(如时间步) | | **dim=2** | 列方向计算 | 特征维度概率分布(默认) | ```python # 比较不同维度的输出 print("\ndim=1 结果:\n", nn.Softmax(dim=1)(tensor)) print("\ndim=2 结果:\n", nn.Softmax(dim=2)(tensor)) ``` #### 输出结果解析 对于输入: ``` [[[1,2,3], [4,5,6]], [[7,8,9], [1,2,4]]] ``` 1. **dim=0 输出**(跨样本比较): - 位置(0,0,0):$e^1/(e^1+e^7)≈0.0025$ - 位置(1,0,0):$e^7/(e^1+e^7)≈0.9975$ 2. **dim=1 输出**(行方向): - 样本1第一列:$[e^1/(e^1+e^4), e^4/(e^1+e^4)] ≈ [0.0474, 0.9526]$ 3. **dim=2 输出**(特征方向): - 样本1第一行:$[e^1/Σ, e^2/Σ, e^3/Σ] ≈ [0.0900, 0.2447, 0.6652]$ --- ### 实际应用场景 1. **多分类输出层**(搭配 `nn.CrossEntropyLoss`) ```python model = nn.Sequential( nn.Linear(256, 128), nn.ReLU(), nn.Linear(128, 10), nn.Softmax(dim=1) # 沿特征维度 ) ``` 2. **注意力权重计算** ```python # 模拟注意力得分 (batch_size, seq_len) attention_scores = torch.randn(32, 10) weights = nn.Softmax(dim=-1)(attention_scores) # 沿序列维度 ``` 3. **概率分布可视化** ```python import matplotlib.pyplot as plt probs = nn.Softmax(dim=0)(torch.randn(5)) plt.bar(range(5), probs.detach().numpy()) plt.title('类别概率分布') ``` --- ### 常见问题解答 1. **与 `F.softmax` 的区别?** `torch.nn.Softmax` 是模块(需实例化),`torch.nn.functional.softmax` 是函数。模块形式更适合模型构建[^3]。 2. **为什么需要指定 dim 参数?** Softmax 是维度敏感操作,指定 `dim` 确保沿正确维度求和为1。未指定会导致运行时错误。 3. **数值稳定性如何保证?** PyTorch 内部实现使用: $$ \text{Softmax}(x_i) = \frac{e^{x_i - \max(x)}}{\sum_j e^{x_j - \max(x)}} $$ 避免指数运算溢出[^4]。 4. **何时使用 LogSoftmax?** 当需要计算交叉熵损失时,应使用 `LogSoftmax + NLLLoss` 组合而非 `Softmax + CrossEntropy`,后者在数值计算上更稳定[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海轰Pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值