基于Pytorch的深度学习 —— 非线性激活函数

文章目录

作用

Sigmoid

tanh

ReLU

Leaky ReLU

SoftPlus

开发环境


作用

非线性激活函数获取输入,并对其进行数学变换后生成输出;

非线性激活函数为神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,可以应用到非线性模型中;如果不使用,则只能适合线性模型。

Sigmoid

 

基于Pytorch的深度学习 —— 非线性激活函数Sigmoid激活函数输入实数,输出结果为0到1之间;

对于一个极大的负值,返回结果接近于0;对于一个极大的正值,返回结果接近于1;

表达式:

基于Pytorch的深度学习 —— 非线性激活函数基于Pytorch的深度学习 —— 非线性激活函数基于Pytorch的深度学习 —— 非线性激活函数

弊端:当输出值接近于0或1时,基于Pytorch的深度学习 —— 非线性激活函数Sigmoid函数前一层的梯度接近于0;此时前一层的权重无法经常调整,从而产生了无效神经元。

代码与绘制:

import torch    #引用torch
import matplotlib.pyplot as plt     #引用matplotlib
import os   #引用OS
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'

x_tor = torch.linspace(-5, 5, 200)  #使用torch在区间[-5,5]上均匀的生成200个数据
x_np = x_tor.data.numpy()  #将数据转换成np的数据类型
y_sigmoid = torch.sigmoid(x_tor).data.numpy()   #sigmoid激活函数

plt.plot(x_np, y_sigmoid, c='blue', label='sigmoid') #坐标轴赋值及描述信息
plt.ylim((-0.2, 1.2))   #设置Y轴上下限
plt.legend(loc='best')  #给图像加图例
plt.show()  #显示绘制的图像

基于Pytorch的深度学习 —— 非线性激活函数

tanh

非线性函数tanh输出结果为-1到1之间;

表达式:

基于Pytorch的深度学习 —— 非线性激活函数

所以当tanh输出极值接近-1和1时,也面临梯度饱和的问题;但是其输出是以0为中心的,实际应用中会比Sigmoid更好;

代码与绘制:

import torch    #引用torch
import matplotlib.pyplot as plt     #引用matplotlib
import os   #引用OS
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'

x_tor = torch.linspace(-5, 5, 200)  #使用torch在区间[-5,5]上均匀的生成200个数据
x_np = x_tor.data.numpy()  #将数据转换成np的数据类型
y_tanh = torch.tanh(x_tor).data.numpy()     #tanh激活函数
plt.plot(x_np, y_tanh, c='blue', label='tanh') #坐标轴赋值及描述信息
plt.ylim((-1.2, 1.2))   #设置Y轴上下限
plt.legend(loc='best')  #给图像加图例
plt.show()  #显示绘制的图像

基于Pytorch的深度学习 —— 非线性激活函数

ReLU

ReLU有助于优化器更快的找到正确的权重集合。可以使随机梯度下降收敛的更快;计算速度非常快;

但是当一个很大的梯度进行反向传播时,流经的神经元会变得无效;可以通过调整学习率来控制;

表达式:

基于Pytorch的深度学习 —— 非线性激活函数

 

ReLU把所有负值取作0,正值保持不变;

代码与绘制:

import torch    #引用torch
import matplotlib.pyplot as plt     #引用matplotlib
import os   #引用OS
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'

x_tor = torch.linspace(-5, 5, 200)  #使用torch在区间[-5,5]上均匀的生成200个数据
x_np = x_tor.data.numpy()  #将数据转换成np的数据类型
y_relu = torch.relu(x_tor).data.numpy()     #ReLU激活函数
plt.plot(x_np, y_relu, c='blue', label='relu') #坐标轴赋值及描述信息
plt.ylim((0, 6))   #设置Y轴上下限
plt.legend(loc='best')  #给图像加图例
plt.show()  #显示绘制的图像

基于Pytorch的深度学习 —— 非线性激活函数

Leaky ReLU

Leaky ReLU尝试解决一个问题死角,不再将饱和度置为0,而是设为一个非常小的数值,如0.01;

Leaky ReLU是给所有负值赋予一个非零斜率;

这一激活函数对于某些用例提供了更优异的性能,但是他不是连续的。

SoftPlus

SoftPlus平滑版的ReLU;

表达式:

基于Pytorch的深度学习 —— 非线性激活函数

代码与绘制:

import torch    #引用torch
import matplotlib.pyplot as plt     #引用matplotlib
import torch.nn.functional as F     #引用torch.nn.functional
import os   #引用OS
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'

x_tor = torch.linspace(-5, 5, 200)  #使用torch在区间[-5,5]上均匀的生成200个数据
x_np = x_tor.data.numpy()  #将数据转换成np的数据类型
y_softplus = F.softplus(x_tor).data.numpy()     #tanh激活函数
plt.plot(x_np, y_softplus, c='blue', label='softplus') #坐标轴赋值及描述信息
plt.ylim((0, 6))   #设置Y轴上下限
plt.legend(loc='best')  #给图像加图例
plt.show()  #显示绘制的图像

基于Pytorch的深度学习 —— 非线性激活函数

开发环境

Author:Lizhifun

OS:Windows 10 家庭中文版

Python:3.8.5

Pytorch:1.7.1

 

 

 

上一篇:【转载】深度学习基础知识(一):神经网络与随机梯度下降SGD


下一篇:PReLU——Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification