上周在用Tensorflow搞MNIST,用了好几层CNN,各种normalization什么的加上去,准确率就是怎么也达不到TF官网说的99.2%,最高也就98.6%左右的样子。可能是官网上对测试集的区分和Kaggle不一样,导致有一定的误差。

在考虑如何提高准确率的时候,我想到了这样一种训练方式: 考虑一个自编码器:从N维空间编码到M维空间再映射回N维空间,如果M<N,就可以认为是对数据进行了压缩,并且必然是有损压缩。为了使解码后的数据和原始数据尽可能相似,这个自编码器需要学习有关数据的信息。知道原始数据特征的编码器会比不知道数据特征活着搞错数据特征的编码器压缩得更好(逆编码后的数据和原始数据更相似)。 通过这个思想,对于0-9的数字分类问题,可以创建10个自编码压缩器,分别训练压缩某一种数字。方便起见,比如说0号自编码器学习压缩和解压所有数字0的图片,1号编码器学习压缩解压所有数字1的图片,以此类推。经过长时间的训练以后,0号自编码器会对所有数字0的图片都有很强的压缩还原能力,但对别的数字较差;其他自编码器也类似。那么当要分类一个新的未知图片时,只要将它分别放入这10个自编码器,看哪个效果最好,这个图片就对应哪个数字。

想着的时候感觉这个思路挺有道理的,就动手试验了一下,可惜准确率只有68%。虽说进行微调还有提高的空间,但是离90%差距有点大,我也就不深入下去了。

反思一下,虽然压缩器的思路是对的,但还是太粗糙,要精细化地得到高准确率的分类用这个还是不适合,尤其是每次识别的时候都要通过是个模型,成本不小,实用性很低。