【Python--torch(激活函数说明+代码讲解)】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)

news2024/11/18 16:49:55

【Python–torch】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)

文章目录

  • 【Python--torch】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)
    • 1. 介绍
    • 2. 常用激活函数说明
      • 2.1 Sigmoid
        • 2.1.1 公式
        • 2.1.2 图像
        • 2.1.3 代码解读
      • 2.2 Softmax
        • 2.2.1 公式
        • 2.2.2 代码解读
      • 2.3 ELU
        • 2.3.1 公式
        • 2.3.2 图像
        • 2.3.3 代码解读
      • 2.4 ReLU
        • 2.4.1 公式
        • 2.4.2 图像
        • 2.4.3 代码解读
      • 2.5 ReLU6
        • 2.5.1 公式
        • 2.5.2 图像
        • 2.5.3 代码解读
      • 2.6 LeakyReLU
        • 2.6.1 公式
        • 2.6.2 图像
        • 2.6.3 代码解读
      • 2.7 Tanh
        • 2.7.1 公式
        • 2.7.2 图像
        • 2.7.3 代码解读
    • 3. 总结

1. 介绍

激活函数(activation function)的作用是去线性化,神经网络节点的计算就是加权求和,再加上偏置项:
1
这是一个线性模型,将这个计算结果传到下一个节点还是同样的线性模型。只通过线性变换,所有的隐含层的节点就无存在的意义。原因如下:假设每一层的权值矩阵用 W ( i ) W^{(i)} W(i) 表示,那么存在一个 W ′ W' W 使得:
2
那么,n层隐含层就可以全部变成一个隐含层,隐含层的数量就没有任何意义。所以使用激活函数将其去线性化。这样可以使 W ′ = W ( 1 ) W ( 2 ) . . . W ( n ) W'=W^{(1)}W^{(2)}...W^{(n)} W=W(1)W(2)...W(n) 不再成立,每层隐含层都有其存在的意义。

2. 常用激活函数说明

2.1 Sigmoid

2.1.1 公式

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

2.1.2 图像

在这里插入图片描述

2.1.3 代码解读

三种用法:

1. torch.tanh(Tensor)
2. F.tanh(Tensor)
3. tanh = torch.nn.Tanh(); tanh(Tensor) # 先定义类,再调用
>>> import torch
>>> import torch.nn.functional as F

>>> inp=torch.tensor(10,dtype=torch.float32) # 标量、向量(一维)、多维tensor均可

# 第一种用法
>>> torch.sigmoid(inp)
tensor(1.0000)

# 第二种用法,目前已经被丢弃
>>> F.sigmoid(inp)
UserWarning: nn.functional.sigmoid is deprecated. Use torch.sigmoid instead. warnings.warn("nn.functional.sigmoid is deprecated. Use torch.sigmoid instead.")
tensor(1.0000)

# 第三种用法
>>> torch.nn.Sigmoid(inp)	# 报错
TypeError: __init__() takes 1 positional argument but 2 were given
# 这种情况下,需要先对类实例化,也就是这样:
>>> sigmoid = torch.nn.Sigmoid()
>>> sigmoid(inp)
tensor(1.0000)

2.2 Softmax

2.2.1 公式

  • 中文名:归一化指数函数;
  • 外文名:Normalized exponential function;
  • 别 名:Softmax函数
  • 领 域:人工智能
  • 定 义:使每一个元素的范围在(0,1)之间
  • 应 用:多分类问题
    在这里插入图片描述

2.2.2 代码解读

>>> import torch
>>> import torch.nn.functional as F

>>> inp=torch.tensor([10,20,5,3],dtype=torch.float32) # 向量(一维)、多维tensor均可

# 第一种用法
>>> torch.softmax(inp, dim = 0) # 须指明dim(维度)
tensor([4.5398e-05, 9.9995e-01, 3.0589e-07, 4.1397e-08])

# 第二种用法
>>> F.sigmoid(inp, dim = 0)
tensor([4.5398e-05, 9.9995e-01, 3.0589e-07, 4.1397e-08])

# 第三种用法,跟sigmoid类似
>>> softmax = torch.nn.Softmax(dim = 0) # 默认维度dim为0,也可以传其他维度
>>> softmax(inp)
tensor([4.5398e-05, 9.9995e-01, 3.0589e-07, 4.1397e-08])
softmax0 = torch.nn.Softmax(dim=0)
softmax1 = torch.nn.Softmax(dim=1)
inp = torch.tensor([[1., 4., 8.],
                  [8., 0., 5.]])
print("inp:",inp)
out0 = softmax0(inp)
print("out:",out0)
total_sum0 = torch.sum(out0)
print("sum:",total_sum0)

# print-------------------
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.)

print("inp:",inp)
out1 = softmax1(inp)
print("out:",out1)
total_sum1 = torch.sum(out1)
print("sum:",total_sum1)

# print------------------
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.)

2.3 ELU

  • 指数线性单元函数:该函数是在元素级别进行操作,既将输入中所有特征元素进行公式中所示操作。
  • 该函数输入为任意形状,输出形状与输入保持一致。

2.3.1 公式

在这里插入图片描述

2.3.2 图像

a

2.3.3 代码解读

1. F.elu(Tensor, alpha=1.0, inplace=False)	# 直接调用

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

1)使用方法

import torch.nn.functional as F
import torch

# 第一种用法
elu = torch.nn.ELU() # 先定义类
elu(Tensor) # 再调用

# 第二种用法
F.elu(Tensor, alpha=1.0, inplace=False)

# 1.标量
inp=torch.tensor(-2.5,dtype=torch.float32)
# 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]])

2)inplace参数验证

import torch
import torch.nn as nn

inp=torch.tensor(-2.5,dtype=torch.float32).to(device)

elu=nn.ELU(inplace=False)

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变量值是否被覆盖

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

elu=nn.ELU(inplace=True)
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变量值是否被覆盖

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

2.4 ReLU

  • 整流线性单元函数。该激活函数最为常用,以y轴划分,左面恒为0,右面为y=x。
  • 其输入为任意形状,输出与输入形状保持一致;操作在元素级别进行;
    inplace参数表示是否采用计算结果替换原始输入;

2.4.1 公式

在这里插入图片描述

2.4.2 图像

在这里插入图片描述

2.4.3 代码解读

两种用法同ELU,这里只介绍其中一种。

import torch.nn.functional as F
import torch

# 两种用法同ELU,这里只介绍其中一种
relu=torch.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)

2.5 ReLU6

  • ReLU6 就是普通的 ReLU 但是限制最大输出为 6,这是为了在移动端设备 float16/int8 的低精度的时候也能 有很好的数值分辨率。如果对 ReLU 的激活范围不加限制,输出范围为 0 到正无穷,如果激 活值非常大,分布在一个很大的范围内,则低精度的 float16/int8 无法很好地精确描述如此大范围的数值,带来精度损失。在 MobileNet 中使用 ReLU6。
  • 解释:y轴划分,左面恒为0;右面当x<=6时为y=x,此外一直保持y=6。此函数对ReLU函数的上限做了一定的限制,缩小了参数搜索范围。
  • 其输入为任意形状,输出与输入形状保持一致;操作在元素级别进行;inplace参数表示是否采用计算结果替换原始输入;

2.5.1 公式

f ( x ) = m i n ( m a x ( 0 , x ) , 6 ) f(x) = min(max(0, x), 6) f(x)=min(max(0,x),6)

2.5.2 图像

b

2.5.3 代码解读

用法,同ELU和ReLU。

import torch
relu=torch.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)

2.6 LeakyReLU

  • LeakyReLU函数是一种新的神经网络单元激活函数,它的出现改变了深度神经网络的运行方式。Leaky ReLU函数是一个非线性函数,用于增加模型的表现力,并使网络nerual更好地拟合数据。
  • 因为Leaky ReLU函数允许负数值通过,这使得动态范围变得更宽,这将有助于解决许多深度学习问题,如梯度消失的问题。梯度消失是一种情况,当神经网络的某些层变得比其他层更深,梯度开始变得很小,而神经元几乎不更新,这会影响模型的性能。使用Leaky ReLU函数可以解决梯度消失的问题,因为它能够保证层之间的更新效果。
  • Leaky ReLU函数是标准ReLU函数的一个变体,它包含一个新的参数n,允许负数值通过一个小的数量,而不是被设置为零。因此,Leaky ReLU函数可以让神经元更容易激活,对比标准ReLU函数。
  • Leaky ReLU函数还可以防止神经元抖动。当神经元的输出是大于零的负数时,梯度下降算法会有很大的峰值,这会使梯度下降变得缓慢或不稳定,从而影响训练速度。使用Leaky ReLU函数,小的负数值的梯度不会被置为零,抑制抖动。
  • 另一个Leaky ReLU函数的优点是它可以更好地拟合模型,这得益于低值的gradient。梯度下降算法在计算梯度时,Leaky ReLU函数可以使用低值的梯度,这将使模型得到更快的收敛,从而提高模型的性能。
  • 虽然Leaky ReLU函数有许多优点,但它也有一些缺点。由于LeakyReLU函数具有负值,它可能会导致潜在的问题,如激活数量可能会进一步减少,这会影响模型的性能。此外,Leaky ReLU 函数可能会使网络变得过拟合,从而导致网络性能下降。

总之,Leaky ReLU函数是一种新的神经网络单元激活函数,它可以改善深度神经网络的性能,利用它改善梯度消失和抖动的问题,并可以更好地拟合模型。虽然Leaky ReLU函数有许多优点,但它也有一些缺点,在使用Leaky ReLU函数时,应该注意避免出现这些缺点。

2.6.1 公式

b

在这里插入图片描述

2.6.2 图像

在这里插入图片描述

2.6.3 代码解读

注意此时,调用的第一种方法应该是:F.leaky_relu(),注意下划线。其余的使用方法和上面三种 LU 函数没有区别。

这里只介绍第二种方法:也就是先定义类,后调用。

torch.nn.LeakyReLU(negative_slope=0.01, inplace=False)
import torch
relu=torch.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)

2.7 Tanh

  • 双曲正切函数:该函数现常用于神经网络最后一层。
  • 该函数输入为任意形状,输出与输入形状保持一致;操作在元素级别进行;

2.7.1 公式

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

2.7.2 图像

在这里插入图片描述

2.7.3 代码解读

该函数使用方法和sigmoid类似,也有三种使用方法:

1. torch.tanh(Tensor)
2. F.tanh(Tensor)
3. tanh = torch.nn.Tanh(); tanh(Tensor)

下面只介绍第三种:

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)

3. 总结

That’s all. 欢迎指正。

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

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

相关文章

荧光探针Pyrene-PEG2-Propargyl,芘甲酰胺-二聚乙二醇-丙炔

Pyrene-PEG2-Propargyl物理参数&#xff1a; CAS号&#xff1a;N/A | 英文名&#xff1a;Pyrene-PEG2-Propargyl |中文名&#xff1a;芘甲酰胺-二聚乙二醇-丙炔分子式&#xff1a;C24H21NO3分子量&#xff1a;371.44纯度标准&#xff1a;95%外形颜色&#xff1a;淡黄色或白色固…

shell学习4

目录 一、统计文本中的词频 二、压缩javascript 三、打印文件的或行中的第n个单词或列---awk 3.1 利用awk打印文件中每行中的第五个单词。 3.2 利用awk打印当前目录下的文件的权限和文件名 3.3 利用awk打印从M行到N行这个范围内的所有文本 3.4 利用awk 部分提取文件中的内…

opencv复习

文章目录图像衡量结果&#xff08;损失函数&#xff09;预测的好坏前向传播 反向传播图像 实质是矩阵 长 宽 像素通道&#xff08;0-255 0 黑 255 亮&#xff09; 假设这里做一个10分类 行向量✖列向量是一个数 分类 最后的结果是一个各个分类的概率值 这里的b是偏置项&…

学校节能降耗减排方案——能耗监管平台的建设及效果剖析

摘要&#xff1a;作为崭新的校园能耗管理手段&#xff0c;能耗监测平台以传统管理方式无法企及的优势有力地提升了高校能源管理工作的水平&#xff0e;从而受到了相关管理者的青睐。本文梳理总结了高校能耗监测平台的基本组成和优势特点&#xff0c;同时对能耗平台建设和使用中…

nginx设置重定向跳转后ip:[端口]/abc变成ip/abc而报错404

nginx设置重定向跳转后 ip:[端口]/abc 变成 ip/abc 而报错404nginx配置&#xff1a;server {listen 80;server_name _;client_max_body_size 300m;absolute_redirect off;location / {root html;index index.html index.htm;proxy_set_header X-Real-IP $remote_a…

【nodejs-04】黑马nodejs学习笔记04-MySQL简介及安装

文章目录1.数据库的基本概念1.1什么是数据库1.2 常见的数据库及分类1.3 传统型数据库的数据组织结构2.安装并配置MySQL2.1 了解需要安装哪些MySQL相关的软件2.2 MySQL 在 Mac 环境下的安装2.3 MySQL 在 Windows 环境下的安装1.数据库的基本概念 1.1什么是数据库 数据库&#x…

JavaWeb学习

文章目录Tomcat 详解1 Tomcat 安装2 默认端口号3 面试题4 编写与发布一个网站Http 详解1 http 请求2 http 响应3 面试题Tomcat 详解 1 Tomcat 安装 进入Tomcat官网下载压缩包&#xff1a;https://tomcat.apache.org/ 将压缩包解压即可直接使用 启动Tomcat:bin目录下startup.b…

【软件测试】如何在测试团队中工作游刃有余?你的测试技巧......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在测试团队中&#…

基于数据库实现分布式锁

分布式锁概述 前言 我们的系统都是分布式部署的&#xff0c;日常开发中&#xff0c;秒杀下单、抢购商品等等业务场景&#xff0c;为了防⽌库存超卖&#xff0c;都需要用到分布式锁。 分布式锁其实就是&#xff0c;控制分布式系统不同进程共同访问共享资源的一种锁的实现。如…

xshell6运行报错:由于找不到mfc110u.dll、MSVCR110.dll无法继续执行代码

今天给大家分享一下我刚装完系统遇到得问题,由于新盟的罗建雨【胡巴】老师帮我给电脑加了固态,又重装了系统,因此电脑里面得所有软件需要重装,在我重装的过程中遇到了一个小问题给大家分享一下,如果大家以后遇到也方便解决。 问题: 安装Xshell时电脑系统报错:“由于找…

一、微服务架构介绍

目录 一、微服务架构介绍 二、出现和发展 三、传统开发模式和微服务的区别 四、微服务的具体特征 五、SOA和微服务的区别 1、SOA喜欢重用&#xff0c;微服务喜欢重写 2、SOA喜欢水平服务&#xff0c;微服务喜欢垂直服务 3、SOA喜欢自上而下&#xff0c;微服务喜欢自下…

为什么项目的时间跟踪管理很重要 ?

项目通常被分解为需要完成的任务&#xff0c;以实现项目目标。时间跟踪可以帮助你了解每项任务需要多长时间&#xff0c;从而使你更准确地估计未来的项目。 除此以外&#xff0c;跟踪项目时间还有以下令人难以置信的好处&#xff1a; 1、提高生产力 通过记录在每项任务上花…

项目经理为什么要做时间管理?

对于时间的管理&#xff0c;有人做不到&#xff0c;有人不知道&#xff0c;对每一个成功的人来说&#xff0c;时间管理是很重要的一环。 对于项目经理而言&#xff0c;由于项目经理每天要在项目上花费大量的时间&#xff0c;所以个人时间比较少&#xff0c;因此项目经理就需要安…

小半年被裁掉30多人,大厂“开猿节流”太狠了

今年9月&#xff0c;我前同事的小公司辞退了30多个程序员&#xff0c;当然包括做测试的他。 近3月过去了&#xff0c;大部分人都找不到合适工作。大家聊起时都在感慨这两年好多行业都不景气。 这次暂停了大部分业务&#xff0c;团队里最终只留下4个比较厉害的程序员合并到另外…

内网渗透(二十九)之Windows协议认证和密码抓取-Windows-2012R2之后抓取密码的方式和抓取密码的防范措施

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

Jdk19 动态编译 Java源码为 Class 文件

动态编译 Java 源码为 Class一.背景1.Jdk 版本2.需求二.Java 源码动态编译实现1.Maven 依赖2.源码包装类3.Java 文件对象封装类4.文件管理器封装类5.类加载器6.类编译器三.动态编译测试1.普通测试类2.接口实现类3.测试四.用动态编译 Class 替换 SpringBoot 的 Bean&#xff08;…

Hexo博客搭建部署GitHub

Hexo博客 Hexo是一个简洁的静态博客页面&#xff0c;使用markdown渲染文件&#xff0c;在本地生产静态文件后可以部署到GitHub上&#xff0c;这样不需要占用自己的域名和服务器&#xff0c;其实我在很早之前就换用了hexo&#xff0c;原来的博客在csdn&#xff0c;oceansec.blo…

康耐视智能相机Insight-选择型号方式

一&#xff1a;了解仿真中每种型号。 1.首先需要知道每种仿真代表的是多少万像素的相机&#xff0c;然后根据具体的分辨率去选择相应的型号&#xff0c;具体型号如下。 IS2000 30万相机 分辨率&#xff1a;640480 IS5000 30万相机 分辨率&#xff1a;640480 IS5001 130万相机 分…

[数据结构] 深入理解什么是跳表及其模拟实现

跳表定义优化实现基本框架定义跳表结点实现基础结构构造函数实现基本操作查找操作插入数据删除某结点打印跳表跳表与平衡搜索树和哈希表的对比定义 每相邻两个节点升高一层&#xff0c;增加一个指针&#xff0c;让指针指向下下个节点&#xff1b;上面每一层链表的节点个数&…

Xshell 7 连接云服务器的步骤和出现的错误

一、工具准备云服务器Xshell 7二、使用 Xshell 7 连接数据库三、新建会话属性后&#xff0c;没有自动弹出 SSH 用户名要求输入四、SSH 用户身份验证不能输入 Password五、Xshell 连接 centos 7 服务器 报错提示 “ssh服务拒绝了密码&#xff0c;请再试一次“&#xff0c;但是密…