浅谈Pytorch torch.optim优化器个性化的使用


Posted in Python onFebruary 20, 2020

一、简化前馈网络LeNet

import torch as t
 
 
class LeNet(t.nn.Module):
 def __init__(self):
  super(LeNet, self).__init__()
  self.features = t.nn.Sequential(
   t.nn.Conv2d(3, 6, 5),
   t.nn.ReLU(),
   t.nn.MaxPool2d(2, 2),
   t.nn.Conv2d(6, 16, 5),
   t.nn.ReLU(),
   t.nn.MaxPool2d(2, 2)
  )
  # 由于调整shape并不是一个class层,
  # 所以在涉及这种操作(非nn.Module操作)需要拆分为多个模型
  self.classifiter = t.nn.Sequential(
   t.nn.Linear(16*5*5, 120),
   t.nn.ReLU(),
   t.nn.Linear(120, 84),
   t.nn.ReLU(),
   t.nn.Linear(84, 10)
  )
 
 def forward(self, x):
  x = self.features(x)
  x = x.view(-1, 16*5*5)
  x = self.classifiter(x)
  return x
 
net = LeNet()

二、优化器基本使用方法

建立优化器实例

循环:

清空梯度

向前传播

计算Loss

反向传播

更新参数

from torch import optim
 
# 通常的step优化过程
optimizer = optim.SGD(params=net.parameters(), lr=1)
optimizer.zero_grad() # net.zero_grad()
 
input_ = t.autograd.Variable(t.randn(1, 3, 32, 32))
output = net(input_)
output.backward(output)
 
optimizer.step()

三、网络模块参数定制

为不同的子网络参数不同的学习率,finetune常用,使分类器学习率参数更高,学习速度更快(理论上)。

1.经由构建网络时划分好的模组进行学习率设定,

# # 直接对不同的网络模块制定不同学习率
optimizer = optim.SGD([{'params': net.features.parameters()}, # 默认lr是1e-5
      {'params': net.classifiter.parameters(), 'lr': 1e-2}], lr=1e-5)

2.以网络层对象为单位进行分组,并设定学习率

# # 以层为单位,为不同层指定不同的学习率
# ## 提取指定层对象
special_layers = t.nn.ModuleList([net.classifiter[0], net.classifiter[3]])
# ## 获取指定层参数id
special_layers_params = list(map(id, special_layers.parameters()))
print(special_layers_params)
# ## 获取非指定层的参数id
base_params = filter(lambda p: id(p) not in special_layers_params, net.parameters())
optimizer = t.optim.SGD([{'params': base_params},
       {'params': special_layers.parameters(), 'lr': 0.01}], lr=0.001)

四、在训练中动态的调整学习率

'''调整学习率'''
# 新建optimizer或者修改optimizer.params_groups对应的学习率
# # 新建optimizer更简单也更推荐,optimizer十分轻量级,所以开销很小
# # 但是新的优化器会初始化动量等状态信息,这对于使用动量的优化器(momentum参数的sgd)可能会造成收敛中的震荡
# ## optimizer.param_groups:长度2的list,optimizer.param_groups[0]:长度6的字典
print(optimizer.param_groups[0]['lr'])
old_lr = 0.1
optimizer = optim.SGD([{'params': net.features.parameters()},
      {'params': net.classifiter.parameters(), 'lr': old_lr*0.1}], lr=1e-5)

可以看到optimizer.param_groups结构,[{'params','lr', 'momentum', 'dampening', 'weight_decay', 'nesterov'},{……}],集合了优化器的各项参数。

重写sgd优化器

import torch
from torch.optim.optimizer import Optimizer, required

class SGD(Optimizer):
 def __init__(self, params, lr=required, momentum=0, dampening=0, weight_decay1=0, weight_decay2=0, nesterov=False):
  defaults = dict(lr=lr, momentum=momentum, dampening=dampening,
      weight_decay1=weight_decay1, weight_decay2=weight_decay2, nesterov=nesterov)
  if nesterov and (momentum <= 0 or dampening != 0):
   raise ValueError("Nesterov momentum requires a momentum and zero dampening")
  super(SGD, self).__init__(params, defaults)

 def __setstate__(self, state):
  super(SGD, self).__setstate__(state)
  for group in self.param_groups:
   group.setdefault('nesterov', False)

 def step(self, closure=None):
  """Performs a single optimization step. Arguments: closure (callable, optional): A closure that reevaluates the model and returns the loss. """
  loss = None
  if closure is not None:
   loss = closure()

  for group in self.param_groups:
   weight_decay1 = group['weight_decay1']
   weight_decay2 = group['weight_decay2']
   momentum = group['momentum']
   dampening = group['dampening']
   nesterov = group['nesterov']

   for p in group['params']:
    if p.grad is None:
     continue
    d_p = p.grad.data
    if weight_decay1 != 0:
     d_p.add_(weight_decay1, torch.sign(p.data))
    if weight_decay2 != 0:
     d_p.add_(weight_decay2, p.data)
    if momentum != 0:
     param_state = self.state[p]
     if 'momentum_buffer' not in param_state:
      buf = param_state['momentum_buffer'] = torch.zeros_like(p.data)
      buf.mul_(momentum).add_(d_p)
     else:
      buf = param_state['momentum_buffer']
      buf.mul_(momentum).add_(1 - dampening, d_p)
     if nesterov:
      d_p = d_p.add(momentum, buf)
     else:
      d_p = buf

    p.data.add_(-group['lr'], d_p)

  return loss

以上这篇浅谈Pytorch torch.optim优化器个性化的使用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python函数学习笔记
Oct 07 Python
pymssql ntext字段调用问题解决方法
Dec 17 Python
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
Python单元测试unittest的具体使用示例
Dec 17 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
Python3和PyCharm安装与环境配置【图文教程】
Feb 14 Python
python tkinter Entry控件的焦点移动操作
May 22 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 #Python
Python sys模块常用方法解析
Feb 20 #Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 #Python
pytorch ImageFolder的覆写实例
Feb 20 #Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 #Python
详解python常用命令行选项与环境变量
Feb 20 #Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 #Python
You might like
用Socket发送电子邮件
2006/10/09 PHP
PHP 中的类
2006/10/09 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
关于延迟加载JavaScript
2015/05/05 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
Python验证码识别的方法
2015/07/10 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
python实现百度语音识别api
2018/04/10 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
python 识别图片中的文字信息方法
2018/05/10 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
python样条插值的实现代码
2018/12/17 Python
python获取交互式ssh shell的方法
2019/02/14 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
乡镇平安建设汇报材料
2014/08/25 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
2014年教研员工作总结
2014/12/23 职场文书
北京爱情故事观后感
2015/06/12 职场文书
小学体育组工作总结
2015/08/13 职场文书