一、简化前馈网络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( 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
- 反向传播
- 更新参数
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( 1 , 3 , 32 , 32 )) 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'},{……}],集合了优化器的各项参数。
相关推荐
PyTorch 提供了一个强大的 `torch.optim` 模块,它包含了多种优化算法,如随机梯度下降(SGD)、Adam、RMSprop 等。本文将详细介绍 `torch.optim` 的使用方法,并着重讲解如何根据需求自定义优化器,例如添加 L1 正则...
pytorch API documentation 0.4.1 and 0.1.11 Python API torch torch.nn torch.nn.functional torch.Tensor Tensor Attributes torch.autograd torch.cuda torch.distributed torch.distributions torch...
在PyTorch中,`torch.optim` 是一个用于优化神经网络权重的重要库,它提供了多种常用的优化算法,如SGD(随机梯度下降)、Adam、RMSprop等。本篇文章将探讨如何在PyTorch中个性化地使用这些优化器。 首先,我们来看...
梯度下降法是最著名的优化算法之一,本文基于Python和Pytorch编写了梯度优化程序Gradient_optim,并将结果与Pytorch中自带的梯度优化器torch.optim对比。 1.程序适用于任意维解析函数的无约束优化问题,求解最小值及...
在实际使用中,通常会结合torch的其他功能,如torch.nn.Module定义模型结构,torch.optim进行优化,以及torch.utils.data.Dataset和DataLoader进行数据加载和预处理,共同构建复杂的GNN模型。 为了正确安装torch_...
使用这些调度器时,需要先创建一个优化器实例,如`torch.optim.SGD`或`torch.optim.Adam`,然后将调度器附加到优化器上,通过`scheduler.step()`在每次迭代后更新学习率。在实际应用中,可以根据模型的复杂性、数据...
`torch_optim_sparse-0.1.1-py3-none-any.whl` 是一个与Python相关的库文件,特别地,它是针对PyTorch框架的一个优化器扩展库。这个库的名称暗示了它可能专注于实现针对稀疏参数的优化算法,这对于处理大规模稀疏...
在PyTorch中,我们可以使用`torch.Tensor`来表示这些矩阵,并利用优化库如`torch.optim`进行参数更新。以下是一段简单的PyTorch矩阵分解实现的代码框架: ```python import torch from torch import optim # 假设R...
PyTorch提供了多种优化器,如梯度下降法`optim.SGD`、Adam优化器`optim.Adam`等。优化器负责更新网络参数,以最小化损失函数。在训练过程中,通过调用`optimizer.step()`来执行一次参数更新,`optimizer.zero_grad...
torch.nn 一个神经网络库与autograd设计了最大的灵活性torch.optim 一种与torch.nn一起使用的优化包,具有标准优化方法,如SGD,RMSProp,LBFGS,Adam等。 torch.multiprocessing python多处理,但是具有魔法内存...
PyTorch提供了强大的工具和API,如torch.nn和torch.optim,用于构建和优化深度学习模型。 ALBERT,全称为“A Lite BERT”,是由谷歌研究团队在2019年提出的一种轻量级的BERT变体。BERT(Bidirectional Encoder ...
这个库的版本为2.0.9,专为Python 3.10和macOS 10.15的x86_64架构进行了优化,并且需要与特定版本的torch——1.13.0+cpu一同使用。本文将详细介绍torch_scatter的功能、安装过程以及如何与torch配合工作。 一、...
在PyTorch中实现MNIST手写体分类是一项基础任务,它可以帮助初学者理解深度学习的基本原理和PyTorch框架的使用。MNIST数据集包含了0到9的手写数字图像,是许多入门级机器学习和深度学习教程的首选数据集。下面我们将...
11. torch.legacy 模块 torch.legacy 模块提供了向后兼容性的功能,允许从 Torch 移植来的 legacy 代码。 PyTorch 提供了完整的神经网络实现功能,包括定义网络、损失函数、反向传播、更新权重等。 PyTorch 的工具...
- **优化器**:PyTorch的`optim`模块提供了多种优化算法,如SGD(随机梯度下降)、Adam、RMSprop等,用于更新网络参数。 - **保存和加载模型**:使用`torch.save()`和`torch.load()`可以方便地保存和加载模型权重和...
标题中的"torch_swa_examples"指的是使用PyTorch实现Stochastic Weight Averaging(SWA)的示例代码。SWA是一种优化技术,它在深度学习模型训练的后期阶段平均多个周期的权重,以获得更稳定的解决方案,从而提高模型...
在PyTorch中,我们可以使用`torch.optim`模块的优化器(如`SGD`或`Adam`)进行梯度下降。同时,我们还需要记录并绘制训练过程中损失(loss)和预测精度的变化,这可以通过`torch.utils.tensorboard`或自定义Python脚本...