本打算使用InceptionV4进行构建网络进行二分类实验,最后发现keras没有InceptionV4的预训练模型,决定先用keras自带的InceptionV3预训练模型搭建网络。
我们的问题起源于在构建inceptionV3进行二分类训练时,训练过程一帆风顺,拥有95%以上的准确率,而在进行测试的时候,预测结果总是偏向一个结果[1. , 0.]。
最开始我推测是我网络构建上出了问题,因为观测到的现象是经过3-1到3-2一个晚上的训练,训练集与验证集上的准确率都很高的情况下,测试的结果确全部导向一个类,所以问题出在网络中的自定义部分使用的**函数?还是keras自动生成数据的方式上?
这一天内我进行了各种尝试,我试过更换最后的全连接层的神经元数量,并且更换响应的**函数(一个神经元加上做sigmod二分类,或者两个神经元加上softmax做多分类下的二分类),最后结果却并无明显改变。
我的程序是过去使用VGG16为主干网络做的二分类,为了验证keras自动生成训练数据的正确性,以及网络最后自定义的用来分类的全连接层是否可靠,我换回了VGG16进行测试,结果显示后者无异常。
这就奇怪了,难道说是VGG与Inception之间有一些区别,需要再外围网络上改动吗?以我的水平我觉得这是一个短时间内不可能得到答案的思路。
我的做法是:上网再找一个例程测试,最后我找到了一个作者自己跑出来并且放了训练截图的程序,临近傍晚的时候我花了一个多小时跑出了结果(之前就发现公司的服务器环境出了问题,我也不敢瞎装,就在另一台空闲的服务器上在anaconda3的虚拟环境下装了tensorflow和keras,具体啥版本忘了,下次更),经过CPU吭哧吭哧跑完,使用对方的例程一测试,没问题,程序正常,结果正常。。。
经过比对,原来是在预测的时候,图片送进模型前的预处理不一样,对方引用了 keras.applications.inception_v3.preprocess_input
我将自己的测试程序添加此处理后也成功进行了测试,之后去测试今天一天跑出来的前几个模型,除了一些一开始就发现不对劲停掉的,其他的都表现正常了。
数据预处理解析(待补充)
这启示我们什么呢?
1.忽略了数据预处理的细节,就会出现后面预测的时候的问题,谁能想到是投喂数据与测试数据不同呢?这告诉我们,很多事情一定要搞清楚,否则团团转,其次也告诉我们清晰的思路很重要,在解决问题发散思路的时候要有个度,如果当初我看到了VGG和Inception的表现不同一头扎进网络结构里面,那直到我写这些东西的时候估计还陷在里面(不禁感叹:啊!我运气真好哈哈哈哈!)
2.keras这种工具的封装对于初学者来说是非常方便,可是不够灵活,不管是很多网友还是开发者研究者,很多人都有这种看法:封装得简洁的东西会失去一定的灵活性,这与这次的实践不谋而合。想要深入研究以至于走向创新,还是要一定程度深入底层原理,自己在一定程度上亲手搭建,才会放心,并且都在意料之中。
3.别以为自己看了几堂课就啥都会了,需要在实践中扎实内功。实践中还反映了工作习惯不好,版本管理一塌糊涂,
4.还是缺一门手艺啊。。。。就这么搞啥时候是个头啊,这两个月除了这些必须要在一个方面学一门扎实的技能,神经网络只是一种工具,调教好它也是本事,可是自己要能当饭吃的手艺,希望自己能在两个月内做到。
今天全国除了湖北只有6例,想必也快到了回公司那边的时候了,上大学以来就没在家呆过这么长时间。。。唉,还是离父母近一点好啊。