常用激活函数:Sigmoid/Softmax/ELU/ReLU/LeakyReLU/Tanh...(Pytorch)

article/2025/9/21 18:58:02

激活函数

  • 一、Sigmoid
    • 1.介绍
    • 2.实例
  • 二、Softmax
    • 1.介绍
    • 2.实例
  • 三、ELU:指数线性单元函数
    • 1.介绍
    • 2.实例
  • 四、ReLU:整流线性单元函数
    • 1.介绍
    • 2.实例
  • 五、ReLU6
    • 1.介绍
    • 2.实例
  • 六、LeakyReLU
    • 1.介绍
    • 2.实例
  • 七、Tanh:双曲正切函数
    • 1.介绍
    • 2.实例

一、Sigmoid

1.介绍

1)公式定义及图示
在这里插入图片描述
在这里插入图片描述

该函数输入为任意形状,输出与输入保持一致,此操作是将所有元素映射到(0,1)范围内,推导如下:
在这里插入图片描述

2)调用方式

torch.nn.Sigmoid()

2.实例

sigmoid=nn.Sigmoid()
# 1.标量
# inp=torch.tensor(10,dtype=torch.float32)
# out:tensor(1.0000)# 2.向量
# inp=torch.tensor([10,25,-2,0])
# out: tensor([1.0000, 1.0000, 0.1192, 0.5000])# 3.二维数组
inp=torch.tensor([[10,-2],[25,0]])
# out: tensor([[1.0000, 0.1192],
#         [1.0000, 0.5000]])
out=sigmoid(inp)
print("out:",out)

二、Softmax

1.介绍

1)公式定义
公式理解:分母为输入向量中的所有元素按照指数方式求和,然后将输入中的每个元素按照指数方式除以分母得到计算结果。
在这里插入图片描述
2)调用方式
该函数输入/输出为n维向量,目的是将其输入重新缩放,使其所有元素皆属于[0,1],并且此时所有元素总和为1

torch.nn.Softmax(dim=None)  # 参数dim表示softmax进行计算的维度

2.实例

1)n维向量

# 1.n维向量
softmax=nn.Softmax(dim=0)
inp=torch.tensor([10,20,5,3],dtype=torch.float32)
print("inp:",inp)
out=softmax(inp)
print("out:",out)
total_sum=torch.sum(out)
print("sum:",total_sum)
print(math.exp(inp[0])/torch.sum(torch.exp(inp)))
inp: tensor([10., 20.,  5.,  3.])
out: tensor([4.5398e-05, 9.9995e-01, 3.0589e-07, 4.1397e-08])
sum: tensor(1.)
tensor(4.5398e-05)

2)dim参数验证(详解见:https://blog.csdn.net/qq_43665602/article/details/126576622)

softmax=nn.Softmax(dim=0)
inp=torch.tensor([[1., 4., 8.],[8., 0., 5.]])
print("inp:",inp)
out=softmax(inp)
print("out:",out)
total_sum=torch.sum(out)
print("sum:",total_sum)

dim=0时结果:第0维长度为2,该函数沿着列分为3个切片,分别对三个切片进行计算

inp: tensor([[1., 4., 8.],[8., 0., 5.]])
out: tensor([[9.1105e-04, 9.8201e-01, 9.5257e-01],[9.9909e-01, 1.7986e-02, 4.7426e-02]])
sum: tensor(3.)

dim=1时结果:第1维长度为3,该函数沿着列分为2个切片,分别对两个切片进行计算


inp: tensor([[1., 4., 8.],[8., 0., 5.]])
out: tensor([[8.9468e-04, 1.7970e-02, 9.8114e-01],[9.5227e-01, 3.1945e-04, 4.7411e-02]])
sum: tensor(2.)

三、ELU:指数线性单元函数

1.介绍

1)公式定义及图示
在这里插入图片描述
在这里插入图片描述

2)调用方式
该函数是在元素级别进行操作,既将输入中所有特征元素进行公式中所示操作。该函数输入为任意形状,输出形状与输入保持一致。

torch.nn.ELU(alpha=1.0,  inplace=False)  # 该参数可选,默认为False,若为True则表示输入变量在内存中存储的值被计算结果覆盖

2.实例

1)inplace参数验证

elu=nn.ELU(inplace=False)
inp=torch.tensor(-2.5,dtype=torch.float32).to(device)
print("inp address:",id(inp))  # 查看变量在内存中的位置
out=elu(inp)
print("out address:",id(out))
print(out)  # tensor(-0.9179, device='cuda:0')
print(inp)  # 验证elu运算之后inp变量值是否被覆盖

inplace=False时运行结果:可看到此时输入变量和输出变量在内存中的位置不一样,说明输入变量的值没有被计算结果覆盖。

inp address: 1892728046504
out address: 1892728156304
tensor(-0.9179, device='cuda:0')
tensor(-2.5000, device='cuda:0')

inplace=True时运行结果:可看到此时输入变量和输出变量在内存中的位置一样,说明输入变量的值被计算结果覆盖,此时优点是节省内存,缺点是损失了输入值。

inp address: 1924575957856
out address: 1924575957856
tensor(-0.9179, device='cuda:0')
tensor(-0.9179, device='cuda:0')

2)输入为任意形状

# 1.标量
# inp=torch.tensor(-2.5,dtype=torch.float32).to(device)
# out1=math.exp(-2.5)-1
# print(out1)  # -0.9179150013761012
# tensor(-0.9179, device='cuda:0')# 2.向量/列表
# inp=torch.tensor([10,-2.5])
# tensor([10.0000, -0.9179])# 3.二维数组
inp=torch.tensor([[1,-2.5],[0,10]])
# tensor([[ 1.0000, -0.9179],
#         [ 0.0000, 10.0000]])out=elu(inp)
print(out)

四、ReLU:整流线性单元函数

1.介绍

1)公式定义及图示
公式理解:该激活函数最为常用,以y轴划分,左面恒为0,右面为y=x。
在这里插入图片描述
在这里插入图片描述

2)调用方式

  • 该函数输入为任意形状,输出与输入形状保持一致;
  • 操作在元素级别进行;
  • inplace参数表示是否采用计算结果替换原始输入;
torch.nn.ReLU(inplace=False)

2.实例

relu=nn.ReLU()
# 1.标量
# inp=torch.tensor(2.5)
# out: tensor(2.5000)# 2.向量
# inp=torch.tensor([2.5,0,-10,25])
# out: tensor([ 2.5000,  0.0000,  0.0000, 25.0000])# 3.二维数组
inp=torch.tensor([[2.5,0],[-10,25]])
# out: tensor([[ 2.5000,  0.0000],
#         [ 0.0000, 25.0000]])out=relu(inp)
print("out:",out)

五、ReLU6

1.介绍

1)公式定义及图示
公式理解:以y轴划分,左面恒为0;右面当x<=6时为y=x,此外一直保持y=6。此函数对ReLU函数的上限做了一定的限制,缩小了参数搜索范围。
在这里插入图片描述
在这里插入图片描述

2)调用方式

  • 该函数输入为任意形状,输出与输入形状保持一致;
  • 操作在元素级别进行;
  • inplace参数表示是否采用计算结果替换原始输入;
torch.nn.ReLU6(inplace=False)

2.实例

relu=nn.ReLU6()
# 1.标量
inp=torch.tensor(2.5)
# out: tensor(2.5000)# 2.向量
# inp=torch.tensor([2.5,0,-10,25])
# out: tensor([ 2.5000,  0.0000,  0.0000, 6.0000])# 3.二维数组
inp=torch.tensor([[2.5,0],[-10,25]])
# out: tensor([[ 2.5000,  0.0000],
#         [ 0.0000, 6.0000]])out=relu(inp)
print("out:",out)

六、LeakyReLU

1.介绍

1)公式定义及图示
公式理解:定义中第二种方式更直观,解决了ReLU函数在x<0时恒为0的缺点。
在这里插入图片描述
在这里插入图片描述
2)调用方式

  • 该函数输入为任意形状,输出与输入形状保持一致;
  • 操作在元素级别进行;
  • inplace参数表示是否采用计算结果替换原始输入;
  • negative_slope控制x<0时的斜率;
torch.nn.LeakyReLU(negative_slope=0.01, inplace=False)

2.实例

relu=nn.LeakyReLU()
# 1.标量
# inp=torch.tensor(2.5)
# out: tensor(2.5000)# 2.向量
# inp=torch.tensor([2.5,0,-100,25])
# out: tensor([ 2.5000,  0.0000,  -1.0000, 25.0000])# 3.二维数组
inp=torch.tensor([[2.5,0],[-100,25]])
# out: tensor([[ 2.5000,  0.0000],
#         [ -1.0000, 25.0000]])out=relu(inp)
print("out:",out)

七、Tanh:双曲正切函数

1.介绍

1)公式定义及图示
公式理解:该函数现常用于神经网络最后一层。
在这里插入图片描述
在这里插入图片描述

此操作是将所有元素映射到(-1,1)范围内,推导如下:
在这里插入图片描述
2)调用方式

  • 该函数输入为任意形状,输出与输入形状保持一致;
  • 操作在元素级别进行;
torch.nn.Tanh()

2.实例

tanh=nn.Tanh()
# 1.标量
inp=torch.tensor(2.5)
# out: tensor(0.9866)# 2.向量
# inp=torch.tensor([2.5,0,-10,25])
# out: tensor([ 0.9866,  0.0000, -1.0000,  1.0000])# 3.二维数组
# inp=torch.tensor([[2.5,0],
#                   [-10,25]])
# out: tensor([[ 0.9866,  0.0000],
#         [-1.0000,  1.0000]])out=tanh(inp)
print("out:",out)

http://chatgpt.dhexx.cn/article/OhY8uIQo.shtml

相关文章

【深度学习】论文导读:ELU激活函数的提出(FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS))

论文下载&#xff1a; FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)&#xff08;2016&#xff0c;Djork-Arne Clevert, Thomas Unterthiner & Sepp Hochreiter&#xff09; 一、简介 ELU的表达式&#xff1a; 四种激活函数&#xff0…

ReLU、LReLU、PReLU、CReLU、ELU、SELU

ReLULReLUPReLUCReLUELUSELUReLU tensorflow中:tf.nn.relu(features, name=None) LReLU (Leaky-ReLU) 其中 ai 是固定的。 i 表示不同的通道对应不同的

机器学习中的数学——激活函数(五):ELU函数

分类目录&#xff1a;《机器学习中的数学》总目录 相关文章&#xff1a; 激活函数&#xff1a;基础知识 激活函数&#xff08;一&#xff09;&#xff1a;Sigmoid函数 激活函数&#xff08;二&#xff09;&#xff1a;双曲正切函数&#xff08;Tanh函数&#xff09; 激活函…

npm的安装,卸载以及版本回退

我之前在电脑上安装了Node.js V15.12.0这个版本&#xff0c;它对应的npm版本为 7.6.3 后来因为npm install --registryhttps://registry.npm.taobao.org总是报错。 度娘说npm7.x的版本比npm6.x更严格。 因此我回退npm版本到6.X。 于是我重装了node V13.10.1&#xff0c;但是…

Linux安装与卸载nodejs/卸载npm

编译mediasoup, 需要先安装nodejs npm。但是我一不小心&#xff0c;安装了最新的14.x版本。结果老出问题&#xff1a; npm ERR! cb() never called!npm ERR! This is an error with npm itself. Please report this error at: npm ERR! <https://npm.community>npm …

npm 卸载及安装流程

1.卸载 1.将node的安装目录nodejs文件夹清空 2.查找.npmrc文件删除&#xff08;在用户文件夹下&#xff09; 2.安装 1.到node官网下载安装包 2.傻瓜式安装 3.完成后 node -v npm -v 查看是否安装成功&#xff0c;此时npm 并不是最新版 4.配置npm的全局模块的存放路径以及cac…

Node.js的卸载

Node.js的卸载 在控制面板-程序-程序和功能中卸载卸载后 到文件夹中进行进一步的删除检查环境变量中Path中有没有最后 重启一下 结束[随手记账单小程序 期待大家的反馈](https://mp.weixin.qq.com/s/RaFSpVov33bZDUn-aSXa1w) 在控制面板-程序-程序和功能中卸载 确保node.js没有…

npm的卸载与安装流程

安装&#xff08;npm 和node是一起的&#xff0c;安装成功node后就会自带npm&#xff09; 1、下载地址为&#xff1a;https://nodejs.org/en/ 2、检查是否安装成功&#xff1a;如果输出版本号&#xff0c;说明我们安装node环境成功 3、为了提高我们的效率&#xff0c;可以使用…

npm依赖、命令

NPM 的全称是 Node Package Manager&#xff0c;是随同 NodeJS 一起安装的包管理和分发工具&#xff0c;它可以很方便的让前端开发者下载、安装、上传以及管理已经安装的包。 1. npm 安装配置&#xff08;可选&#xff09; 现在安装的新版本的nodejs可以直接使用默认配置的即可…

npm——安装、卸载与更新

npm 官方文档&#xff1a;https://docs.npmjs.com/ 什么是npm npm&#xff08;“Node 包管理器”&#xff09;是 JavaScript 运行时 Node.js 的默认程序包管理器。 它也被称为“Ninja Pumpkin Mutants”&#xff0c;“Nonprofit Pizza Makers”&#xff0c;以及许多其他随机…

静态局部变量 普通全局变量 静态全局变量

1 计算机内部存储方面&#xff0c;在编译时&#xff0c;编译器会给它们分配地址&#xff0c;地址不会被回收。 2 静态局部变量 a 作用域是在于同局部变量。 b&#xff0c;地址不会回收&#xff0c;但是赋值同普通变量一样。 注意&#xff1a; 1 编译器在静态存储区内给静…

c语言局部变量 静态局部变量 全局变量与静态全局变量

基本概念&#xff1a; 作用域&#xff1a;起作用的区域&#xff0c;也就是可以工作的范围。 代码块&#xff1a;所谓代码块&#xff0c;就是用{}括起来的一段代码。 数据段&#xff1a;数据段存的是数&#xff0c;像全局变量就是存在数据段的 代码段&#xff1a;存的是程序代码…

什么是全局变量,局部变量,静态全局变量,静态局部变量

来源&#xff1a;公众号【编程珠玑】 作者&#xff1a;守望先生 前言 这些是编程语言中的基本概念&#xff0c;如果你还不是非常明确地清楚标题的问题&#xff0c;并且不知道作用域&#xff0c;链接属性&#xff0c;存储期等概念的具体含义&#xff0c;那么本文你不该错过。为了…

静态局部变量初始化

mask一下一直以来的一个误区 #include <stdio.h>void key(void) {static unsigned char key_up 1;printf("key_up %d \n", key_up);key_up 0;printf("key_up %d \n", key_up); }int main(void) {key();key();return 0; }原以为会每次调子函数时&…

C语言全局变量,局部变量,静态局部变量的区分

1.如果没有给全局变量和静态局部变量进行初始化赋值&#xff0c;全局变量与静态局部变量一样&#xff0c;默认值为数字0&#xff08;ASCII码为48&#xff09;&#xff1b; 2.非静态的局部变量没有初始化时&#xff0c;该变量的值是一个随机数&#xff0c;必须要赋值后才可以安…

C++中的静态局部变量

1 静态局部变量在静态存储区内分配存储单元。在程序运行期间都不释放。 2 对静态局部变量是在编译时赋初值的&#xff0c;即只赋值一次&#xff0c;在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上一次函数调用结束时的值。 3 静态局部变量&#x…

利用静态局部变量求阶乘

可以利用静态局部变量在在内存中不自动释放的特性&#xff0c;去计算阶乘&#xff0c;详细代码如下: #include <iostream> using namespace std;long CalcResult(int num) {static int result 1;result num*result;return result; }int main() {//采用静态局部变量计算…

C语言:静态局部变量(static局部变量)

题目概述&#xff1a; 考察静态局部变量的值。 编程&#xff1a; #include<stdio.h> int main() { int f(int);//函数声明 int a2,i;//自动局部变量 for(i0;i<3;i) printf("%d\n",f(a)); return 0; } int f(int a) { auto int b0;//自动局部变量 static int…

C中静态局部变量与局部变量的区别

#include<stdio.h> #include<stdlib.h> void fun() { int a 12;//局部变量 static int b 22;//静态局部变量 a; b; printf("a:%d,b:%d\n",a,b); } int main(void) { fun(); fun(); fun(); system("pause&quo…

静态局部变量和静态全程变量static。

1. 什么是static? static 是 C/C 中很常用的修饰符&#xff0c;它被用来控制变量的存储方式和可见性。 1.1 static 的引入 我们知道在函数内部定义的变量&#xff0c;当程序执行到它的定义处时&#xff0c;编译器为它在栈上分配空间&#xff0c;函数在栈上分配的空间在此函…