pytorch序列化容器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


目标

1. 知道梯度消失和梯度爆炸的原理和解决方法
2. 能够使用nn.Sequential完后才能模型的搭建
3. 知道nn.BatchNormld的使用方法
4. 知道nn.Dropout的使用方法


一、梯度消失和梯度爆炸

在使用pytorch中的序列化之前,我们先来了解一下长阿金的梯度消失和梯度爆炸的问题

1.1 梯度消失

假设我们有四层极简神经网络:每层中有一个神经元
在这里插入图片描述
假设我们使用sigmoid激活函数,即f为sigmoid函数,sigmoid的导数如下图:
在这里插入图片描述
当权重初始过小或使用易饱和神经元(sigmoid,tanh)sigmoid在y=0出梯度接近0,而无法更新参数,导致神经网络在反向传播时呈现指数倍缩小,产生“消失”现象。

1.2 梯度爆炸

在这里插入图片描述
当权重初始过大时,梯度神经网络在反向传播时会呈现指数倍放大,产生“爆炸”现象。

1.3 接近梯度消失或者梯度爆炸的经验

1.替换易训练神经元,如ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout。
在这里插入图片描述
2. 改进梯度优化算法:使用adam等算法
3. 使用batch normalization
4. LSTM的结构设计也可以改善RNN中的梯度消失问题。

二、nn.Sequential

nn.Sequential是一个有序的容器,其中传入的是构造器类(各种用来处理input的类),最终input会被Sequential中的构造器依次执行。
例如:

layer = nn.Sequential(
	nn.linear(input_dim,n_hidden_1),
	nn.ReLU(True),	# inplace=False 是否对输入进行就地修改,默认是False
	nn.linear(n_hidden_1,n_hidden_2),	
	nn.ReLU(True),
	nn.linear(n_hidden_2,output_dim)# 最后一层不需要添加激活函数
)

在上述,可以直接调用layer(x),得到输出x的被执行顺序就是Sequential中定义的顺序:

  1. 被隐层1执行,形状变为[batch_size,n_hidden_1]
  2. 被relu执行,形状不变
  3. 被隐层2执行,形状变为[batch_size,n_hidden_2]
  4. 被relu执行,形状不变
  5. 被最后一层执行,形状变为[batch_size,output_dim]

三、nn.BatchNorm1d

batch normalization翻译成中文就是批规范化,即在每个batch训练的过程中,对参数进行归一化的处理,从而达到加快训练速度的效果。
以sigmoid激活函数为例,它在反向传播的过程中,在值为0,1的时候,梯度接近0,导致参数被更新的幅度很小,训练速度慢。但是如果对数据进行归一化之后,就会尽可能的把数据拉到[0,1]的范围,从而让参数更新的幅度变大,提高训练的速度。
batchNorm一般会放到激活函数之后,即对输入进行激活处理之后再进行batchNorm。

layer = nn.Sequential(
	nn.linear(input_dim,n_hidden_1),
	nn.ReLU(True),	# inplace=False 是否对输入进行就地修改,默认是False
	nn.BatchNorm1d(n_hidden_1)
	
	nn.linear(n_hidden_1,n_hidden_2),	
	nn.ReLU(True),
	nn.BatchNorm1d(n_hidden_2)
	
	nn.linear(n_hidden_2,output_dim)# 最后一层不需要添加激活函数
)

四、nn.Dropout

dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。

  1. 增加模型的稳健性
  2. 可以解决过拟合的问题(增加模型的泛化能力)
  3. 可以理解为训练后的模型是多个模型的组合之后的结果,类似随机森林
layer = nn.Sequential(
	nn.linear(input_dim,n_hidden_1),
	nn.ReLU(True),	# inplace=False 是否对输入进行就地修改,默认是False
	nn.BatchNorm1d(n_hidden_1)
	nn.Dropout(0.3)	# 0.3为dropout的比例,默认值为0.5
	
	nn.linear(n_hidden_1,n_hidden_2),	
	nn.ReLU(True),
	nn.BatchNorm1d(n_hidden_2)
	nn.Dropout(0.3)
		
	nn.linear(n_hidden_2,output_dim)# 最后一层不需要添加激活函数
)

容器中的隐藏层越多,能够增加模型的非线性表达能力。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值