引言
在深度学习框架caffe的使用过程中,加深了对神经网络的理解,同时也将神经网络知识从理论落到实处。希望日后多多拿代码时间,将该总结继续增广~~
深度学习中常用的调节参数
学习率
步长的选择:你走的距离长短,越短当然不会错过,但是耗时间。步长的选择比较麻烦。步长越小,越容易得到局部最优化(到了比较大的山谷,就出不去了),而大了会全局最优。一般来说,如ResNet前32k步,很大,0.1;到了后面,迭代次数增高,下降0.01,再多,然后再小一些。
caffe训练时Loss变为nan的原因
由小变大易出nan
原因:有小变大过程中,某个梯度值变得特别大,使得学习过程难以为继
例如:10x10x256
的输入,输出如果是20x20x256
或者10x10x512
,如果是使用Inception-ResNet-v2或者直接进行卷积操作,很容易出现nan的情况。
具体解决方案:
- 参考Inception的设计原则重新设计网络
- 添加Batch normalization试试
使用ResNet-Block或者Inception技术,最后的结果通过Bitwise Operation进行组合,而不是采用按channel Concatenate进行的。
尤其是BitWise multi进行组合的时候,往往会产生很大的数据悬殊,会导致梯度爆炸现象从而出现Loss 为nan
梯度爆炸
原因:梯度变得非常大,使得学习过程难以继续
现象:观察log,注意每一轮迭代后的loss。loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。
措施:
- 减小solver.prototxt中的
base_lr
,至少减小一个数量级。如果有多个loss layer
,需要找出哪个损失层导致了梯度爆炸,并在train_val.prototxt中减小该层的loss_weight
,而非是减小通用的base_lr
。 - 设置<