基本的图像分类
在本指南中,我们将训练一个神经网络模型来对衣服的图像进行分类,比如运动鞋和衬衫。如果您不理解所有的细节也没关系,这是一个完整的Keras程序的快速概述,并在进行中解释了细节。
图书馆(keras)
导入Fashion MNIST数据集
本指南使用时尚MNIST数据集,包含10个类别的70,000张灰度图像。这些图片以低分辨率(28 × 28像素)展示了单件衣服,如下图所示:
时尚MNIST旨在作为经典的临时替代品MNIST数据——通常用作计算机视觉机器学习程序的“你好,世界”。MNIST数据集包含手写数字(0、1、2等)的图像,格式与我们将在这里使用的衣服相同。
本指南使用Fashion MNIST是为了多样化,因为它比常规MNIST稍微更具挑战性。这两个数据集都相对较小,用于验证算法是否如预期的那样工作。它们是测试和调试代码的良好起点。
我们将使用6万张图像来训练网络,使用1万张图像来评估网络学习图像分类的准确性。您可以直接从Keras访问Fashion MNIST。
fashion_mnist < -dataset_fashion_mnist()c(train_images train_labels)% < - %fashion_mnist$火车c(test_images test_labels)% < - %fashion_mnist$测验
现在我们有四个数组:train_images和train_labels数组是训练集——模型用来学习的数据。根据测试集test_images和test_labels数组对模型进行测试。
每个图像都是28 x 28数组,像素值在0到255之间。标签是整数数组,范围从0到9。这些对应于图像所代表的服装类别:
数字 | 类 |
---|---|
0 | t恤/顶 |
1 | 裤子 |
2 | 套衫 |
3. | 衣服 |
4 | 外套 |
5 | 凉鞋 |
6 | 衬衫 |
7 | 运动鞋 |
8 | 袋 |
9 | 及踝靴 |
每个图像都映射到一个单独的标签。由于类名不包含在数据集中,我们将把它们存储在一个矢量中,以便稍后绘制图像时使用。
探索数据
在训练模型之前,让我们研究一下数据集的格式。如下图所示,训练集中有60,000张图像,每张图像表示为28 x 28像素:
昏暗的(train_images)
## [1] 60000 28 28
[1] 60000 28 28
同样,在训练集中有60000个标签:
昏暗的(train_labels)
# # 60000年[1]
[1] 60000
每个标签为0 ~ 9之间的整数:
## [1] 9 0 0 3 0 2 7 2 5 5 0 9 5 5 7 9 1 0 6 4
[1] 9 0 0 3 0 2 7 2 5 5 0 9 5 5 7 9 1 0 6 4
测试集中有10,000张图像。同样,每张图像都表示为28 x 28像素:
昏暗的(test_images)
## [1] 10000 28 28
[1] 10000 28 28
测试集包含10000个图像标签:
昏暗的(test_labels)
# # 10000年[1]
[1] 10000
预处理的数据
在训练网络之前必须对数据进行预处理。如果你检查训练集中的第一张图像,你会发现像素值在0到255的范围内:
图书馆(tidyr)图书馆(ggplot2)image_1<-as.data.frame(train_images [1,)colnames(image_1) < -seq_len(ncol(image_1))image_1$y < -seq_len(nrow(image_1))image_1<-收集(image_1,“x”,“价值”,-y)image_1$x < -as.integer(image_1$x)ggplot(image_1,aes(x =x,y =y,填补=值))+geom_tile()+scale_fill_gradient(低=“白色”,高=“黑色”,na。值=NA)+scale_y_reverse()+theme_minimal()+主题(面板。网格=element_blank())+主题(方面。率=1)+xlab("")+ylab("")
在输入神经网络模型之前,我们将这些值缩放到0到1的范围。对于这个,我们只需除以255。
训练集和测试集的预处理方法是相同的,这一点很重要:
显示训练集中的前25张图像,并在每张图像下方显示类名。验证数据的格式是正确的,我们就可以构建和训练网络了。
构建模型
构建神经网络需要配置模型的层,然后编译模型。
设置图层
神经网络的基本组成部分是层。层从输入的数据中提取表示。希望这些表示法对我们要解决的问题更有意义。
大多数深度学习都是将简单的层连接在一起。大多数层,喜欢layer_dense
,有在训练中学习到的参数。
模型< -keras_model_sequential()模型% > %layer_flatten(input_shape =c(28,28))% > %layer_dense(单位=128,激活=“relu”)% > %layer_dense(单位=10,激活=“softmax”)
这个网络的第一层,layer_flatten
,将图像的格式从2d数组(28 * 28像素)转换为28 * 28 = 784像素的1d数组。这一层可以看作是将图像中的像素行拆散并排列起来。这一层没有参数需要学习;它只是重新格式化数据。
在像素被平展后,网络由两个序列组成密集的
层。这些是紧密连接的神经层,或者说完全连接的神经层。第一个密集层有128个节点(或神经元)。第二层(也是最后一层)是一个10节点的softmax层——它返回一个由10个概率分数组成的数组,总和为1。每个节点都包含一个分数,表示当前图像属于10个数字类之一的概率。
编译模型
在模型准备好进行训练之前,它还需要进行一些设置。这些是在模型的编译步骤中添加的:
- 损失函数——这衡量模型在训练过程中的准确性。我们希望最小化这个函数,以将模型“引导”到正确的方向。
- 优化器——这是基于模型所看到的数据及其损失函数对模型进行更新的方法。
- 度量—用于监视培训和测试步骤。下面的示例使用了准确性,即正确分类的图像的百分比。
火车模型
训练神经网络模型需要以下步骤:
- 将训练数据提供给模型—在本例中是
train_images
而且train_labels
数组。 - 模型学习将图像和标签关联起来。
- 我们要求模型对测试集(在本例中是test_images数组)做出预测。我们验证预测是否与test_labels数组中的标签匹配。
要开始训练,请拨打适合
方法-模型与训练数据“拟合”:
##训练60000样品## Epoch 1/5 ## 60000/60000 - 2s -损失:0.4945 -精度:0.8262 # Epoch 2/5 ## 60000/60000 - 2s -损失:0.3751 -精度:0.8643 # Epoch 3/5 ## 60000/60000 - 2s -损失:0.3354 -精度:0.8758 # Epoch 4/5 ## 60000/60000 - 2s -损失:0.3135 -精度:0.8854 # Epoch 5/5 ## 60000/60000 - 2s -损失:0.2956 -精度:0.8918
当模型列车,损失和准确性指标显示。该模型对训练数据的准确率约为0.88(或88%)。
评估准确性
接下来,比较模型在测试数据集上的表现:
分数< -模型% > %评估(test_labels test_imagesverbose =0)猫(“测试损失:,得分$损失,"\ n")
测试损耗:0.3870942
猫(的测试精度:,得分$acc,"\ n")
测试精度:0.8644
10000/10000 [==============================] - 0年代的19家美国/步骤测试损失:0.3755946测试精度:0.8644
结果是,测试数据集上的准确率比训练数据集上的准确率要低一些。这种训练准确度和测试准确度之间的差距就是过拟合的一个例子。过拟合是指机器学习模型对新数据的表现比对训练数据的表现差。
作出预测
经过训练的模型,我们可以使用它对一些图像进行预测。
预测< -模型% > %预测(test_images)
在这里,模型预测了测试集中每个图像的标签。让我们来看看第一个预测:
## [6] 5.465935e-06 1.288366e-07 3.570543e-06 1.659937e-08 2.075325e-05 ## [6] 1.836076e-02 2.499909e-06 1.217376e-01 2.614871e-05 8.598431e-01
预测是由10个数字组成的数组。这些描述了模特的“信心”,即图像对应于10件不同衣服中的每一件。我们可以看到哪个标签的置信度最高:
which.max(预测[1,)
# # 10 [1]
或者,我们也可以直接得到类的预测:
## [1] 9 2 1 1 6 1 4 6 5 7 4 5 5 3 4 1 2 2 8 0
由于标签是基于0的,这实际上意味着预测的标签为9(可以在class_names[9]中找到)。所以模特最确信这是一只短靴。我们可以检查测试标签,看看是否正确:
# # 9 [1]
让我们绘制几张带有他们预测的图片。正确的预测标签为绿色,错误的预测标签为红色。
票面价值(mfcol =c(5,5))票面价值(3月=c(0,0,1.5,0),xaxs =“我”,yaxs =“我”)为(我在1:25) {img < -test_images (,,)img < -t(应用(img,2,牧师))标签从0到9减去1predicted_label < -which.max(预测[我])-1true_label < -test_labels[我]如果(predicted_label= =true_label) {颜色< -# 008800的}其他的{颜色< -“# bb0000”}图像(1:28,1:28img,坳=灰色的((0:255)/255),xaxt =“n”,yaxt =“n”,主要=paste0(class_names [predicted_label+1),”(“,class_names [true_label+1),“)”),col.main =颜色)}
最后,利用训练好的模型对单幅图像进行预测。
## [1] 1 28 28
现在预测图像:
预测< -模型% > %预测(img)预测
# # [1] [2] [3] [4] [5] # # (1) 2.075324 1.659934 3.570535 1.288367 5.465944 e-06 e-07 e-06 e-08 e-05 # # [6] [7] [8] [9] [10] # # (1) 0.859843 0.01836077 - 2.499906 0.1217377 - 2.614871 e-06 e-05
预测
返回列表的列表,每个列表对应数据批中的每个图像。抓取批处理中(唯一)图像的预测:
# # 10 [1]
或者,直接再次得到类预测:
# # 9 [1]
和之前一样,模型预测的是9。