(1)每个优化器都是一个类,一定要进行实例化才能使用,比如:
(2)optimizer:
- 三个属性:存储的是优化器的超参数(如学习速率、momentum等);:参数的缓存;:管理的参数组,是一个list,其中每个元素是一个字典,顺序是params,lr,momentum,dampening,weight_decay,nesterov。
- 其他方法:
- :清空所管理参数的梯度,Pytorch的特性是张量的梯度不自动清零,因此每次反向传播后都需要清空梯度。
- :执行一步梯度更新,参数更新。
- :添加参数组
- :获取优化器当前状态信息字典
(3)optimizer在一个神经网络的epoch中需要实现下面两个步骤:
梯度置零,梯度更新。
深度学习的目标是通过不断改变网络参数,使得参数能够对输入做各种非线性变换拟合输出,本质上就是一个函数去寻找最优解,只不过这个最优解是一个矩阵,而如何快速求得这个最优解是深度学习研究的一个重点——以经典的resnet-50为例,它大约有2000万个系数需要进行计算,那么我们如何计算出来这么多的系数,有以下两种方法:
(1)第一种是最直接的暴力穷举一遍参数,这种方法的实施可能性基本为0,堪比愚公移山plus的难度。
(2)为了使求解参数过程更加快,人们提出了第二种办法,即就是是BP+优化器逼近求解。
因此,优化器就是根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值,使得模型输出更加接近真实标签。
Pytorch提供了一个优化器的库,在这里面给我们提供了十种优化器。
- torch.optim.ASGD
- torch.optim.Adadelta
- torch.optim.Adagrad
- torch.optim.Adam
- torch.optim.AdamW
- torch.optim.Adamax
- torch.optim.LBFGS
- torch.optim.RMSprop
- torch.optim.Rprop
- torch.optim.SGD
- torch.optim.SparseAdam
而以上这些优化算法均继承于,下面我们先来看下所有优化器的基类。定义如下:
- :存储的是优化器的超参数,例子如下:
- :参数的缓存,例子如下
- :管理的参数组,是一个list,其中每个元素是一个字典,顺序是params,lr,momentum,dampening,weight_decay,nesterov,例子如下
- :清空所管理参数的梯度,Pytorch的特性是张量的梯度不自动清零,因此每次反向传播后都需要清空梯度。
- :执行一步梯度更新,参数更新
- :添加参数组
- :加载状态参数字典,可以用来进行模型的断点续训练,继续上次的参数进行训练
- :获取优化器当前状态信息字典
结果为:
完成了上述设定后就可以加载数据开始训练模型了。之前在DataLoader构建完成后介绍了如何从中读取数据,在训练过程中使用类似的操作即可,区别在于此时要用for循环读取DataLoader中的全部数据。
训练过程:
完整的:
验证/测试的流程基本与训练过程一致,不同点在于:
- 需要预先设置,以及将model调至eval模式
- 不需要将优化器的梯度置零
- 不需要将loss反向回传到网络
- 不需要更新optimizer
验证的完整过程: