基本的图像分类

    在本指南中,我们将训练一个神经网络模型来对衣服的图像进行分类,比如运动鞋和衬衫。如果您不理解所有的细节也没关系,这是一个完整的Keras程序的快速概述,并在进行中解释了细节。

    图书馆(keras)

    导入Fashion MNIST数据集

    本指南使用时尚MNIST数据集,包含10个类别的70,000张灰度图像。这些图片以低分辨率(28 × 28像素)展示了单件衣服,如下图所示:

    图1。时尚mnist样本(由Zalando, MIT许可证)。">
         <p class=图1。时尚mnist样本(由Zalando, MIT许可证)。

    时尚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_lenncol(image_1))image_1y < -seq_lennrow(image_1))image_1<-收集(image_1“x”“价值”-y)image_1x < -as.integer(image_1x)ggplot(image_1aesx =x,y =y,填补=值))+geom_tile()+scale_fill_gradient低=“白色”高=“黑色”na。值=NA+scale_y_reverse()+theme_minimal()+主题面板。网格=element_blank())+主题方面。率=1+xlab""+ylab""

    在输入神经网络模型之前,我们将这些值缩放到0到1的范围。对于这个,我们只需除以255。

    训练集和测试集的预处理方法是相同的,这一点很重要:

    显示训练集中的前25张图像,并在每张图像下方显示类名。验证数据的格式是正确的,我们就可以构建和训练网络了。

    票面价值mfcol =c55))票面价值3月=c001.50),xaxs =“我”yaxs =“我”(我125) {img < -train_images (,,)img < -t应用(img,2,牧师))图像128128img,坳=灰色的((0255/255),xaxt =“n”yaxt =“n”主要=粘贴(class_names [train_labels[我]+1)))

    构建模型

    构建神经网络需要配置模型的层,然后编译模型。

    设置图层

    神经网络的基本组成部分是层。层从输入的数据中提取表示。希望这些表示法对我们要解决的问题更有意义。

    大多数深度学习都是将简单的层连接在一起。大多数层,喜欢layer_dense,有在训练中学习到的参数。

    模型< -keras_model_sequential()模型% > %layer_flatteninput_shape =c2828))% > %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数组中的标签匹配。

    要开始训练,请拨打适合方法-模型与训练数据“拟合”:

    模型% > %适合(train_labels train_images时代=5verbose =2
    ##训练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

    结果是,测试数据集上的准确率比训练数据集上的准确率要低一些。这种训练准确度和测试准确度之间的差距就是过拟合的一个例子。过拟合是指机器学习模型对新数据的表现比对训练数据的表现差。

    作出预测

    经过训练的模型,我们可以使用它对一些图像进行预测。

    在这里,模型预测了测试集中每个图像的标签。让我们来看看第一个预测:

    ## [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 =c55))票面价值3月=c001.50),xaxs =“我”yaxs =“我”(我125) {img < -test_images (,,)img < -t应用(img,2,牧师))标签从0到9减去1predicted_label < -which.max(预测[我])-1true_label < -test_labels[我]如果(predicted_label= =true_label) {颜色< -# 008800的其他的颜色< -“# bb0000”图像128128img,坳=灰色的((0255/255),xaxt =“n”yaxt =“n”主要=paste0(class_names [predicted_label+1),”(“class_names [true_label+1),“)”),col.main =颜色)

    最后,利用训练好的模型对单幅图像进行预测。

    ## [1] 1 28 28

    现在预测图像:

    # # [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。