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

📅  最后修改于: 2020-04-23 06:11:54             🧑  作者: 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将为零,并且输出的这一值将指示数字的类别。

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)的kernel对图像进行卷积。
    layer2还是Conv2D层,它也用于对图像进行卷积,并使用64个大小均为(3 * 3)的kernel。
    layer3是MaxPooling2D图层,它从大小为(3 * 3)的矩阵中选取最大值。
    layer4的Dropout的速率为0.5。
    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(表示标签),epochs和batch_size一起被调用。使用拟合函数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])