我正在构建一个 CNN,用 50x50 像素灰度图像(每类 1400 个)对 6 个类别进行分类。在训练模型并评估损失和准确度后,一切似乎都运行良好,训练准确度约为 98%,损失也有所下降到 3.0,但是当根据每个类别的测试数据评估模型时,模型相差甚远。我的类(class)是面部表情图像: 1)愤怒 2)恐惧 3)快乐 4)中性 5)悲伤 6)惊喜
这是 Jupyter 笔记本:https://www.floydhub.com/arse123/projects/cnn-1/20/code/train_edge.ipynb
例如,当我为每个类别提供 350 个测试图像时,仅预测愤怒和惊讶类别。
TEST IMAGES RESULTS
Angry - it classified 76 angry, and 273 surprise
Fear - it classified 8 angry and 342 surprise
Happy - 12 angry and 338 surprise
Neutral - 350 surprise
Sad - 22 angry and 328 surprise
Surprise - a full 350/350 classified for this one..
很明显,对于愤怒和惊讶存在一些偏见,因为其他图像都没有被分类过一次。
当我跑acc.eval({x: test_images, y: test_labels, is_training : False})
时(每个类有 2100 个图像以及相应的图像)训练后我的准确率达到了 82%,所以我不知道这是怎么发生的。该模型是否有可能一直在这两个类别上进行训练?
@NOTE:图像和标签是一个热编码,也是随机洗牌,实现批量归一化
<小时/> 更新 <小时/>我重新训练了模型,它具有相同的效果,但具有不同的类别。这次它更倾向于悲伤和惊讶,而不是愤怒和惊讶。 结果如下:
Angry - Sad 259 and surprise 75
Fear - Sad 118 and surprise 218 (some classifications missing here for some reason)
Happy - Sad 167 times and suprise 160 times (same again, missing some classifications)
Neutral - sad 94 and surprise 249
Sad - sad 211 and surprise 122
Surprise - Sad 284 and surprise 52
最佳答案
代码中有一些问题,但最重要的是,由于某种原因,当 is_training = False
时它没有表现。如果您设置is_training = True
即使没有训练,那么它也会给出可接受的结果。所以训练没问题,但评估运行不好。
为什么会出现这个问题,我现在无法回答,但可能值得调查。
在 Jupyter Notebook 中附加固定代码。我改变了很多小事情,比如你采用了已经 Softmaxed 值的 Softmax,修复了这个问题,改变了随机洗牌以使用 numpy,改变了测试图像的加载以在加载时立即调整大小,等等。还有很多调试打印正在进行中,对此表示抱歉。 :)
看起来很合理,验证准确度为 88%(训练准确度为 96.59%)。 (也改为 10 epoch。)
关于python - Tensorflow - 仅模型预测 6 个类别中的 2 个类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49971092/