libtorch学习笔记(10)- 一些具体问题的解决

15 篇文章 0 订阅
14 篇文章 11 订阅

神经网络中碰到的问题

目前主要用CPU用来进行神经网络训练,验证和测试,在以前的用LeNet来基于MNIST图像集进行训练、验证和测试,速度还行,准确率也很高,但是通过VGG的学习,发现机器有点吃不消了,一轮训练都是几个小时,所以出了一个小问题,可能几个小时就白测试了,训练出准确的网络对我来说太重要了。

这是这段时间碰到的一些问题:

Loss rate马上变成0

原因
训练的数据无差异,无法训练
刚开始一上来就碰到这个问题,后来经过排查,发现自己写的将图片转化为张量的实现有问题,导致所有的图片张量都被同一数值填充,导致所有的图片都是一样。碰到这个问题是,可能先要排除一下这种情况。
解决方法

  1. 检查原始训练集,比如是不是所有的图片都一样
  2. 检查图片转换出来张量是不是都一样

Loss rate不收敛或者收敛太慢

原因

  1. 数据集有问题
    曾经碰到这种情况,是由于图片转化为张量的时候,数据填充出错,虽然不会出现Loss rate马上变成 0,但是估计CNN很难提取图像特征,导致损失函数求导无法收敛。
  2. 没有在卷积层后面添加batchnorm
    这个可能也跟训练集没有做很好的转换,比如means和std选择不够好,导致数据没有分布在0附近,
    T t r a n s f o r m = ( T o r i g i n a l − M e a n s ‾ ) / S t d ‾ T_{transform} = (T_{original} - \overline{Means})/\overline{Std} Ttransform=(ToriginalMeans)/Std
batchnorm前batchnorm后
在这里插入图片描述在这里插入图片描述

mean和std的准确选取是很困难的,经过卷积之后分布也会发生变化,所以一般选择一个经验值,前面的笔记中有介绍。所以通过batchnorm将其归一化0点附近,加快训练速度。

  1. 训练集选取没有随机化,每一轮训练的训练的训练集顺序都一样
    每一轮训练之前,最好将训练集shuffle一下,然后再喂入神经网络进行处理,这样做可以让训练集的分布总体保持一致,如果不这样做,初始化训练顺序不好,可能导致训练收敛太慢。
  2. 训练轮数不够
    在前面的LeNet中训练两边准确率就很高了,速度很快,可能是训练集数据尺寸小,图像信息分布均匀,图片只有一个通道。到了VGG中,用了猫狗训练集8000张图片,在CPU上训练速度太慢了,原来也用两轮,后来发现训练的loss rate不太理想,大概0.7左右,后来训练了5次,loss rate降低到0.4左右,验证的准确率也从60%多提高到70%多。
  3. 学习率(learning rate)不合理
    学习率定得太大,比如0.1,可能导致loss起起伏伏,收敛不稳定;学习率定得太小,比如0.00001,导致收敛非常缓慢。
  4. 批处理的大小
    图片处理的张量通常是四阶的,为
    I n p u t T e n s o r = [ 批 处 理 大 小 ( b a t c h s i z e ) , 3 ( R G B ) , 图 片 宽 度 , 图 片 高 度 ] Input Tensor = [批处理大小(batchsize), 3(RGB),图片宽度,图片高度] InputTensor=[(batchsize),3(RGB)]
    batch size选择也会影响收敛速度,原来我用1,发现loss rate收敛效果不好,老是起起伏伏,后来换成了64,效果有所改善,就是内存消耗太大,居然用了近16GB,所以这个选择还得根据机器的内存状况酌情选择。个人感觉batch size加大,训练时间也稍微减少,后面有时间做一个实现,看看有多大影响。

解决方法

  1. 选择更丰富的训练集,调试张量组织是否正确
  2. 在卷积层后面添加BatchNorm层
  3. 每轮训练前,shuffle一下训练集
  4. 增加训练轮数
  5. 选择合适学习率,比如刚开始稍微大点,后面收敛稳定的时候,选择更小的学习率
  6. 根据自己的内存选择合适的批处理大小

Inplace

在神经网络中处理张量,为了节省内存,减少copy,有些网络层可以进行inplace处理,比如RELU和DropOut,但是这个不能随便用, RELU没有问题,但是DropOut在训练的过程中不能使用inplace=true的option,否则会导致损失函数求导过程中会crash。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值