TensorFlow编程中踩过的坑(1)

前言

使用TensorFlow框架跑神经网络模型过去了近2个月了,虽不能说熟练掌握,但也略有心得,中间也踩过很多坑,今天就细数下编程中踩过的坑。

踩过的坑

  1. 优化器AdadeltaOptimizer的学习率设置问题

    AdadeltaOptimizertf.train包中的一个优化器,它可以自动调整学习率。最开始的时候我看到这个优化器觉得很厉害的一个,结果使用后发现loss根本不下降,本来还以为是用法用错了呢,几经周折,最后才发现是学习率设置的问题。

     # set optimizer
    optimizer = tf.train.AdadeltaOptimizer()
    # set train_op
    train_op = slim.learning.create_train_op(loss, optimizer)
    

    AdadeltaOptimizer优化器默认的learning_rate=0.001,非常的小,导致梯度下降速度非常慢,最后的解决方案是:提高学习率

     # set optimizer
    optimizer = tf.train.AdadeltaOptimizer(learning_rate=1)
    # set train_op
    train_op = slim.learning.create_train_op(loss, optimizer)
    
  2. batch_norm_decay参数设置的问题

    batch norm 是Google大佬15年提出来的一个用于提高CNN网络性能的正则方法,它的具体内容就不细说了,在这里留下它的论文链接。

    我踩到了一个很神奇的坑。 batch norm需要设置一个名为batch_norm_decay的参数,它的默认参数是0.997,我当时没有改变这个参数,导致一个神奇的问题:在训练集上精确率在99%了,在测试集上精确率还在50%徘徊。这个神奇的问题困扰了我很久,最后多方请教后才解决。

    问题在于,batch norm在训练的时候使用的是mini_batch的均值和方差来估计整个数据集的分布,这没有问题。但是在测试的时候,需要根据训练集估计出来一个合适的均值和方差来调整训练集的分布,那么问题来了:如何算测试集的均值和方差呢?

    论文中采用的是batch_norm_decay的方法,可以简单的描述为下式:

    其中的$\lambda$就是所说的batch_norm_decay,如果它设置的太小,测试集上的均值的收敛速度就非常慢,而我的训练数据又非常小,导致测试集上精确率无法提高。

    问题的解决方法就是:减小batch_norm_decay的值,我设置为0.95,顺利解决了问题。

后记

不得不说,TensorFlow中的坑是真多,一点点采坑,一点点学习。以后有新的体悟了再更新。

资料

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by wanghan0501,分享从这里开始,精彩与您同在

Table of Contents