首先导入所需库和模块,然后加载MNIST手写数字数据集并对数据进行预处理。接着定义了一个基于卷积神经网络(CNN)的模型,该模型包含多个卷积层、最大池化层以及Dropout层作为正则化手段。模型最后接一个全连接层作为输出层,使用softmax激活函数处理多分类任务。
模型编译阶段设置了损失函数为“categorical_crossentropy”,优化器为Adam,评估指标为准确率。之后使用训练数据对模型进行训练,并在测试集上评估模型的性能,最终输出测试集上的准确率。
- from __future__ import absolute_import # 绝对导入,确保导入的模块是绝对路径下的
- from __future__ import division # 导入除法运算的未来版本特性
- from __future__ import print_function # 导入打印函数的未来版本特性
-
- import numpy as np
- from keras.models import Sequential
- from keras.optimizers import RMSprop
- from keras.layers import Activation, Dense, Dropout
- from keras.layers import Conv2D, MaxPooling2D, Flatten
- from keras.utils import to_categorical, plot_model
- from tensorflow.keras.datasets import mnist
-
- # 加载MNIST数据集
- (x_train, y_train), (x_test, y_test) = mnist.load_data()
-
- # 计算标签的数量
- num_labels = len(np.unique(y_train))
-
- # 将标签转换为 one-hot 向量
- y_train = to_categorical(y_train)
- y_test = to_categorical(y_test)
-
- # 图像输入尺寸
- image_size = x_train.shape[1]
- # 调整尺寸并进行归一化
- x_train = np.reshape(x_train, [-1, image_size, image_size, 1])
- x_test = np.reshape(x_test, [-1, image_size, image_size, 1])
- x_train = x_train.astype('float32') / 255
- x_test = x_test.astype('float32') / 255
-
- # 网络参数
- # 图像按原样处理(方形灰度图)
- input_shape = (image_size, image_size, 1)
- batch_size = 128
- kernel_size = 3
- pool_size = 2
- filters = 64
- dropout = 0.2
-
- # 模型是CNN-ReLU-MaxPooling的堆叠
- model = Sequential()
- model.add(Conv2D(filters=filters,
- kernel_size=kernel_size,
- activation='relu',
- input_shape=input_shape))
- model.add(MaxPooling2D(pool_size))
- model.add(Conv2D(filters=filters,
- kernel_size=kernel_size,
- activation='relu'))
- model.add(MaxPooling2D(pool_size))
- model.add(Conv2D(filters=filters,
- kernel_size=kernel_size,
- activation='relu'))
- model.add(Flatten())
- # 添加 dropout 作为正则化器
- model.add(Dropout(dropout))
- # 输出层是10维的 one-hot 向量
- model.add(Dense(num_labels))
- model.add(Activation('softmax'))
- model.summary()
-
- # 如果可以安装 pydot,则启用此功能
- # pip install pydot
- #plot_model(model, to_file='cnn-mnist.png', show_shapes=True)
-
- # 用于 one-hot 向量的损失函数
- # 使用 Adam 优化器
- # 精度是分类任务的好指标
- model.compile(loss='categorical_crossentropy',
- optimizer='adam',
- metrics=['accuracy'])
- # 训练网络
- model.fit(x_train, y_train, epochs=10, batch_size=batch_size)
-
- _, acc = model.evaluate(x_test,
- y_test,
- batch_size=batch_size,
- verbose=0)
- print("\nTest accuracy: %.1f%%" % (100.0 * acc))
这段代码的主要步骤包括: