初学神经网络和pytorch,这里参考大佬资料来总结一下有哪些激活函数和损失函数(pytorch表示)
首先pytorch初始化:  
import torch
import torch.nn.functional as F
from torch.autograd import Variableimport matplotlib.pyplot as pltx = torch.linspace(-5, 5, 200)   # 构造一段连续的数据
x = Variable(x)      # 转换成张量
x_np = x.data.numpy()    #plt中形式需要numoy形式,tensor形式会报错


一:激活函数:
  1:首先我们得知道为什么需要激活(激励)函数,它其实就是另外一个非线性函数。如果没有激励函数,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限,而且只有线性组合,隐藏层无论多少层其实和只有一层差不(转换为一次的加权计算)。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
2:激励函数的性质:
  • 非线性: 当激活函数是线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。但是,如果激活函数是恒等激活函数的时候(即f(x)=x),就不满足这个性质了,而且如果MLP使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的。
  • 可微性: 当优化方法是基于梯度的时候,这个性质是必须的。
  • 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
  • f(x)≈x: 当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要很用心的去设置初始值。
  • 输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate

3:常用的激活函数   

早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。下面我们来总结下这些激活函数:

  • 3.1单极性 sigmod函数

3.1.1:Sigmoid 是常用的非线性的激活函数,该函数是将取值为 (−∞,+∞)(−∞,+∞) 的数映射到 (0,1)之间,它的数学形式图像如下:

     

3.1.2:特点:

                    sigmod激励函数符合实际,当输入很小时,输出接近于0;当输入很大时,输出值接近1,但是sigmoid函数作为非线性激活函数,但是其并不被经常使用,它具有以下几个缺点:

1)当 zz 值非常大或者非常小时,通过右上图我们可以看到,sigmoid函数的导数 g′(z)g′(z) 将接近 0 。这会导致权重 WW 的梯度将接近 0 ,使得梯度更新十分缓慢,即梯度消失

2)非零中心化,也就是当输入为0时,输出不为0,,因为每一层的输出都要作为下一层的输入,而未0中心化会直接影响梯度下降 。

      3)计算量比较大。

    sigmoid函数可用在网络最后一层,作为输出层进行二分类,尽量不要使用在隐藏层。 

   3.1.3:pytorch实现:

y_sigmoid = F.sigmoid(x).data.numpy()  #初始化已经在上面实现
plt.plot(x_np, y_sigmoid, c='red', label='sigmoid')
plt.ylim((-0.2, 1.2))
plt.legend(loc='best')  #图例名称自动选择最佳展示位置
plt.show()  #展示图片和上面(中)类似

  • 3.2:双极性tanh函数

3.2.1 :该函数是将取值为 (−∞,+∞)(−∞,+∞) 的数映射到 (−1,1)(−1,1) 之间,其数学形式图形为:

              

3.2.2:特点:

1)tanh函数在 0 附近很短一段区域内可看做线性的。由于tanh函数均值为 0 ,因此弥补了sigmoid函数均值为 0.5 的缺点。

      2)当z为非常大或者非常小的时候,由导数推断公式可知,此时导数接近与0,会导致梯度很小,权重更新非常缓慢,即梯度消失问题

      3)幂运算问题仍然存在,计算量比较大。

    3.2.3:pytorch实现:    

y_tanh = F.tanh(x).data.numpy()    #初始化在上面已经给出
plt.plot(x_np, y_tanh, c='red', label='tanh')
plt.ylim((-1.2, 1.2))
plt.legend(loc='best')plt.show()#展示图片和上图(中)相似。

  • 3.3:Relu函数

3.3.1 :又称修正线性单元,是一种分段线性函数,其弥补了sigmoid函数以及tanh函数的梯度消失问题。ReLU函数的公式以及图形,导数公式如下:

                    

3.3.2:特点:

    1)(1)在输入为正数的时候(对于大多数输入 zz 空间来说),不存在梯度消失问题。
    (2) 计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。(sigmod和tanh要计算指数,计算速度会比较慢)
   (3)当输入为负时,梯度为0,会产生梯度消失问题

      ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!

  3.3.3:pytorch实现:

y_relu = F.relu(x).data.numpy()
plt.plot(x_np, y_relu, c='red', label='relu')
plt.ylim((-1, 5))
plt.legend(loc='best')plt.show()

  • 3.4:Leaky Relu函数

3.4.1:这是一种对ReLU函数改进的函数,又称为PReLU函数,但其并不常用。其公式与图形如下:(a取值在(0,1)之间)

             

   特点:

Leaky ReLU函数解决了ReLU函数在输入为负的情况下产生的梯度消失问题

    理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

  3.5:softplus函数

    3.5.1:和relu一样为近似生物神经激活函数,函数数学形式和图像如下:(log里面加1是为了避免非0出现)

                              

3.5.2:特点:

1)softplus可以看作是ReLu的平滑。

3.5.3:pytorch实现:   

y_softplus = F.softplus(x).data.numpy()
plt.plot(x_np, y_softplus, c='red', label='softplus')
plt.ylim((-0.2, 6))
plt.legend(loc='best')plt.show()

4:怎么样去选择激励函数

  1)在少量层结构中, 我们可以尝试很多种不同的激励函数. 在卷积神经网络 Convolutional neural networks 的卷积层中, 推荐的激励函数是 relu. 在循环神经网络中 recurrent neural networks, 推荐的是 tanh 或者是 relu 。

2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.

3)Relu->Lecky Relu/Elu>tanh>sigmoid

5:参考文献:

神经网络中集中激活函数的理解

  常用激活函数的集合与总结

 神经网络-激励函数

pytorch中常用的激活函数

神经网络激活函数和损失函数的选择

转载于:https://www.cnblogs.com/carrollCN/p/11370960.html

pytorch中的激励函数(详细版)相关推荐

  1. 深度学习环境配置(pytorch版本)----超级无敌详细版(有手就行)

    公众号文章--深度学习环境配置(pytorch版本) 写在前面:如果这篇文章对大家有帮助的话,欢迎关注Franpper的公众号:Franpper的知识铺,回复"进群",即可进入讨论 ...

  2. 利用 PyTorch 训练神经网络(详细版)

    点击关注我哦 欢迎关注 "小白玩转Python",发现更多 "有趣" "A little learning is a dangerous thing; ...

  3. 利用 PyTorch 构建神经网络(详细版)

    点击关注我哦 欢迎关注 "小白玩转Python",发现更多 "有趣" "The question of whether a computer can ...

  4. PyTorch中linspace的详细用法

    从PyTorch的官方网站上找到了这个函数的详细说明. https://pytorch.org/docs/stable/generated/torch.linspace.html?highlight= ...

  5. 【idea 2021.2】如何将idea中的代码推到git仓库中(最新详细版)

    一.准备好要推到git上的本地代码 如果我们的代码只在本地运行并没有连接远程git仓库,那idea的菜单栏是有所不同的 没有连接远程仓库的idea菜单栏: 连接了远程仓库的idea菜单栏: 可以看出是 ...

  6. 使用PyTorch构建神经网络(详细步骤讲解+注释版) 01-建立分类器类

    文章目录 1 数据准备 2 数据预览 3 简单神经网络创建 3.1 设计网络结构 3.2 损失函数相关设置 3.3 向网络传递信息 3.4 定义训练函数train 4 函数汇总 1 数据准备 神经网络 ...

  7. 【Pytorch】| Pytorch中softmax的dim的详细总结

    [Pytorch]| Pytorch中softmax的dim的详细总结 关于softmax的理解 一维向量:dim=0和dim=-1结果相同,dim=1和dim=2会报错 二维张量:dim=1和dim ...

  8. PKS中服务器和系统什么关系,PKS系统介绍详细版讲述.ppt

    PKS系统介绍详细版讲述 Honeywell 的技术领导地位 Honeywell PKS 价值定义范围 我们的目标 什么是EPKS? Experion PKSTM系统概貌 融入霍尼韦尔数十年的过程控制 ...

  9. Jetson Xavier NX学习笔记(三)系统烧录+开机教程+YOLOv7环境搭建+错误总结(详细版)

    Jetson Xavier NX 系统烧录+开机教程+YOLOv7环境搭建+错误总结(详细版) 文章目录 Jetson Xavier NX 系统烧录+开机教程+YOLOv7环境搭建+错误总结(详细版) ...

最新文章

  1. 加载多瓦片地图_手把手教 | 网络时空大数据爬取与分析DAS系统(瓦片地图获取)...
  2. 网络管理技术(Network Administrative Techniques)
  3. 关于后端java项目使用SpringBoot框架的报错总结
  4. 2020春招机考汇总2:扑克牌打出最小次数、钢琴高昂旋律(拼接递增序列)
  5. dataframe修改列名_python dataframe操作大全数据预处理过程(dataframe、md5)
  6. 中国十大科技进展2项,世界十大科技进展6项生物相关;相比工程,生物与国际差距还是较大...
  7. 电脑怎么换自己的壁纸_怎么才能给自己的爱机一个合理的价格—想把自己电脑回收的...
  8. CentOS下ELK收集Nginx日志
  9. Speos — 光学产品设计仿真工具
  10. 福昕阅读器 自定义注释快捷键
  11. 网络聊天室项目说明书
  12. C-关键字之const
  13. 窗函数(window function)
  14. 卡尔曼(Kalman)滤波 C++
  15. 人生低谷一日感悟+收获
  16. (转载)基于TDOA声源定位算法仿真–MATLAB仿真
  17. 多机房UPS及环境集中监控方案丨UPS环境综合监控主机
  18. 解决[FireDAC][DatS]-32. Variable length column [Name] overflow. Value length - [26], column maximum le
  19. 零基础教师成功转型数据分析师,它功不可没
  20. crux系列写作-篇首

热门文章

  1. 互联网业务数据分析-数据分析进阶
  2. 毕业设计 基于单片机的示波器设计与实现(源码+硬件+论文)
  3. android 车载控制手机音乐播放器,【图】浅谈车载音响播放器之安卓篇
  4. 小强老师的零基础学习软件测试之LR笔记
  5. 新的开始,持之以恒。
  6. 阿里图标库的使用方法
  7. 一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目源码)
  8. PCB模块化设计24——DCDC电源模块PCB布局布线设计规范
  9. 针对火狐浏览器的CSS样式,从而不会影响别的浏览器
  10. 关于mpy电压采集模块的那些事儿(ads1256 ads8688 ad7606)