用机器学习给图片分类

我手机里的图片是一直有分类的,但是近一两年越来越懒,导致手机里未分类的图片堆积了很多,自己手动分类不太现实,所以尝试用机器学习给图片分一下类。

关于机器学习的知识我只是略懂一二,知道一些大概的原理。让我从零开始搞一个模型肯定是不现实的,所以准备套一套现成的。先看了一些相关项目的代码,大概了解到了怎么调TensorFlow的一些api,然后开搞。

大部分时间其实都用在了准备数据,处理数据上。数据来源于我之前自己手动分类的图片,总共大概8k张左右。对于模型来说不存在“图片”的概念,而只有不同形状的矩阵,因此需要将图片以矩阵形式表示。对于一张图片来说,图上的每个点都是一个有颜色的像素,该像素的颜色可以用rgb三个值来表示,而该像素的位置则可以用x/y坐标来表示,这样就可以用一个 (x,y,3)形状的矩阵来表示一张图片了。送入模型的数据需要有统一的形状,也就意味着图片的大小同样也是固定的,需要把图片缩到统一尺寸。除此之外,还需要对矩阵做归一化处理,就是把矩阵中的每个值缩放到0-1这个范围内,至于为啥我目前还不太清楚,只知道跟激活函数有关。

模型是随便找的一个模型,毕竟啥也不懂,随便找个能用的就完事了。给处理好的图片数据打上标签后,就开始训练模型。第一次当然不会顺风顺水,训练的过程中我就发现我这个模型虽然训练的正确率一直涨,但是测试数据的正确率没变化。研究了一下,发现是我的数据样本和参数有很大问题。我的图片分为a b c三类,a类有6k多张,而b c加起来只有1k多张,同时我没有正确设置训练时用的steps_per_epoch参数(应该设置为 数据集的大小/batch_size),只是抄了代码,导致每轮训练没有把数据过完,模型收到的数据大部分都是a类图,所以模型大概只是无脑把图片识别为a类图。几番修改后,用了2k张左右的图片作为训练数据集重新训练,得到了一个0.87的模型,尽管最终还是需要手工挑出一些模型分类错的,但是效果还算可以了,省了不少时间。

尽管很想写点技术的东西,但是机器学习这块我只是刚刚看到大门的水平,所以只能这样写流水账了。