Mnist模型识别自己手写数字正确率低的原因

做老板的助教,大三学生问的比较多的问题,记录一下。

 

问题背景:

有的同学用官方的训练数据mnist训练好自己的模型后,自己制作数字图片给训练好的模型识别,结果正确率只有40%多,甚至用原来训练的数据集识别正确率都低于50%.

 

 

 

解决方法:

可以从下面几个方面入手,把自己手写的数字识别率提高到80%不难:

 

 

原因1西方手写体和东方手写体造成的样本差异

 

具体操作:我们把训练集的ubyte文件转成图片可以看到如下图

 

我们训练的时候用到的是 外国人写的数字,你可以看到 2 ,4 ,6 和中国人写的区别很大。找了一个图方便对比:

很明显,我们自己写出来的一些数字和原来用于训练的数字差别太大,导致识别率低,可以模仿西方数字书写提高一点识别率。

 

 

原因2:做了不恰当的图片预处理操作

如果有的同学用训练集去测试原来的模型识别率也低,那你应该是图像预处理模块出了问题。

举个例子:

我有一张训练模型时候用到的图,叫做test_0.jpg, 如下图:

,这里我们用7做测试,然后我把图片读进来测试模型的识别率,第一次我把图像做一次归一化,第二次我不做归一化,分别送给模型去识别。两次结果如下图:

 

做了归一化结果

可以看到把训练数据的7识别成了8

 

未做归一化结果:

可以看到我们把归一化那一行注释掉了之后,就识别正确了,很多训练集识别率都出了问题的,都是自己加了错误的预处理造成的,为什么?

 

因为:我们把图片读到matlab中,此时未做归一化处理,结果如下图

,很明显,这是一个 数字 7 的轮廓。现在我把它进行归一化,这里我使用其中一个同学的归一化代码演示,代码如下

他是用255减去每个像素值/maxpixel-minpixel))   的方式进行归一化。

 

归一化之数据和图形如下:

imshow() 显示为  ,归一化之后变成了白底黑字,为什么?因为如果原来是黑色,假如像素值为0 255-0/255,变成了1, 然后0~1之间1最大,所以颜色反转了,你用这个7去给模型识别,自然而然识别不出来,识别结果如下:

7认成了8

 

这个例子不是说不能做图片预处理,是说要进行正确的预处理。

 

 

建议用photoshop的柔性画笔制作自己的样本,我测了,识别率很高。

 

总结:

1、尽量模仿西方数字的书写,书写的位置尽量位与28*28的中央,建议用photoshop的柔性画笔书写。

2、小心你的图片预处理过程,这可能是你识别率低的罪魁祸首

3、你可以把所有的训练图片处理成2值图,然后给模型训练,测试图片也用2值图,就是只有01,没有0~1之间的任何数,避免了图片预处理导致的识别率下降,识别率会极大提升。

猜你喜欢

转载自blog.csdn.net/xiqi4145/article/details/84970496
今日推荐