搭建一个简单的图像分类模型
关于本文
在这篇文章中,我们将带领您完成一个最简单的衣物分类模型的搭建。这个模型将对我们输入的衣物图片给出一个概率最大的识别结果。
在开始前,请您确保计算机上安装了Python运行环境与VS Code,并且VS Code中已经安装了Jupyter插件,我们将使用Jupyter Notebook进行交互式编程。
我们使用tensorflow库训练该模型,并使用numpy和matplotlib库进行数据处理与展示。在开始前,请先在powershell中执行如下代码:
pip install tensorflow
pip install numpy
pip install matplotlib
数据准备
为训练一个模型,首先我们应该为其准备数据。对于衣物识别模型,我们使用现成的fashion_mnist数据库,这个数据库被tensorflow所内置,我们可以执行如下代码获取此数据库并对数据进行抽取。
fashion_maist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_maist.load_data()
其中train_images
和test_images
分别是用于训练和测试的图片,这些图片都是大小为28×28px的灰度图像,让我们来抽取train_images
中的第一张图片,看看它是什么样子的。
Emm,纵使这张图片有些抽象,我们可以看出来这是一张靴子的照片。我们再来抽取train_labels
中的首项,得到结果为9。事实上,labels就是用来与图像匹配的标签,也就是所谓的预测结果。
不知道这时大家有没有这样的疑问,为什么使用一个数字来代替预测结果,而不是字符串呢?事实上,使用字符串不但会使得预测精确度变低,还会导致一系列问题,如果还有机会,我们在以后的文章里会聊这些。
这些抽象的数字对应的字符串结果如下所示:
标签 | 类 |
---|---|
0 | T恤/上衣 |
1 | 裤子 |
2 | 套头衫 |
3 | 连衣裙 |
4 | 外套 |
5 | 凉鞋 |
6 | 衬衫 |
7 | 运动鞋 |
8 | 包 |
9 | 短靴 |
构建模型
有了这些图片,我们就可以把它们“喂”给模型进行相应训练了,但是我们目前没有模型可以完成这一操作。
没有怎么办?构建一个呗。首先我们构建一个空的顺序模型:
model = keras.Sequential()
接着,我们将在这个模型中添加层。模型是当然不能接受一张图片的,所以我们首先在模型的接受输入的最外端添加一个“压平”层Flatten
,用于把二维的图片压平到一位,类似于一张“一向箔”,紧接着在后边添加一个全连接层Dense
,我们可以浅显的理解为用来综合图像信息的层,含有128个神经元,同时为了防止预测出负数干扰之后的运行,我们给神经元一个ReLU激活函数,从而过滤掉这种可能。最后一层来输出预测数据,由于输入有10种可能,所以最后一层含有10个神经元,通过添加softmax激活函数用来输出每一种可能对于的概率。
该模型的搭建源码如下:
model.add((keras.layers.Flatten(input_shape = (28,28))))
model.add(keras.layers.Dense(128, activation = 'relu'))
model.add(keras.layers.Dense(10, activation = 'softmax'))
之后我们编译该模型用于训练,同时我们将给这个模型添加优化器和损失函数从而进一步增强该模型的可信度。在这个图像预测中,我们选用adam
作为优化器,sparse_categorical_crossentropy
作为损失函数,由于这篇文章的体验性质,我们不多做探究。
有一说一很多时候这两项的选用是靠着经验主义的(小声)
之后我们将该模型编译并进行训练,同时使用测试数据集进行预测准确度估计。
modelVision.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy')
modelVision.fit(train_images, train_labels, epochs = 10)
modelVision.evaluate(test_images, test_labels)
将进行十次重复训练,由于数据集不是特别庞大,没有采用GPU训练。由于我的4代i3实在太寄,撑不起这种训练,所以本次训练在工作站(i9-13900KF,Geforce GTX 4090)上进行,用时22.7s。得到的准确度约为60%。虽然这不是一个特别令人满意的结果,但是相比起随机从10个结果里面猜测一个来说好多了。
测逝
终于训练好了模型,真是一件值得庆祝的事,但是先别急,我们现在对我们的模型进行一个测试。
为了让大家能够更直观的感受到结果,我们首先查看test_images的第三项(随机)图片,可以看出来是一条裤子,我们把它丢给模型进行处理。
为了让数据更直观,我们以上述模型的基础构建预测模型,在最后添加Softmax
层使得输出数据不再那么抽象。
probability_model = tf.keras.Sequential()
probability_model.add(model)
probability_model.add(keras.layers.Softmax())
这样我们就创建好了预测模型,输入上述的图片,来看看结果。
我这边的执行结果是:
array([0.08545242, 0.08541001, 0.23081832, 0.08541019, 0.08575374,
0.08540927, 0.08551814, 0.08540927, 0.08540928, 0.08540927],
dtype=float32)
不难看出第三项数值最大,也就是概率越大,看看上面的表格,正好对应着裤子。模型成功预测了我们的输入。
总结
这篇文章中我们成功构建了一个可以对衣物进行分类的模型,在以后的学习中,我们将遇到更多的功能,以及对底层原理更深的探究。