关于毕业设计的一些事

漫画人脸二分类

一开始我一直想用 VGG 来实现漫画人脸的二分类,即判断是不是人脸。但是效果一直很差,acc 和随便猜的一模一样(50%)。

这时候我一直以为是数据有问题,不过在洗过好多次之后我发现并非如此,出问题的不是数据,而是数据和网络不匹配。

换句话来说就是漫画人脸中包含的要素太少,使用 VGG 这种深层网络会让特征到最后“消失殆尽”,所以最后效果就很差了。

为了验证这个猜想,我使用 VGG 训练 MNIST,结果不出意料的也是随便猜的概率(10%)。

++当然上面的也只是猜想,因为我对 CNN 理解还是太浅,这个基础问题还得在之后再恶补一下了。++

心里有这个概念之后我就尝试用浅一点的网络来解决问题了,尝试着用 AlexNet 和另一个浅一点的 CNN 来训练模型,虽然最后在二分类问题上能达到 80% 左右 的准确率,但是还有一个大问题又被我忽视掉了。

在尝试这两个网络中,我又在其中加入了 bn 层,不过加入之后浅层的 CNN acc 又变成了 50%……

更新

MNIST 这个 acc 这么低,原因不是我想的那样,而是我在处理输入的时候直接无脑 resize,破坏了原来图片的语义……使用正常的处理方法就能得到正确的结果了,并不是 VGG 的锅……

那么问题来了,我的漫画网络究竟是哪里出问题了呢……

提取特征

Acc 80%,这是一个不算特别好又不算坏的结果。但是试了很多种方法一时间没能找到更高的准确度,于是就准备拿这个模型来提取特征了。

不过在这个过程中,我有又发现了一个大问题:提取出来的特征太稀疏了,256 维的特征中,只有不到十个元素不为零……而 flatten 层也仅有 1/8 左右的不为零。虽然我内心没有逼数,但这的确是一个不正常的现象。

==后面我准备训练 MNIST 来观察一下各层的正常输出应该是怎么样的。==

检索系统中遇到的坑

  • ValueError: Tensor Tensor("Sigmoid_2:0", shape=(?, 17), dtype=float32) is not an element of this graph.

出现这个问题的原因就是多线程、分布式环境下,恢复 Model 时的 Tensor Graph 和生成 Model 时不同。

具体来说就是模型是在全局变量里面恢复的,但是调用是在 Flask 的多线程调用的。

解决方法就是在恢复 Model 的时候保存相应的 Graph,然后再在 predict 的时候恢复这个 Graph 即可。

1
2
3
4
5
6
7
# when load model
graph = tf.get_default_graph()

# when use model in another thread
global graph
with graph.as_default():
(... do inference here ...)

参考资料:

这个问题比较玄学,好像各种问题都可能报这个错误。我出现这个问题的原因可能是 tf 的版本和 keras 的版本有些冲突,使用系统的 Python 不行,但是换成 Anaconda 的 Python 就没问题了。

不过需要注意的是,tf.keras 和 keras 并不是一个东西,如果两个混用的话是会出现各种错误的,如果用到了某一个就一条路走到黑。