关于tensorflow框架下训练结果异常调试记录-----关于mobilenet基础网络中的BN层引起的问题(二)

问题描述:

续接上篇博客所描述的问题,使用了tensorflow给出的mobilenetv1模型作为基础模型,后接自己的回归层,训练后的模型拿出来直接测试发现测试结果都是一样的,不管输入什么图像结果都是一样的,于是循着上篇博客解决问题的方式去找代码中存在的问题,在代码上发现没有存在类似的错误,代码本身似乎是没有bug的,就是找不到什么原因,在网上找了很多的参考,现记录解决该问题的过程和方式。
首先要感谢前人趟过的水踩过的坑,主要参考博客如下(当然还有很多其他的参考就不再一一列举了):
https://blog.csdn.net/qq_36187544/article/details/91429723#comments
https://blog.csdn.net/dongjbstrong/article/details/80447110#comments

解决问题记录:

(1)出现上述问题,首先检查自己的代码,在mobilenetv1网络的模型代码中是否有BN层,如果漏了BN层是会出问题的!!!不要忘记加BN层
(2)网络模型的代码中有了BN层之后,检查BN层的参数是否在训练过程中随着更新了
(3)检查BN层的参数是否存储下来了
注意:
如果BN层的参数没有更新或者没有存储下来那么在后续的测试时候就会出问题。如果BN层的参数训练过程中想要使得BN的参数随着更新并且保存下来,是需要加入特殊代码处理的,具体所需代码参见链接https://blog.csdn.net/dongjbstrong/article/details/80447110#comments,该链接中的代码我实际验证过,是可行的。
(4)这里我想重点说一下的是最后这一步,而我也是在这里差点入坑没出来的了,可能也是因为之前对BN层的理解以及tf中相关的实现不那么熟悉的。在按照上述的三个步骤检查并修改完自己的代码之后,由于心切等各种原因,就迭代了很少的轮数想要看一下初步结果到底是不是对的,当然这里也是设置了在训练的时候BN层的is_training设为True,然后问题来了(看到网上也有很多人说遇到这种问题):
第一、如果测试的时候设置为False,那么一次只输出一张图像进行测试也就是说测试的batch size为1的时候,得到的结果完全不对(batch size设置为较大的时候也是一样的结果),结果很奇葩,我这里出现的结果是不管输入什么图像输出的结果都是一样的,于是又重复检查训练代码和测试代码看看有没有问题,各种测试各种断点调试,都想哭了也没找到问题出在哪里。
第二、看到网上说也可以在测试的时候将is_training设置为Tue,于是我设置为True了,这时候很神奇,测试batchsize为1的时候有结果了,但是结果不好,batch size设置为较大的时候结果就比较好。oh my god! 发生了什么,找到tensorflow的官方说明,BN层的函数里面的is_training设置为True的时候是会使用一个设置好的decay来对滑动平均值和滑动方差进行更新的,如果设置为False那么就不会去更新这两个值,而是使用已经训练得到的这两个值了。
所以,问题出在哪里呢?BN层的各个参数也是存储下来了的,测试的时候模型参数和BN层的参数也load进来了,那么问题到底出在哪里了呢?
再看BN函数里面的参数,有一个叫做decay的参数,这个参数控制了滑动平均值和滑动方差的更新速度,而这个参数在BN的函数里设置了一个默认值0.999。同时,又看到另外一个人的文章谢了一句话:“使用BN要慢慢的等到它warm”,当时看到这句话真心没太理解什么意思,后来又结合BN函数中的参数以及BN的相关知识,大概理解这个意思是使用BN层需要迭代的次数较多等到它的参数慢慢的更新到比较优的时候再使用那么效果会比较好。
说了那么多,可能说的也不太清楚,总之最后就是将上述的decay参数稍作了调整,将其调小了,然后迭代的次数也增加,耐心等待后,训练出来的模型经过测试是OK的,在测试时候将is_training设置为False,这时候不管输入的测试batchsize是多大,其测试结果都和预计的差不多,而且输入的测试batchsize不一样的时候其测试结果也是一样的哦!真的好甜哦!

总结一句话,想要调明白训练代码和测试代码,想要调明白训练参数,必须务必要把原理弄明白!

以上仅为个人调试代码踩坑,不是教程,有说的不对的地方莫见怪~

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值