我在进行一个小的实验时突然发现了两个不同的结果,在进行首先体识别的任务中。这是一个多分类的问题,它总共有10类。一开始我只是为了验证一下实验的效果,就直接在网络上找了一个代码
然后就直接对着这个代码跑了。最后实验也跑通了。最后发现了一个特征奇怪的问题。当我直接跑这个代码的时候发现准确度很高,而且出奇的稳定。没有多少波动。当我从别的地方import 一个网络运行时发现结果差别很大。我检查了两个代码发现没啥问题。为什么结果差别很大。最后一看训练的参数,发现错了,第一个代码使用了binary_crossentropy 就直接运行了。后一个使用了categorical_crossentropy。改过以后发现一切都正常了。然后我上网搜了一下发现,这并不是我一个人的出现的错误。
网上给出的原因是Keras没有定义一个准确的度量,但有几个不同的,比如binary_accuracy和categorical_accuracy,当你使用binary_crossentropy时keras默认在评估过程中使用了binary_accuracy,但是针对你的分类要求,应当采用的是categorical_accuracy,所以就造成了这个问题。
所以你要么这么写:
from keras.metrics import categorical_accuracy
model.compile(loss='binary_crossentropy',
optimizer='adam', metrics=[categorical_accuracy])
要么这么写:
model.compile(loss='categorical_crossentropy',
optimizer='adam',metrics=['accuracy'])
所以希望大家在使用代码的时候,一些细节要多注意。不能在网上找到一个代码然后就直接运行了。也不仔细查看。