Pytorch-搭建网络框架(三)

Hello

一、Optimizer 优化器

优化器:管理更新模型中可学习参数的值(weight,bias等),使得模型输出更接近真实标签,即降低loss值

梯度:指向方向导数取得最大值方向的向量

二、Optimizer的基本属性

defaults:优化器超参数(学习率、momentum值)

state:存储参数的缓存,如momentum的缓存(前几次梯度的值)

param_groups:需要管理的参数组,即模型中需要迭代更新的参数(weight,bias等)

step_count:记录更新次数,学习率调整中会使用,如迭代一百次的时候下降学习率,迭代两百次的时候再下降学习率等。

三、Optimizer的基本方法

zero_grad()方法
功能:清空所管理参数的梯度在
因为在pytorch中,张量的梯度不会自动清零,所以需要在使用完梯度之后或者在反向传播之前进行梯度清零。

step()方法:使用梯度下降的策略,执行一次参数更新过程。梯度下降策略:随机梯度下降法,momentum加动量的方法,自适应学习率的方法

add_param_group():添加参数组,比如将CNN网络中特征提取部分和全连接层部分放到两组中,两组设置不同的学习率等

state_dict():获取优化器当前的状态信息字典
load_state_dict():加载之前的状态信息字典
state_dict和load_state_dict有利于保存模型训练进度,防止断电等意外中断训练后,出现丢失训练的参数,需要重新训练的情况。

四、Optimizer的结构与使用

#optimizer部分的准备工作
optimizer = optim.SGD(net.parameters(), lr=LR, momentum=0.9) #选择优化器
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gama=0.1) # 设置学习率下降策略

#以下代码应该出现在迭代循环的代码模块中
outputs = net(inputs) # 调用网络获取输出

optimizer.zero_grad() # 梯度清零,反向传播之前进行

loss = criterion(outputs, labels) # 获取损失值
loss.backward() # 反向传播,得到梯度

optimizer.step() # 参数更新

五、基本方法的使用

add_param_group()

#在optimizer中再增加一组参数
#optimizer是一个已经构建好的优化器
w2 = torch.randn((3,3),requires_grad=True) # 构建参数
optimizer.add_param_group({"params":w2, 'lr':0.0001}) # 方法中放一个字典,字典的key设为params,value为构建的参数,也可以以键值对的形式设置其他超参

state_dict() 与 load_state_dict()

保存进度

#保存进度
optimizer = optim.SGD([weight], lr=0.1, momentum=0.9)
opt_state_dict = optimizer.state_dict()
for i in range(10):
	optimizer.step()
torch.save(optimizer.state_dict(), os.path.join(BASE_DIR, "optimizer_state_dict.pkl"))
#将状态保存到本地路径,并命名为optimizer_state_dict.pkl

加载进度


optimizer = optim.SGD([weight], lr=0.1, moment=0.9) # 构建一个优化器
state_dict = torch.load(os.path.join(BASE_DIR),"optimizer_state_dict.pkl") # 读取进度
optimizer.load_state_dict(state_dict) # 加载进度

六、torch.optim.SGD

optim.SGD(params, lr , momentum , dampening , weight_decay=0 , nesterov=False)
主要参数:
params:管理的参数组
lr:初始学习率
momentum:动量系数,贝塔
weight_decay:L2正则化系数
nesterov:布尔变量,控制是否采用NAG的梯度下降方法

学习率lr(learning rate):控制参数更新时梯度下降的步伐,小于1,一般可以取0.01
在这里插入图片描述
当学习率越接近上帝的学习率的时候,就可以越快的将损失函数降到最低。
上帝的学习率:可以使从出发点一步到达底部(损失值最低)的地方的学习率
但没有方法可以知道,所以一般会将学习率取小,一般0.01,用增加迭代次数、计算时间的方式来避免梯度爆炸。

Momentum(动量):结合当前梯度和上一次更新的信息,用于当前更新
指数加权平均:
在这里插入图片描述
举例:
在这里插入图片描述
距离当前时刻越近,其权重越大,距离当前时刻约远,其权重值会越小。即加强近邻时刻值的影响,弱化远时刻值的影响

超参:
Beta:控制记忆周期,Beta值越大,记忆的越远,Beta值越小,记忆的越近。
通常设置为0.9,使其更关注10天左右的数据
在这里插入图片描述
Beta就是Momentum这个系数

回到梯度更新公式中,用vi代替原先公式中的g(wi)即梯度。
在这里插入图片描述

七、其他优化器:

比较常用的是1.SGD和5.Adam,其中SGD可以解决90%以上的问题

  1. optim.SGD:随机梯度下降法
  2. optim.Adagrad:自适应学习率梯度下降法
  3. optim.RMSprop: Adagrad的改进
  4. optim.Adadelta: Adagrad的改进
  5. optim.Adam:RMSprop结合Momentum
  6. optim.Adamax:Adam增加学习率上限
  7. optim.SparseAdam:稀疏版的Adam
  8. optim.ASGD:随机平均梯度下降
  9. optim.Rprop:弹性反向传播
  10. optim.LBFGS:BFGS的改进

Bye

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值