(使用Caffe的)卷积神经网络设计中遇到的问题

这两天在折腾Caffe的时候遇到过各种奇怪的问题,拿几个感觉比较重要的来说一下。之后想到什么再追加。

GPU运算无法正常使用

环境预载期错误(3 vs. 0)

Check failed: status == CUDNN_STATUS_SUCCESS (3 vs. 0)  CUDNN_STATUS_BAD_PARAM

似乎是因为有其他设备在使用GPU导致的,我的情况是等待一段时间就好了。

网络加载期错误(2 vs. 0)

Check failed: error == cudaSuccess (2 vs. 0)  out of memory

不清楚具体是显存还是内存空间不足引致的,一般考虑减少卷积层卷积核数目、减少全链接层输出数目或者掏钱买内存。

模型训练失败

如果模型在训练结束后的Accuracy非常糟糕,大致可以断言模型的训练失败了。模型训练的失败有很多可能的原因,需要看训练Log来判定。当然,判断模型在一特定迭代位置是否应该完成训练取决于数据量和模型的结构复杂度,有的要10k+迭代才勉强能用,有的1k+次迭代就非常精准了,在训练时Accuracy和Loss也会上下波动(甚至是巨大的波动,我给吓到过几次),要仔细判断是真的出了问题还是单纯的迭代没跑够。

Loss在某一数值附近上下波动

这种情况如果持续多次可以认为模型无法收敛。其特征是Loss首先缓慢下降,然后突然上升。这也有例外,因为模型在收敛之后也会进入这种状态,Accuracy和Loss进入期望范围的话就可以结束训练了。

标签编号

图像数据的标签编号是从0开始的,在Caffe内部作为列表索引使用。因为网络输出0永远是错的,而标签中的N从来没被成功匹配过,给定从1开始的标签会导致模型无法收敛的问题。

Weight或Bias未随机初始化

原来以为只要Weight随机初始化就可以了,没想到Bias没有随机初始化也会导致模型无法收敛的问题。在一切看上去没什么问题的时候,如果模型实在无法收敛,可以考虑一下这种情况。

Loss保持不变或长期停留在某一数值附近

图像通道顺序

在Caffe中,图像读取的结果以BGR方式储存,熟悉图像文件格式的同学可能会留意到,这是BMP文件的通道排列方式。而JPEG和PNG等更常用的压缩格式的排列通常为RGB,因此要使用Transformer将其通道重排。

ReLU激励层

ReLU激励层默认会将负的梯度重设为0以避免模型发散,但是有的时候短暂的发散是训练过程中必要的,注意配置参数中的negative_slope 属性,这个属性会与负梯度相乘,默认为0。将其设为1或一些比较小的数字能够解决ReLU层卡死Loss的问题。

激励层特性

ReLU和Sigmoid等激励函数不同,ReLU能够原位(In-place)进行激励操作而不需要分配额外的内存,在链接网络图时注意区分其用法。正确的ReLU连接应使其Top和Bottom参数指向同一连接点。错误得使用ReLU层_可能_会导致激励失败,引致一些神奇的状况。

模型发散

这一般是学习率过高造成的。经验上取LearningRate=0.001较为合适。

Predict异常

Predict结果基本保持不变

图像数据尺度

因为使用[0, 1]范围内的浮点数能提升其精度(参见IEEE关于浮点数的标准,-1~1之间的浮点数取值是最密集的),通常使用Caffe训练模型时会将分布于[0, 255]的通道量编码到[0, 1]。如果传入的图像没有经过编码会导致一系列非常大的数据在神经网络中传播,最终导致恒定输出。

posted @ 2017-01-26 02:54  PENGUINLIONG  阅读(8250)  评论(0编辑  收藏  举报