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

📅  最后修改于: 2023-12-03 15:07:22             🧑  作者: Mango

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

卷积神经网络(Convolutional Neural Network,CNN)是深度学习中非常重要的一个分支。它能够有效的提取图像等多维数据的特征,并用于图像分类、对象检测等任务。在本文中,我们将介绍如何使用卷积神经网络对 MNIST 手写数字数据集进行分类。

MNIST 数据集

MNIST 数据集是一个大规模的手写数字数据集,包含了 60,000 个训练样本和 10,000 个测试样本。每张图片大小为 28x28 像素,数字范围为 0~9。该数据集被广泛用于图像分类领域的研究和开发中。

在本次代码实现中,我们将使用 Keras 框架来加载和处理 MNIST 数据集。

卷积神经网络架构

在本次实现中,我们使用了一个简单的卷积神经网络架构,包括两层卷积层、两层池化层和两层全连接层。具体架构如下:

CNN Architecture

网络输入为 28x28 的灰度图像,输出为大小为 10 的向量,分别表示每个数字的概率。具体实现细节可以参考代码。

代码实现

以下是使用卷积神经网络对 MNIST 数据集进行训练和测试的 Python 代码:

import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from keras.utils import to_categorical

# 加载数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 数据预处理
train_images = train_images.reshape((60000, 28, 28, 1)) / 255.0
test_images = test_images.reshape((10000, 28, 28, 1)) / 255.0
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

# 构建模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(10, activation='softmax'))

model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(train_images, train_labels, epochs=5, batch_size=64)

# 测试模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)
运行结果
Epoch 1/5
938/938 [==============================] - 25s 27ms/step - loss: 0.4175 - accuracy: 0.8667
Epoch 2/5
938/938 [==============================] - 25s 27ms/step - loss: 0.0583 - accuracy: 0.9825
Epoch 3/5
938/938 [==============================] - 28s 30ms/step - loss: 0.0384 - accuracy: 0.9882
Epoch 4/5
938/938 [==============================] - 28s 30ms/step - loss: 0.0310 - accuracy: 0.9912
Epoch 5/5
938/938 [==============================] - 28s 30ms/step - loss: 0.0230 - accuracy: 0.9933
313/313 [==============================] - 2s 6ms/step - loss: 0.0257 - accuracy: 0.9907
Test accuracy: 0.9907000064849854

经过 5 个 epochs 的训练,最终在测试集上的准确率达到了 0.991,即 99.1%。可以看到在 MNIST 数据集上使用卷积神经网络进行分类是非常有效的。我们可以对比一下使用简单的全连接神经网络,其准确率大约只有 97% 左右。