神经网络的核心:帮助新手理解 PyTorch 非线性激活函数

news2024/11/26 8:22:54

目录

torch.nn子函数非线性激活详解

nn.Softmin

Softmin 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.Softmax

Softmax 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.Softmax2d

Softmax2d 函数简介

函数工作原理

输入和输出形状

使用技巧与注意事项

示例代码

nn.LogSoftmax

LogSoftmax 函数简介

函数工作原理

参数详解

使用技巧与注意事项

示例代码

nn.AdaptiveLogSoftmaxWithLoss

AdaptiveLogSoftmaxWithLoss 函数简介

函数工作原理

参数和返回类型

使用技巧与注意事项

示例代码

总结


torch.nn子函数非线性激活详解

nn.Softmin

Softmin 函数简介

  • 用途Softmin 函数是一个用于机器学习中的归一化技术。它通常应用于多类别分类问题中,用于将输入张量(Tensor)转换成概率分布形式。这个分布的特点是数值范围在 [0, 1] 之间,并且所有元素之和为 1。

函数工作原理

  • 定义Softmin 通过对每个元素应用指数函数,然后进行归一化,来创建一个与原始张量相同形状的输出张量。归一化是通过将每个元素的指数与所有元素的指数之和进行除法来实现的。
  • 数学表达式:给定一个元素x_{i}_{}Softmin(x_i) 计算为\frac{exp(-x_{i})}{\sum_{j}exp(-x_{j})}

参数详解

  • dim 参数:这是一个整数,用于指定应用 Softmin 的维度。此参数确保在指定维度上的所有切片(slice)的和为 1。

使用技巧与注意事项

  • 选择合适的维度:选择 dim 参数时要仔细考虑,这取决于你的数据结构和你想要的输出。例如,在处理二维数据时,如果你希望每行的输出之和为 1,则 dim 应该设置为 1。
  • 输入数据:确保输入数据适合 Softmin 处理。由于 Softmin 是指数运算,所以对于具有非常大或非常小值的输入数据,可能会产生数值不稳定的问题。

示例代码

下面是一个使用 Softmin 的示例代码:

import torch
import torch.nn as nn

# 初始化 Softmin 层
m = nn.Softmin(dim=1)

# 创建一个随机输入张量
input_tensor = torch.randn(2, 3)

# 应用 Softmin
output = m(input_tensor)

print("Input Tensor:", input_tensor)
print("Softmin Output:", output)

这段代码首先导入了必要的 PyTorch 组件,然后创建了一个 Softmin 层,指定了操作的维度。之后,它创建了一个随机的输入张量,并应用 Softmin,最后打印了输入和输出张量。

nn.Softmax

Softmax 函数简介

  • 用途Softmax 是神经网络中常用的激活函数,主要用于多类别分类问题。它将一个 n 维输入张量转换成一个概率分布,其中每个元素的值都在 [0,1] 范围内,且所有元素的和为 1。

函数工作原理

  • 定义Softmax 将每个元素的自然指数(exp)与所有元素自然指数之和的比值作为输出。对于输入张量中的每个元素x_{i}Softmax(x_i) 计算为\frac{exp(x_{i})}{\sum_{j}exp(x_{j})}
  • 稀疏张量:当输入张量是稀疏的时候,未指定的值被视为负无穷(-inf)。

参数详解

  • dim 参数:这是一个整数,用于指定 Softmax 应用的维度。在这个维度上的每个切片(slice)将会被转换成概率分布,其和为 1。

使用技巧与注意事项

  • 选择维度:在使用 Softmax 时,正确选择 dim 参数非常重要。它取决于您的数据结构和期望的输出方式。例如,在处理二维数据(比如批量数据)时,通常将 dim 设置为 1,这样每行的输出之和为 1。
  • 与 NLLLoss 的兼容性:请注意,Softmax 不直接与 NLLLoss(负对数似然损失)一起使用。如果您需要将这两者结合使用,请使用 LogSoftmax,因为它计算速度更快,且数值属性更佳。

示例代码

下面是一个 Softmax 的使用示例:

import torch
import torch.nn as nn

# 创建 Softmax 层
m = nn.Softmax(dim=1)

# 创建输入张量
input_tensor = torch.randn(2, 3)

# 应用 Softmax
output = m(input_tensor)

print("Input Tensor:", input_tensor)
print("Softmax Output:", output)

此代码首先导入了必要的 PyTorch 库,然后创建了一个 Softmax 层,并指定了操作的维度。接着,它生成了一个随机的输入张量,并应用了 Softmax。最后,它打印出输入张量和经过 Softmax 处理后的输出张量。

nn.Softmax2d

Softmax2d 函数简介

  • 用途Softmax2d 主要用于对图像数据进行操作,适用于处理多通道图像数据。在图像处理的上下文中,它可以用于分类每个像素点所属的类别。

函数工作原理

  • 定义Softmax2d 对每个空间位置(即图像的每个像素点)上的特征应用 Softmax 函数。对于具有通道(C)、高度(H)和宽度(W)的图像,它会在每个位置 (C, h_i, w_j) 应用 Softmax

输入和输出形状

  • 输入形状:可接受两种形状的输入 - (N, C, H, W) 和 (C, H, W),其中 N 是批量大小,C 是通道数,H 是高度,W 是宽度。
  • 输出形状:输出张量与输入张量具有相同的维度和形状,值在 [0, 1] 范围内。

使用技巧与注意事项

  • 通道维度上的 SoftmaxSoftmax2d 是在通道维度(C)上进行操作的,这意味着对于每个像素位置,通道维度上的值将被转换成概率分布。
  • 图像处理中的应用:在进行图像分割或像素级分类时,Softmax2d 尤其有用,因为它允许模型为每个像素位置分配概率。

示例代码

下面是一个使用 Softmax2d 的示例:

import torch
import torch.nn as nn

# 创建 Softmax2d 层
m = nn.Softmax2d()

# 创建一个随机的图像张量,格式为 [批量大小, 通道数, 高度, 宽度]
input_tensor = torch.randn(2, 3, 12, 13)

# 应用 Softmax2d
output = m(input_tensor)

print("Input Tensor Shape:", input_tensor.shape)
print("Softmax2d Output Shape:", output.shape)

 这段代码展示了如何初始化 Softmax2d 层,并对一个随机生成的图像张量应用该层。输入和输出张量的形状是相同的,保证了每个像素位置的通道值被转换成概率分布。

nn.LogSoftmax

LogSoftmax 函数简介

  • 用途LogSoftmax 是在神经网络中常用的激活函数,特别是在多类别分类问题中。它是 Softmax 函数的对数版本,常用于提高数值稳定性并与某些类型的损失函数(如负对数似然损失)一起使用。

函数工作原理

  • 定义LogSoftmax 实质上是 Softmax 后应用自然对数。对于输入张量中的每个元素 x_{j}LogSoftmax(x_i) 计算为log(\frac{exp(x_{i})}{\sum_{j}^{exp(x_{j})}})
  • 输出范围:输出的值范围是 [−∞,0),这是因为对数函数的输出范围。

参数详解

  • dim 参数:这是一个整数,用于指定计算 LogSoftmax 的维度。在这个维度上的每个切片(slice)将会被转换成对数概率分布。

使用技巧与注意事项

  • 配合损失函数使用LogSoftmax 通常与负对数似然损失(NLLLoss)结合使用,在计算多类别分类问题的损失时尤其有效。
  • 数值稳定性:由于直接对 Softmax 的结果取对数可能导致数值不稳定,因此 LogSoftmax 提供了一种更稳定的计算方法。

示例代码

下面是一个 LogSoftmax 的使用示例:

import torch
import torch.nn as nn

# 创建 LogSoftmax 层
m = nn.LogSoftmax(dim=1)

# 创建输入张量
input_tensor = torch.randn(2, 3)

# 应用 LogSoftmax
output = m(input_tensor)

print("Input Tensor:", input_tensor)
print("LogSoftmax Output:", output)

这段代码首先导入了必要的 PyTorch 组件,然后创建了一个 LogSoftmax 层,并指定了操作的维度。接着,它创建了一个随机的输入张量,并应用了 LogSoftmax。最后,它打印出输入张量和经过 LogSoftmax 处理后的输出张量。

nn.AdaptiveLogSoftmaxWithLoss

AdaptiveLogSoftmaxWithLoss 函数简介

  • 用途:这个函数是为了高效地处理具有大量输出类别的模型,特别适用于标签分布高度不平衡的情况,如自然语言处理中的单词频率分布。

函数工作原理

  • 高效的 softmax 近似:它通过将标签分配到不同的簇(clusters)来实现高效计算。每个簇可能包含不同数量的目标,频率较低的标签被分配较低维的嵌入,从而加速计算。
  • 自适应性:根据每个 minibatch 中出现的目标,仅计算相关簇。这意味着常访问的簇(如包含频繁标签的簇)的计算成本较低。

参数和返回类型

  • 参数
    • in_features(int):输入张量中的特征数。
    • n_classes(int):数据集中的类别数。
    • cutoffs(Sequence):用于将目标分配到它们的桶中的截断值。
    • div_value(float, 可选):用作指数来计算簇的大小,默认值为 4.0。
    • head_bias(bool, 可选):如果设为 True,在自适应 softmax 的头部添加偏差项,默认为 False。
  • 返回类型:返回一个命名元组,包含输出和损失字段。

使用技巧与注意事项

  • 标签排序:传入此模块的标签应根据其频率进行排序。最频繁的标签应该用索引 0 表示,最不频繁的标签用索引 n_classes - 1 表示。
  • 选择适当的截断值:合理设置 cutoffs 对于实现高效计算至关重要。

示例代码

这里是一个使用 AdaptiveLogSoftmaxWithLoss 的示例:

import torch
import torch.nn as nn

# 参数设置
in_features = 10
n_classes = 1000
cutoffs = [10, 100, 1000]

# 创建 AdaptiveLogSoftmaxWithLoss 层
m = nn.AdaptiveLogSoftmaxWithLoss(in_features, n_classes, cutoffs)

# 创建输入和目标张量
input_tensor = torch.randn(2, in_features)
targets = torch.randint(0, n_classes, (2,))

# 应用 AdaptiveLogSoftmaxWithLoss
output = m(input_tensor, targets)

print("Output:", output)

 在这个示例中,首先导入了必要的 PyTorch 库,并设置了输入特征数、类别数和截断值。然后创建了 AdaptiveLogSoftmaxWithLoss 层,并生成了输入张量和目标张量。接下来应用这个层,并打印输出结果。

总结

在这篇博客中,我们深入探讨了 PyTorch 中几种关键的非线性激活函数及其在神经网络中的应用。从基本的 SoftminSoftmax 到更高级的 Softmax2dLogSoftmax,我们了解了它们的工作原理、使用场景以及编码示例。我们还讨论了 AdaptiveLogSoftmaxWithLoss,一种为处理大型输出空间而设计的高效激活函数。每个函数都配备了详细的参数解释、使用技巧和注意事项,旨在为读者提供全面的理解。无论是图像处理、文本分类还是复杂的自然语言处理任务,这些函数都是构建高效、稳定的神经网络模型的重要工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1357634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谈谈我眼中的用户分层分析!

大家好,我是阿粥。 用户分层是几乎所有品牌都会思考的一个重要命题。 合理的分层能够帮助品牌有效提升用户的忠诚度。 这篇文章,我会带大家熟悉用户分层的基本概念、价值以及分层分析的思路。内容略干,在看的时候可以喝两口水。 同样&#xf…

新国大张阳教授团队开发精度远超AlphaFold的AI蛋白质互作结构预测算法

蛋白质是一类由20种不同氨基酸组成的大分子有机化合物,它们是生命体内各种生物活动的最主要的执行者。蛋白质的绝大多数生物学功能都是通过与其它蛋白质的相互作用来实现。因此,蛋白质-蛋白质相互作用(简称‘蛋白质互作’)在生命功…

C# OpenCvSharp DNN FreeYOLO 密集行人检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 密集行人检测 效果 模型信息 Inputs ------------------------- name:input tensor:Float[1, 3, 192, 320] --------------------------------------------------------------- …

在 Linux 中开启 Flask 项目持续运行

在 Linux 中开启 Flask 项目持续运行 在部署 Flask 项目时,情况往往并不是那么理想。默认情况下,关闭 SSH 终端后,Flask 服务就停止了。这时,您需要找到一种方法在 Linux 服务器上实现持续运行 Flask 项目,并在服务器…

<HarmonyOS主题课>1~3课后习题汇总

<HarmonyOS第一课>1~10课后习题汇总 1使用DevEco Studio高效开发 单选题 用哪一种装饰器修饰的组件可作为页面入口组件?(B) A. ComponentB. EntryC. PreviewD. Builder ArkTS Stage模型支持API Version 9&#xf…

JSP页面访问JDBC数据库的六个步骤

【例】创建exgample11_1.jsp页面&#xff0c;并在该页面中使用纯Java数据库驱动程序连接数据库test&#xff0c;并查询数据表goods中的数据。 <% page language"java" contentType"text/html;charsetUTF-8" pageEncoding"UTF-8"%> <% …

JVM工作原理与实战(六):类的生命周期-连接阶段

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类的生命周期 1.加载&#xff08;Loading&#xff09; 2.连接&#xff08;Linking&#xff09; 3.初始化&#xff08;Initialization&#xff09; 4.使用&#xff08;Using&…

Linux学习(11)——进程的基本概念

目录 一、程序 1、什么是程序&#xff1f; 二、进程 1、什么是进程&#xff1f; 2、进程具有的特征 2.2进程&#xff0c;线程&#xff0c;协程 2.2.1 进程和线程的区别 2.2.2如何查看一个程序是多线程还是单线程 3、进程使用内存的问题 ①内存泄漏&#xff1a;Memory L…

航天航空线束工艺3D虚拟展馆支持多人异地参观漫游

为了满足汽车线束企业员工工作需要&#xff0c;让新老员工了解到更先进、规范的线束工艺设计技术&#xff0c;华锐视点基于VR虚拟仿真、web3d开发和图形图像技术制作了一款汽车线束工艺设计VR虚拟仿真模拟展示系统。 汽车线束工艺设计VR虚拟仿真模拟展示系统共分为pc电脑端和VR…

swing快速入门(三十八)进度条

&#x1f427;注释很详细&#xff0c;直接上代码 &#x1f414;新增内容 &#x1f95a;1.进度条的创建&#xff08;水平or垂直&#xff09; &#x1f95a;2.使用多线程模拟耗时操作以免阻塞主线程 &#x1f95a;3.进度条属性设置 &#x1f95a;4.复选框状态改变监听器 &am…

js object 去重

测试&#xff1a;数据 let arr [ { a: 1, b: 2 }, { b: 3, a: 4 }, { b: 2, a: 1 } ] 结果 function unique(arr) {const newArr [...arr]for (let i 0; i < newArr.length; i) {for (let j i 1; j < newArr.length; j) {if (this.duibi(newArr[i], newArr[j])) {ne…

【深度学习】各领域常用的损失函数汇总(2024最新版)

目录 1、L1 损失、平均绝对误差&#xff08;L1 Loss、Mean Absolute Error&#xff0c;MAE&#xff09; 2、L2 损失、均方误差&#xff08;L2 Loss、Mean Squared Error&#xff0c;MSE&#xff09; 3、交叉熵损失&#xff08;Cross-Entropy Loss&#xff09; 4、混合损失&…

【React系列】Redux(三) state如何管理

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. reducer拆分 1.1. reducer代码拆分 我们来看一下目前我们的reducer&#xff1a; function reducer(state ini…

【Spring实战】21 Spring Data REST 常用功能详细介绍

文章目录 1. 资源导出&#xff08;Resource Exporting&#xff09;2. 查询方法&#xff08;Query Methods&#xff09;3. 分页和排序&#xff08;Pagination and Sorting&#xff09;4. 关联关系&#xff08;Associations&#xff09;5. 事件&#xff08;Events&#xff09;6. …

【Go】excelize库实现excel导入导出封装(二),基于map、多个sheet、多级表头、树形结构表头导出,横向、纵向合并单元格导出

前言 大家好&#xff0c;这里是符华~ 之前写了一篇 go excelize库封装导入导出 的博客&#xff0c;然后那篇博客还挖了个坑&#xff0c;结果这个坑差点就填不上了&#x1f923;还好经过我的不懈努力&#xff0c;总算是把坑给填上了。。。 挖坑 上一篇文章中&#xff0c;我们…

使用fabric.js实现对图片涂鸦、文字编辑、平移缩放与保存功能

文章目录 背景1.初始化画布1.创建画布2.设置画布大小 2.渲染图片3.功能&#xff1a;开启涂鸦4.功能&#xff1a;添加文字5.旋转图片6.画布平移7.画布缩放8.保存图片9.上传图片10.销毁实例11.总结 背景 项目中有个需求&#xff0c;需要对图片附件进行简单的编辑操作&#xff0c…

网络故障问题一般性检查排查思路

一、基本连通性检查 在网络中ping是一个十分强大的TCP/IP工具。它可以用来检测网络的连通情况和分析网络速度、也可以ping网址根据域名得到服务器IP、同时我们根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。 ping 网址&#xff0c;有几种输出情况&a…

【OpenCV】在MacOS上使用OpenCvSharp

前言 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;它具有C&#xff0c;Python&#xff0c;Java和MATLAB接口&#xff0c;并支持Windows&#xff0c;Linux&#xff0c;Android和Mac OS。OpenCvSharp是一个Op…

Flume基础知识(七):Flume 事务与 Flume Agent 内部原理

1. Flume 事务详解 2. Flume Agent 内部原理 重要组件&#xff1a; 1&#xff09;ChannelSelector ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。其共有两种类型&#xff0c; 分别是 Replicating&#xff08;复制&#xff09;和 Multiplexing&#xff08;多…

如何计算非线性负载的功率需求?

非线性负载的功率需求计算是一个相对复杂的过程&#xff0c;因为非线性负载的电流和电压之间的关系不是简单的正比关系。在计算非线性负载的功率需求时&#xff0c;需要考虑负载的特性、工作状态以及电源电压等因素。 确定负载的类型&#xff1a;首先需要了解负载的具体类型&am…