
什么是神经网络:实战-使用CNN进行minst手写数据集分类
就像无数人从敲下“Hello World”开始代码之旅一样,许多研究员从“MNIST数据集”开启了人工智能的探索之路。MNIST数据集(Mixed National Institute of Standards and Technology database)是一个用来训练各种图像处理系统的二进制图像数据集,广泛应用于机器学习中的训练和测试。MNIST数据集共有70000张图像,其中训练集60000张,测试集10000张。所有图像都是28×28的灰度图像,每张图像包含一个手写数字。每张图像都有标注。共10个类别,每个类别代表0~9之间的一个数字,每张图像只有一个类别。
今天就让我们用卷积神经网络CNN来进行minst手写数据集分类吧~
下面是用卷积神经网络(CNN)来对MNIST数据集进行分类的完整示例。每一段代码之后我都会详细解释其功能。
一. 导入必要的库
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
代码解释:
1. tensorflow:导入TensorFlow库,提供机器学习和深度学习的功能。
2. layers, models:从Keras中导入层和模型的构建模块。
3. mnist:从Keras中导入MNIST数据集。
4. to_categorical:用于将标签转换为one-hot编码。
二. 加载MNIST数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
代码解释:
1. mnist.load_data():加载MNIST数据集,返回训练和测试数据的元组。MNIST数据集由28x28像素的灰度手写数字图像组成。
2. train_images, train_labels:训练数据和对应的标签。
3. test_images, test_labels:测试数据和对应的标签。
三. 数据预处理
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
代码解释:
1. reshape((60000, 28, 28, 1)):将训练和测试图像调整为4D张量,以便适用于CNN输入。`(样本数, 高度, 宽度, 通道数)`。
2. astype('float32') / 255:将像素值归一化到0到1之间,以提高模型训练效率。
3. to_categorical():将整数标签转换为one-hot编码,以便于多类分类任务。
四. 构建卷积神经网络模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activatinotallow='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activatinotallow='relu'))
model.add(layers.Dense(10, activatinotallow='softmax'))
代码解释:
1. models.Sequential():创建一个顺序模型,这意味着模型的层按顺序堆叠。
2. Conv2D(32, (3, 3), activatinotallow='relu', input_shape=(28, 28, 1)):
- 32:卷积核的数量。
- (3, 3):卷积核的大小。
- activatinotallow='relu':使用ReLU激活函数。
- input_shape=(28, 28, 1):输入的形状。
3. MaxPooling2D((2, 2)):最大池化层,使用2x2的窗口来减少空间维度。
4. Flatten():将多维输入展平成一维,以便于全连接层处理。
5. Dense(64, activatinotallow='relu'):全连接层,具有64个神经元和ReLU激活函数。
6. Dense(10, activatinotallow='softmax'):输出层,具有10个神经元(对应10个类别)和softmax激活函数,用于多类分类。
五. 编译模型
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
代码解释:
1. optimizer='adam':使用Adam优化器进行训练。
2. loss='categorical_crossentropy':使用分类交叉熵作为损失函数。
3. metrics=['accuracy']:评估模型时关注的指标是准确率。
六. 训练模型
model.fit(train_images, train_labels, epochs=5, batch_size=64)
代码解释:
1. fit(train_images, train_labels, epochs=5, batch_size=64):
2. epochs=5:训练整个数据集5次。
3. batch_size=64:每次使用64个样本进行梯度更新。
七. 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc}")
代码解释:
1. evaluate(test_images, test_labels):在测试数据上评估模型性能。
2. test_acc:测试集的准确率。
本文转载自人工智能训练营,作者:人工智能训练营
