📅  最后修改于: 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_rows和img_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)
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数据集输入特定批次大小的模型中。
score = model.evaluate(x_test, y_test, verbose=0)
print('loss=', score[0])
print('accuracy=', score[1])