keras训练准确率和损失表现都非常好,预测时准确率和损失都非常差

问题简述:
在keras框架下使用model.fit得到的训练准确率和损失表现都非常好,但是在相同的训练集上使用model.evaluate得到的准确率和损失都非常差
keras中的model.fit和model.evaluate在同样的数据集上的准确率acc和损失值loss存在巨大的差异

https://github.com/keras-team/keras/issues/6977
上面的github链接讨论了多种可能,

1.model.fit和model.evaluate的batch_size不匹配:model.fit时若指定了batch_size,在使用model.evaluate时的batch_size默认为16,而使用model.evaluate时并未设置与使用model.fit时同样的batch_size。解释大概为不同的batch_size的BatchNormalizaiton会产生不同的效果不同(当然在神经网络中存在BatchNormalization层时)

结果:匹配batch_size了也无效

2.dropout,batchnorm的影响:model.fit时的dropout层是设置dropout参数的,比如说0.5,而model.evaluate设置的dropout参数为1,keras在使用这两个function的时候会呈现两种模式(training mode, predict mode),model.fit时为training mode,dropout参数值为0.5,model.evaluate时为predict mode,dropout参数值自动调至1。同样的,batchnorm在两种模式下的效果也是不一样的。

结果:这样的话问题就有一个很好的解决思路,就是在model.evaluate时,把模式定为training mode,这样就可以得到和训练时一样的效果。事实上也是这样的,使用from keras import backend as K, K.set_learning_phase(0)(这里是强制整个session为training mode包括在model.fit后使用model.evaluate),调用model.fit训练后,直接在这个session里对之前的训练集数据使用model.evaluate,得到的是与model.fit训练的最后一次的结果是非常相近的。但是你只在这个session里强制设置了training mode,把该模型保存后再重新开一个py文件或ipynb文件读取该模型(由于项目指定的tensorflow版本较低,使用model.save保存模型所有内容有问题,所以使用了model.save_weights;model.save下,下述方法没试),再使用对上述相同的训练集数据进行model.evaluate,又出现了很差的准确率和损失,当然即使在模型读取前再写上K.set_learning_phase(0)。

等等还有讨论的其他可能原因就不细说了,来说说最简单粗暴的解决方法:

####################################################################################
####################################################################################
###################################超粗的分割线#######################################
####################################################################################
####################################################################################

别用keras了,直接用tensorflow码代码把。。。。。keras的好多Conv2d,Batchnormalization,Dense啊,在tf.layers里都有,虽然写着tf代码烦点,但起码各种东西都可以自己定义。。。。keras虽说非常简便,但封装的太好了,能调的东西不多,这种问题就是属于bug类的,暂时查遍github,stackoverflow,bing都没找到在不换框架下解决问题的,真的,没办法。。。。所以放弃keras把

你可能感兴趣的:(深度学习)