0
点赞
收藏
分享

微信扫一扫

DataWhale——《深入浅出Pytorch》2

船长_Kevin 2022-03-18 阅读 115

DataWhale——《深入浅出Pytorch》2


一、损失函数(Loss Function)

在官方的API中提供了许许多多的损失函数,用来优化模型的表现,比如说有
PyTorch在torch.nn模块为我们提供了许多常用的损失函数,比如:MSELoss,L1Loss,BCELoss… ,但是随着深度学习的发展,官方不可能将所有的损失函数进行封装,因此官方给出这样的一条路径就是,可以进行自定义的loss函数封装,通过学习后,我发现可以有以下几种方式进行去实现loss函数的定义

  • 以函数方式定义
def my_loss(output, target):
    loss = torch.mean((output - target)**2)
    return loss
  • 以类方式定义

参考链接
1、https://www.kaggle.com/bigironsphere/loss-function-library-keras-pytorch/notebook
2、pytorch教程之损失函数详解——多种定义损失函数的方法

二、调整学习率

学习率的选择是深度学习中一个困扰人们许久的问题,学习速率设置过小,会极大降低收敛速度,增加训练时间;学习率太大,可能导致参数在最优解两侧来回振荡。但是当我们选定了一个合适的学习率后,经过许多轮的训练后,可能会出现准确率震荡或loss不再下降等情况,说明当前学习率已不能满足模型调优的需求。此时我们就可以通过一个适当的学习率衰减策略来改善这种现象,提高我们的精度

  • 使用官方的文件
  • lr_scheduler.LambdaLR
  • lr_scheduler.MultiplicativeLR
  • lr_scheduler.StepLR
  • lr_scheduler.MultiStepLR
  • lr_scheduler.ExponentialLR
  • lr_scheduler.CosineAnnealingLR
  • lr_scheduler.ReduceLROnPlateau
  • lr_scheduler.CyclicLR
  • lr_scheduler.OneCycleLR
  • lr_scheduler.CosineAnnealingWarmRestarts
  • 进行自定义学习率变化函数
    这里主要是通过对adjust_learning_rate来改变param_grouplr的值来实现学习率根据自定义的规则进行变化,在学习中举了一个例子,以每30轮就下降一次学习率
def adjust_learning_rate(optimizer, epoch):
    lr = args.lr * (0.1 ** (epoch // 30))
    for param_group in optimizer.param_groups:
        param_group['lr'] = lr

三、模型调整

随着深度学习的发展,模型的参数越来越大,许多开源模型都是在较大数据集上进行训练的,比如Imagenet-1k,Imagenet-11k,甚至是ImageNet-21k等,也好比之前地时装分类,虽然看起来图像很小,而且数据集看起来还不算很大,但是在实际生活中,假若我们需要自己DIY一个神经网络出来是没有问题的,但是在训练的过程由于数据量的不足,对其容易造成过拟合的现象,但是如果数据量充足,那么在花费在预训练的成本,以图像标注为例子,其成本的花费可以说是几何级别的增加,因此可以通过在官方给出的一个预训练好的模型,拿来自己使用,在使用前先了解模型的大概架构,然后通过迁移学习,固定一些层的权重,改写部分层的实现功能,这样可以节省时间的同时,效率还能得到一定的提高

四、半精度训练

当我看到这一节的内容的时候,让我想起了前几次在算法课上,老师在讲解动态规划的算法时候,提到一个内容便是图像压缩,一张图片是由RGB三通道组成的,每一个像素点的取值都是[0,255],即可以简述为一张彩色的图片是根据RGB这三个通道的三个高维矩阵最后组成的一张看起来是彩色的图片,但是在进行模型训练的过程中,如果使用原图进行训练的话,那么就会对计算上造成一定的困扰,相反可以对图片进行一定的压缩,当然有很多种的压缩方式,笔者认为大致可以分成两类

  • 无损压缩
    无损压缩,比如说通过傅里叶变换,因为最终是可以把原本的图像恢复出来,因此不会对图片造成特征上的损失,或者可以根据图片的像素点的取值,比如说某一个矩阵中图片的像素点的取值可以在2^5次方内可以搞定,因为正常的图片是通过8bite进行存储的,在上述笔者所举的例子中,那么久可以通过缩减其存储的位置来进行图像压缩,这也是这一章节所提到的半精度训练,也就是可以理解是稀疏矩阵,存在的0元素过多的时候可以使用这种方法,而且无损压缩可以做到对特征的提取不会造成任何的影响
  • 有损压缩
    在现在比较出名的卷积神经网络,即设置卷积核的大小,然后通过矩阵乘法,可以对图像进行一定的压缩,但是这种压缩是一种有损压缩,也就是说,图像压缩了但是特征也相对应的没有keep住之前的状态,只能是通过最后模型表现的结果来确定这种压缩方法是否有效,而且这种压缩对图片进行造成的损坏是不能恢复的

总结

通过对本章节的学习,我对pytorch进行损失函数的自定义,学习率的调整,以及可以使用一些预训练好的模型能够进行一定的改动,基于迁移学习的思想,再者可以在优化神经网络计算算法上做出一定的改进,可以通过半精度训练,压缩,分块训练等

举报

相关推荐

0 条评论