pytorch入门(五)Pytorch神经网络工具


核心组件

  1. 层:神经网络的基本结构,将输入张量幻化为输出张量
  2. 模型:层组成的网络
  3. 损失函数:参与学习的目标函数,通过最小化损失函数来学习各种参数
  4. 优化器:如何是损失函数最小,设计优化器

前向传播

     定义好每层后,最后还需要通过前向传播的方式把这些串起来。forward函数的任务需要把输入层、网络层、输出层连接起来,实现信息的前向传播。
    在forward函数中,有些层的函数一般为输入数据,也可以使用nn.functional定义。来自nn.Module的需要实例化,而使用nn.functional定义的可以直接使用。

反向传播

    前向传播函数定义好后,下面就是梯度的反向传播。上一讲中我么介绍了梯度反向传播的方法。上一节;PyTorch提供了自动反向传播的功能,使用工具,直接让损失函数(loss)调用backward()

神经网络工具箱nn

nn.Module

    nn.Module是nn的一个和核心数据结构,它可以是莫格层(layer),也可以是包含多层的神经网络。在实际使用中,常常继承nn.Module生成自己的网络/层
    nn中已经实现了绝大多数层,包括全连接层、损失层、激活层、卷积层、循环层等;能够自动检测到自己parameter,并将其作为学习参数,并且针对GPU运行进行了cuDNN优化。

nn.funtional

    nn中一类是继承nn.module,命名一般为nn.Xxxx,如nn.Linear、nn.Cov2d。另一类是nn.functional中的函数,nn.functional中的函数一般命名为nn.funtional.XX,如nn.funtional.linear、nn.funtionalCov2d。两者的区别如下:

  1. nn.Xxx继承于nn.Module,nn.Xxx需要先实例化并传入参数,然后以函数调用的方式调用实例化的对象并传入数据。能很好的与nn.Sequential结合nn.funtional.xx不能与nn.Seuential结合
  2. nn.Xxx不需要自己定义权重(weight)和偏差(bias);nn.funtional.xx需要自己定义
  3. Dropout操作在训练和测试阶段有区别,使用nn.Xxx定义的Dropout调用model.eval()后剋自动实现转换,nn.funtional.xx没有
    官方建议使用nn.Xxx的方式

优化器

优化器就是在深度学习反向传播过程中,指引损失函数(目标函数)的各个参数往正确的方向更新合适的大小,使得更新后的各个参数让损失函数(目标函数)值不断逼近全局最小。

  • SGD
    优点:

    • 虽然SGD需要走很多步的样子,但是对梯度的要求很低(计算梯度快)。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。
    • 应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。
      缺点:
    • SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。
    • 此外,SGD也没能单独克服局部最优解的问题。
  • Momentum(动量)

    • 动量主要解决SGD的两个问题:一是随机梯度的方法(引入的噪声);二是Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。
      理解策略为:由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。
  • Adam 利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率

    • 首先,Adam中动量直接并入了梯度一阶矩(指数加权)的估计。其次,相比于缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSProp,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩估计。

动态修改学习率

修改参数的方式可以通过修改参数optmizer.params_groups或新建optimizer。optimizer十分轻量,开销小,到那时新的优化器会初始化动量参数,对于使用动量的优化器hi造成收敛中的震荡,所以这里直接采用了optmizer.params_groups。

optmizer.params_groups:长度为1的list,optmizer.params_groups[0]:长度为6的字典,包括权重参数,lr,momentum等

#动态修改学习率                                                                                                                                                                                                                                                                                                                   
for epohch in range(num_epoches):
	if epoch%5 == 0:
		optimizer.param_groups[0]['lr']*=0.1
		print(optimizer.param_groups[0]['lr'])
	for img,label in train_loader:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊~小 l i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值