Pytorch torch.optim优化器个性化使用

一、简化前馈网络LeNet


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

import torch as t

class LeNet(t.nn.Module):

    def __init__(self):

        super(LeNet, self).__init__()

        self.features = t.nn.Sequential(

            t.nn.Conv2d(365),

            t.nn.ReLU(),

            t.nn.MaxPool2d(22),

            t.nn.Conv2d(6165),

            t.nn.ReLU(),

            t.nn.MaxPool2d(22)

        )

        # 由于调整shape并不是一个class层,

        # 所以在涉及这种操作(非nn.Module操作)需要拆分为多个模型

        self.classifiter = t.nn.Sequential(

            t.nn.Linear(16*5*5120),

            t.nn.ReLU(),

            t.nn.Linear(12084),

            t.nn.ReLU(),

            t.nn.Linear(8410)

        )

    def forward(self, x):

        = self.features(x)

        = x.view(-116*5*5)

        = self.classifiter(x)

        return x

net = LeNet()

二、优化器基本使用方法

  1. 建立优化器实例
  2. 循环:
    1. 清空梯度
    2. 向前传播
    3. 计算Loss
    4. 反向传播
    5. 更新参数

1

2

3

4

5

6

7

8

9

10

11

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(133232))

output = net(input_)

output.backward(output)

optimizer.step()

三、网络模块参数定制

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

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


1

2

3

# # 直接对不同的网络模块制定不同学习率

optimizer = optim.SGD([{‘params‘: net.features.parameters()}, # 默认lr是1e-5

                       {‘params‘: net.classifiter.parameters(), ‘lr‘1e-2}], lr=1e-5)

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


1

2

3

4

5

6

7

8

9

10

# # 以层为单位,为不同层指定不同的学习率

# ## 提取指定层对象

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)

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


1

2

3

4

5

6

7

8

9

‘‘‘调整学习率‘‘‘

# 新建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‘},{……}],集合了优化器的各项参数。

原文地址:https://www.cnblogs.com/ranjiewen/p/9240512.html

时间: 2024-08-30 06:01:29

Pytorch torch.optim优化器个性化使用的相关文章

『PyTorch』第十一弹_torch.optim优化器

一.简化前馈网络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

pytorch 7 optimizer 优化器 加速训练

import torch import torch.utils.data as Data import torch.nn.functional as F import matplotlib.pyplot as plt # torch.manual_seed(1) # reproducible 超参数设置 LR = 0.01 BATCH_SIZE = 32 EPOCH = 12 # fake dataset x = torch.unsqueeze(torch.linspace(-1, 1, 100

09-pytorch(优化器)

优化器 Momentum 从平地到了下坡的地方,加速了他的行走 AdaGrad 让每一个参数都有学习率,相当给人穿了一双鞋子 RMSProp 是两者的结合 ---- import torch import torch.nn.functional as F import torch.utils.data as Data from torch.autograd import Variable import matplotlib.pyplot as plt ### 定义神经网络 class Net(t

MySQL优化器不使用索引的情况

优化器选择不适用索引的情况 有时候,有乎其并没有选择索引而去查找数据,而是通过扫描聚集索引,也就是直接进行全表的扫描来得到数据.这种情况多发生于范围查找.JOIN链接操作等情况.例如 SELECT * FROM orderdetails WHERE orderid>10000 and orderid<102000; 通过SHOW INDEX FROM orderdetails可以看到 可以看到orderdetails有(orderID,ProductID)的联合主键.此外还有对于列OrderI

利用DBMS_STATS包修改统计信息,欺骗优化器,生成糟糕的执行计划

在使用基于成本的优化器的优化器时,优化器生产执行计划时要估算每条SQL的执行成本,选择最佳的执行计划来执行sql语句.通过操纵统计信息就可以简介操纵执行计划的生成. 当然 需要强调的一点是,这是非常危险的行为 1 创建测试表 SQL> create table test_stats  as   2  select * from dba_objects ; Table created. 2 收集统计信息 SQL> EXEC dbms_stats.gather_table_stats(ownnam

Oracle优化器的基础知识(二)

一. 表连接 顾名思义,表连接就是指多个表之间用连接条件连接在一起,使用表连接的目标SQL的目的就是从多个表获取存储在这些表中的不同维度的数据.体现在SQL语句上,含表连接的目标SQL的from部分会出现多个表,而这些SQL的where条件部分则会定义具体的表连接条件. 当优化器解析含表连接的目标SQL时,它除了会根据目标SQL的SQL文本的写法来决定表连接的类型之外,还必须决定如下三件事情才能得到最终的执行计划. 1.表连接顺序 不管目标SQL中有多少个表做表连接,Oracle在实际执行该SQ

Oracle_sql优化基础——优化器总结

优化器的基础: 1.Oracle里的优化器: 优化器是Oracle数据库中内置的一个核心子系统,优化器的目的就是按照一定的判断原则来得到它认为目标sql在当前情形下最高效的执行路径,也就是说是为了得到目标sql的执行计划. Oracle数据库的优化器分为:RBO和CBO两种类型: RBO:基于规则的优化器(在得到sql执行计划时,RBO所用的判断原则为一组内置的规则) CBO:基于成本的优化器(在得到sql执行计划时,CBO所用的判断原则为成本,它会从目标sql诸多可能的执行路线中选择成本值最小

ORACLE优化器RBO与CBO介绍总结

RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO) RBO: Rule-Based Optimization 基于规则的优化器 CBO: Cost-Based Optimization 基于代价的优化器 RBO自ORACLE 6以来被采用,一直沿用至ORACLE 9i. ORACLE 10g开始,

optimizer_mode优化器模式

查询优化器最主要的工作就是接受输入的SQL以及各种环境参数.配置参数,生成合适的SQL执行计划(Execution Plan). Query Optimizer一共经历了两个历史阶段: RBO: Rule-Based Optimization 基于规则的优化器 CBO: Cost-Based Optimization 基于代价的优化器 关于RBO与CBO,一个形象的比喻:大数据时代到来以前,做生意或许凭借多年累计 下来的经验规则(RBO)就能够很好的做出决策,跟随市场变化.但是大数据时代,如果做