深度学习学习笔记
sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。softmax就是将网络输出的logits通过softmax函数,就映射成为(0,1)的值,而这些值的累计和为1(满足概率的性质),那么我们将他理解成概率,选取概率最大(也就是值对应最大的的)节点,作为我们的预测目标类别。1、Tanh函数将输入映射到(-1,-1)之间,图像以0为中心,在0点对称,当输入大概<-
Day07
常见的激活函数-tanh激活函数
Tanh的公式:x越大,整体越接近于1;x越小,整体越接近-1

激活函数求导公式:
![]()
Tanh的函数图像、导数图像如下:

1、Tanh函数将输入映射到(-1,-1)之间,图像以0为中心,在0点对称,当输入大概<-3或者>3时将被映射为-1或者1其导数值范围(0,1),当输入的值大概<-3或者>3时,其导数值近似0
2、与Sigmoid相比,它是以0为中心的,且梯度相对于sigmoid大,使得其收敛速度要比sigmoid块,减少迭代次数。然而,从图中可以看出,Tanh两侧的倒数也为0,同样会造成梯度消失
3、若使用时可在隐藏层使用tanh函数,在输出层使用sigmoid函数
"""
案例:
绘制Tanh函数图像和导数图像
Sigmoid激活函数介绍:
激活函数的目的:
给模型增加非线性功能,让模型(神经元)既可以分类,还可以做回归问题,
激活函数的分类:
Sigmoid
ReLU
Tanh
SoftMax
Sigmoid激活函数:
主要应用于 二分类输出层,且适用于 浅层神经网络(不超过5层)
数据在【-6,6】之间有效果,在【-3,3】之间效果明显
求导后范围在【0,0.25】
Tanh激活函数:
主要应用于隐藏层,且适用于 适用于 浅层神经网络(不超过5层)
数据在【-3,3】之间有效果,在【-1,1】之间效果明显,会将结果映射到【-1,1】
求导后范围在【0,1】,较之于Sigmoid收敛速度快
细节:
绘制激活函数图像时出现以下提示,需要将 anaconda3/Lib/site-packages/torch/Lib/目录下的libiomp5md.dll文件删除
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
"""
import plt
import torch
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
#1、创建画布和坐标轴
fig,axes=plt.subplots(1,2)
#2、生产数据点
x=torch.linspace(-20,20,1000)
#3、计算上述点,tanh函数处理后的值
y=torch.tanh(x)
#4、在第一个子图中绘制tanh函数图像
axes[0].plot(x,y)
axes[0].set_title('tanh激活函数图像')
axes[0].grid()
#5、在第二个图上,绘制tanh激活函数的导数图像
#5.1 重新生成1000个点
#参1:起始值 参2:结束值 参3:生成个数 参4:是否需要梯度
x=torch.linspace(-20,20,1000,requires_grad=True)
#5.2具体的计算上述1000点。tanh函数导数后的值
torch.tanh(x).sum().backward()
#5.3绘图
axes[1].plot(x.detach(),x.grad)
axes[1].set_title('tanh激活函数导数图像')
axes[1].grid()
plt.show()
常见的激活函数ReLU激活函数
ReLU公式如下:

激活函数的求导公式:
![]()
函数图像:

1、ReLU激活函数将小于0的值映射为0,而大于0的值则保持不变,它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率
2、当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题,所以,ReLU能够在x>0保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。这种现象被称为“神经元死亡”
3、ReLU是目前是最常用的激活函数,与Sigmoid相比优势是:
采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,计算量相对大,而采用ReLU激活函数,整个过程的计算量节省很多。sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。relu会使一部分神经元输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,环节了过拟合问题的发生
"""
案例:
绘制ReLU函数图像和导数图像
Sigmoid激活函数介绍:
激活函数的目的:
给模型增加非线性功能,让模型(神经元)既可以分类,还可以做回归问题,
激活函数的分类:
Sigmoid
ReLU
Tanh
SoftMax
Sigmoid激活函数:
主要应用于 二分类输出层,且适用于 浅层神经网络(不超过5层)
数据在【-6,6】之间有效果,在【-3,3】之间效果明显
求导后范围在【0,0.25】
Tanh激活函数:
主要应用于隐藏层,且适用于 适用于 浅层神经网络(不超过5层)
数据在【-3,3】之间有效果,在【-1,1】之间效果明显,会将结果映射到【-1,1】
求导后范围在【0,1】,较之于Sigmoid收敛速度快
ReLU激活函数
计算公式:max(0,x),计算量相对较小,训练成本低,多应用于隐藏层,且适合 深层 神经网络,
求导前,值要么是0,要么是1,较之于Tanh,收敛速度更快
默认情况下ReLU只考虑 正样本,可以使用LeakyReLU,PReLU来考虑正负样本
细节:
绘制激活函数图像时出现以下提示,需要将 anaconda3/Lib/site-packages/torch/Lib/目录下的libiomp5md.dll文件删除
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
"""
import plt
import torch
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
#1、创建画布和坐标轴
fig,axes=plt.subplots(1,2)
#2、生产数据点
x=torch.linspace(-20,20,1000)
#3、计算上述点,relu函数处理后的值
y=torch.relu(x)
#4、在第一个子图中绘制relu函数图像
axes[0].plot(x,y)
axes[0].set_title('relu激活函数图像')
axes[0].grid()
#5、在第二个图上,绘制relu激活函数的导数图像
#5.1 重新生成1000个点
#参1:起始值 参2:结束值 参3:生成个数 参4:是否需要梯度
x=torch.linspace(-20,20,1000,requires_grad=True)
#5.2具体的计算上述1000点。relu函数导数后的值
torch.relu(x).sum().backward()
#5.3绘图
axes[1].plot(x.detach(),x.grad)
axes[1].set_title('relu激活函数导数图像')
axes[1].grid()
plt.show()
常见的激活函数SoftMax激活函数
softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类结果以概率的形式展现出来,计算方式:


softmax就是将网络输出的logits通过softmax函数,就映射成为(0,1)的值,而这些值的累计和为1(满足概率的性质),那么我们将他理解成概率,选取概率最大(也就是值对应最大的的)节点,作为我们的预测目标类别
"""
案例:
绘制ReLU函数图像和导数图像
Sigmoid激活函数介绍:
激活函数的目的:
给模型增加非线性功能,让模型(神经元)既可以分类,还可以做回归问题,
激活函数的分类:
Sigmoid
ReLU
Tanh
SoftMax
Sigmoid激活函数:
主要应用于 二分类输出层,且适用于 浅层神经网络(不超过5层)
数据在【-6,6】之间有效果,在【-3,3】之间效果明显
求导后范围在【0,0.25】
Tanh激活函数:
主要应用于隐藏层,且适用于 适用于 浅层神经网络(不超过5层)
数据在【-3,3】之间有效果,在【-1,1】之间效果明显,会将结果映射到【-1,1】
求导后范围在【0,1】,较之于Sigmoid收敛速度快
ReLU激活函数
计算公式:max(0,x),计算量相对较小,训练成本低,多应用于隐藏层,且适合 深层 神经网络,
求导前,值要么是0,要么是1,较之于Tanh,收敛速度更快
默认情况下ReLU只考虑 正样本,可以使用LeakyReLU,PReLU来考虑正负样本
softmax激活函数:
将多分类的结果以概率的形式展示,且概率和相加为1,最终选取概率值最大的分类作为结果
细节:
绘制激活函数图像时出现以下提示,需要将 anaconda3/Lib/site-packages/torch/Lib/目录下的libiomp5md.dll文件删除
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
"""
import plt
import torch
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 1. 定义张量,记录:分类数据。
scores = torch.tensor([0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])
# 2. dim = 0,按行计算
probabilities = torch.softmax(scores, dim=0)
print(probabilities)
激活函数的选择方法
对于隐藏层:
1、优先选择ReLU激活函数
2、如果ReLU效果不好,那么尝试其他激活,如LeakyReLU等
3、如果使用了ReLU,需要注意一下Dead ReLU问题,避免出现0梯度从而导致过多的神经元死亡
4、少用使用sigmoid激活函数,可以尝试使用tanh激活函数
对于输出层
1、二分问题选择sigmoid激活函数
2、多分类问题选择softmax激活函数
3、回归问题选择identity激活函数
更多推荐


所有评论(0)