pytorch中的优化器optimizer.param_groups用法

 更新时间:2021年05月31日 11:40:03   作者:我是天才很好  
这篇文章主要介绍了pytorch中的优化器optimizer.param_groups用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

optimizer.param_groups: 是长度为2的list,其中的元素是2个字典;

optimizer.param_groups[0]: 长度为6的字典,包括[‘amsgrad', ‘params', ‘lr', ‘betas', ‘weight_decay', ‘eps']这6个参数;

optimizer.param_groups[1]: 好像是表示优化器的状态的一个字典;

import torch
import torch.optim as optimh2
w1 = torch.randn(3, 3)
w1.requires_grad = True
w2 = torch.randn(3, 3)
w2.requires_grad = True
o = optim.Adam([w1])
print(o.param_groups)
[{'amsgrad': False,
  'betas': (0.9, 0.999),
  'eps': 1e-08,
  'lr': 0.001,
  'params': [tensor([[ 2.9064, -0.2141, -0.4037],
           [-0.5718,  1.0375, -0.6862],
           [-0.8372,  0.4380, -0.1572]])],
  'weight_decay': 0}]
Per the docs, the add_param_group method accepts a param_group parameter that is a dict. Example of use:h2import torch
import torch.optim as optimh2
w1 = torch.randn(3, 3)
w1.requires_grad = True
w2 = torch.randn(3, 3)
w2.requires_grad = True
o = optim.Adam([w1])
print(o.param_groups)
givesh2[{'amsgrad': False,
  'betas': (0.9, 0.999),
  'eps': 1e-08,
  'lr': 0.001,
  'params': [tensor([[ 2.9064, -0.2141, -0.4037],
           [-0.5718,  1.0375, -0.6862],
           [-0.8372,  0.4380, -0.1572]])],
  'weight_decay': 0}]
nowh2o.add_param_group({'params': w2})
print(o.param_groups)
[{'amsgrad': False,
  'betas': (0.9, 0.999),
  'eps': 1e-08,
  'lr': 0.001,
  'params': [tensor([[ 2.9064, -0.2141, -0.4037],
           [-0.5718,  1.0375, -0.6862],
           [-0.8372,  0.4380, -0.1572]])],
  'weight_decay': 0},
 {'amsgrad': False,
  'betas': (0.9, 0.999),
  'eps': 1e-08,
  'lr': 0.001,
  'params': [tensor([[-0.0560,  0.4585, -0.7589],
           [-0.1994,  0.4557,  0.5648],
           [-0.1280, -0.0333, -1.1886]])],
  'weight_decay': 0}]
# 动态修改学习率
for param_group in optimizer.param_groups:
    param_group["lr"] = lr 
# 得到学习率optimizer.param_groups[0]["lr"] h2# print('查看optimizer.param_groups结构:')
# i_list=[i for i in optimizer.param_groups[0].keys()]
# print(i_list)    
['amsgrad', 'params', 'lr', 'betas', 'weight_decay', 'eps']

补充:pytorch中的优化器总结

以SGD优化器为例:

# -*- coding: utf-8 -*-
#@Time    :2019/7/3 22:31
#@Author  :XiaoMa
 
from torch import nn as nn
import torch as t
from torch.autograd import Variable as V
#定义一个LeNet网络
class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.features=nn.Sequential(
            nn.Conv2d(3,6,5),
            nn.ReLU(),
            nn.MaxPool2d(2,2),
            nn.Conv2d(6,16,5),
            nn.ReLU(),
            nn.MaxPool2d(2,3)
        )
        
        self.classifier=nn.Sequential(\
            nn.Linear(16*5*5,120),
            nn.ReLU(),
            nn.Linear(120,84),
            nn.ReLU(),
            nn.Linear(84,10)
            )
    def forward(self, x):
        x=self.features(x)
        x=x.view(-1,16*5*5)
        x=self.classifier(x)
        return x
net=Net()
 
from torch import optim #优化器
optimizer=optim.SGD(params=net.parameters(),lr=1)
optimizer.zero_grad()   #梯度清零,相当于net.zero_grad()
 
input=V(t.randn(1,3,32,32))
output=net(input)
output.backward(output)     #fake backward
optimizer.step()    #执行优化
 
#为不同子网络设置不同的学习率,在finetune中经常用到
#如果对某个参数不指定学习率,就使用默认学习率
optimizer=optim.SGD(
    [{'param':net.features.parameters()},    #学习率为1e-5
    {'param':net.classifier.parameters(),'lr':1e-2}],lr=1e-5
)
 
#只为两个全连接层设置较大的学习率,其余层的学习率较小
special_layers=nn.ModuleList([net.classifier[0],net.classifier[3]])
special_layers_params=list(map(id,special_layers.parameters()))
base_params=filter(lambda p:id(p) not in special_layers_params,net.parameters())
 
optimizer=t.optim.SGD([
    {'param':base_params},
    {'param':special_layers.parameters(),'lr':0.01}
],lr=0.001)

调整学习率主要有两种做法。

一种是修改optimizer.param_groups中对应的学习率,另一种是新建优化器(更简单也是更推荐的做法),由于optimizer十分轻量级,构建开销很小,故可以构建新的optimizer。

但是新建优化器会重新初始化动量等状态信息,这对使用动量的优化器来说(如自带的momentum的sgd),可能会造成损失函数在收敛过程中出现震荡。

如:

#调整学习率,新建一个optimizer
old_lr=0.1
optimizer=optim.SGD([
                {'param':net.features.parameters()},
                {'param':net.classifiers.parameters(),'lr':old_lr*0.5}],lr=1e-5)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python并发执行的几种实现方法

    Python并发执行的几种实现方法

    在Python中多线程是实现并发的一种方式,多线程可以让程序在同一时间内进行多个任务,从而提高程序的效率和执行速度,这篇文章主要给大家介绍了关于Python并发执行的几种实现方法,需要的朋友可以参考下
    2024-08-08
  • python之多种方式传递函数方法案例讲解

    python之多种方式传递函数方法案例讲解

    这篇文章主要介绍了python之多种方式传递函数方法案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Python基于BeautifulSoup和requests实现的爬虫功能示例

    Python基于BeautifulSoup和requests实现的爬虫功能示例

    这篇文章主要介绍了Python基于BeautifulSoup和requests实现的爬虫功能,结合实例形式分析了Python使用BeautifulSoup和requests库爬取网站指定信息的相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • python Flask实现restful api service

    python Flask实现restful api service

    本篇文章主要介绍了python Flask实现restful api service,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 查看Python依赖包及其版本号信息的方法

    查看Python依赖包及其版本号信息的方法

    今天小编就为大家分享一篇查看Python依赖包及其版本号信息的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • OpenCV 读取图像imread的使用详解

    OpenCV 读取图像imread的使用详解

    这篇文章主要介绍了OpenCV 读取图像imread的使用详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • 解决python 输出到csv 出现多空行的情况

    解决python 输出到csv 出现多空行的情况

    这篇文章主要介绍了解决python 输出到csv 出现多空行的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python中窗口操作的完整教程

    Python中窗口操作的完整教程

    在使用 Python 进行窗口操作时,可以执行各种任务,如最大化、最小化、置顶窗口,本文将详细介绍这些操作,并提供丰富的示例代码,希望可以更好地帮助大家了解如何利用 Python 操纵窗口
    2023-11-11
  • 浅谈flask源码之请求过程

    浅谈flask源码之请求过程

    这篇文章主要介绍了浅谈flask源码之请求过程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Python(wordcloud)如何根据文本数据(.txt文件)绘制词云图

    Python(wordcloud)如何根据文本数据(.txt文件)绘制词云图

    这篇文章主要给大家介绍了关于Python(wordcloud)如何根据文本数据(.txt文件)绘制词云图的相关资料,词云Wordcloud是文本数据的一种可视化表示方式,它通过设置不同的字体大小或颜色来表现每个术语的重要性,需要的朋友可以参考下
    2024-05-05

最新评论