📜  卷积神经网络在mnist数据集上的应用

📅  最后修改于: 2021-04-16 03:13:53             🧑  作者: Mango

CNN基本上是一种被称为卷积神经网络的模型,并且由于其实用性,在最近一段时间它已经获得了广泛的欢迎。 CNN使用多层感知器来进行计算工作。与其他图像分类算法相比,CNN使用的预处理相对较少。这意味着网络可以通过过滤器学习到传统算法是手工设计的。因此,对于图像处理任务,CNN是最合适的选择。

MNIST数据集:
mnist数据集是手写图像的数据集,如下图所示。


通过使用卷积神经网络(CNN)和功能模型,我们可以获得99.06%的精度。使用功能模型的原因是在连接各层时保持易用性。

  • 首先,包括所有必要的库

    import numpy as np
    import keras 
    from keras.datasets import mnist
    from keras.models import Model
    from keras.layers import Dense, Input
    from keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten
    from keras import backend as k
    
  • 创建火车数据和测试数据

    测试数据:用于测试模型如何训练模型。
    训练数据:用于训练我们的模型。

    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    

    在继续进行操作时,将img_rowsimg_cols用作图像尺寸。在mnist数据集中,它是28和28。我们还需要检查数据格式,即“ channels_first”或“ channels_last”。在CNN中,我们可以在动手之前对数据进行归一化,以便可以将较大的计算项减少为较小的项。像这样,我们可以将x_train和x_test数据除以255来归一化。

    检查数据格式:

    img_rows, img_cols=28, 28
      
    if k.image_data_format() == 'channels_first':
       x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
       x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
       inpx = (1, img_rows, img_cols)
      
    else:
       x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
       x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
       inpx = (img_rows, img_cols, 1)
      
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train /= 255
    x_test /= 255
    
  • 输出类的描述:

    由于模型的输出可以包含0到9之间的任何数字,因此,我们需要10个类的输出。要输出10个类,请使用keras.utils.to_categorical函数,该函数将提供10列。在这10列中,只有一个值将是1,其余9将是0,输出的这一值将表示数字的类别。

    y_train = keras.utils.to_categorical(y_train)
    y_test = keras.utils.to_categorical(y_test)
    

    现在,数据集已经准备好,让我们转向cnn模型:

    inpx = Input(shape=inpx)
    layer1 = Conv2D(32, kernel_size=(3, 3), activation='relu')(inpx)
    layer2 = Conv2D(64, (3, 3), activation='relu')(layer1)
    layer3 = MaxPooling2D(pool_size=(3, 3))(layer2)
    layer4 = Dropout(0.5)(layer3)
    layer5 = Flatten()(layer4)
    layer6 = Dense(250, activation='sigmoid')(layer5)
    layer7 = Dense(10, activation='softmax')(layer6)
    
  • CNN模型中每一层的工作原理说明:

    layer1是Conv2d图层,使用32个大小为(3 * 3)的滤镜对图像进行卷积。
    layer2还是Conv2D层,也用于对图像进行卷积,并使用64个大小均为(3 * 3)的滤镜。
    layer3是MaxPooling2D图层,它从大小为(3 * 3)的矩阵中选取最大值。
    layer4以0.5的速率显示Dropout。
    layer5正在对从layer4获得的输出进行展平,并将此展平的输出传递给layer6。
    layer6是包含250个神经元的神经网络的隐藏层。
    layer7是使用softmax函数的具有10个神经元,用于10类输出的输出层。

  • 调用编译和拟合函数:
    model = Model([inpx], layer7)
    model.compile(optimizer=keras.optimizers.Adadelta(),
                  loss=keras.losses.categorical_crossentropy,
                  metrics=['accuracy'])
      
    model.fit(x_train, y_train, epochs=12, batch_size=500)
    


    首先,我们按上面给定的行所示制作了模型的对象,其中[inpx]是模型中的输入,而layer7是模型的输出。我们使用所需的优化器,损失函数编译模型并打印精度,并在最后一个模型上进行拟合.fit与诸如x_train(表示图像矢量),y_train(表示标签),历元数和批次大小等参数一起被调用。使用拟合函数x_train,将y_train数据集馈入到特定批次大小的模型中。

  • 评估函数:
    model.evaluate提供测试数据的分数,即将测试数据提供给模型。现在,模型将预测数据的类别,并且预测的类别将与y_test标签匹配以提供准确性。
    score = model.evaluate(x_test, y_test, verbose=0)
    print('loss=', score[0])
    print('accuracy=', score[1])
    

    输出: