深度学习神经网络收敛的经验

本人训练过一些深度学习神经网络的例子,既有单纯全连接网络,又有卷积神经网络加全连接网络,也有通过迁移学习来构建的网络。有时会发散,也就是说有关参数越来越大,产生Nan溢出。表现为激活值(也就是前向网络的输出)和代价函数(loss、cost)溢出。基本上可以通过修改超参数来避免。

1 全连接网络的乘法因子矩阵不能初始化为零,要初始化为一个满足正态分布的随机数集,标准差不能太大。训练mnist识别卷积网络时标准差是0.1,训练顺利。使用mnist的训练出来的CNN模型迁移学习识别字母数字混合的字符集时,使用0.1就会造成网络发散,后面改为0.01作为标准差,成功训练。
2 学习率,当你发现loss随着训练过程越来越大,准确率不升高时,最后极有可能会造成激活值溢出,这时你要调低学习率,再训练。同样,mnist训练时的初始学习率0.1可以训练成功,迁移学习网络要设为0.08才不发散。
3 使用下面两行的方法计算交叉熵,它可以把ynew 限制在一个不要太小的值和1.0之间。
        ynew1 = tf.clip_by_value(ynew,1e-12,1.0)
        cross_entropy = -tf.reduce_mean( tf.reduce_sum( y_*tf.log(ynew1) ,1 ) )
   而不要使用tf.nn.softmax_cross_entropy_with_logits_v2,这个没说限制在多小的值以上,但是看结果是非常的小。具体可看:  https://blog.csdn.net/brooknew/article/details/82464367

3 推荐使用tf.nn.softmax_cross_entropy_with_logits_v2计算交叉熵。虽然https://blog.csdn.net/brooknew/article/details/82464367的例子表明tf.nn.softmax_cross_entropy_with_logits_v2算出来的loss比较大,但这个例子只有前向传播,没有和后向传播的优化函数结合。在实际训练中,类似tf.train.GradientDescentOptimizer这样的优化器搭配tf.nn.softmax_cross_entropy_with_logits_v2计算loss更不容易发散,可能内含的softMax计算在优化时也会做某种clip的动作。笔者开始使用ynew1 = tf.clip_by_value(ynew,1e-12,1.0)        cross_entropy = -tf.reduce_mean( tf.reduce_sum( y_*tf.log(ynew1) ,1 ) ) 这种方法训练时需要不断的采用1和2的方法调参才不至于发散。

你可能感兴趣的:(python,tensorflow,深度学习,超参数)