用 Keras 构建卷积神经网络:深度学习入门(二)
2024-01-16 00:10:40
引言
深度学习是机器学习的一个子领域,它利用人工神经网络来学习和理解数据。深度学习模型能够从数据中自动提取特征,并将其用于各种任务,如图像分类、自然语言处理和语音识别。
在深度学习中,卷积神经网络 (CNN) 是一种专门用于处理数据中空间信息的模型。CNN 在图像分类任务中表现出色,因为它能够有效地捕捉图像中的局部特征和全局信息。
在本文中,我们将使用 Keras 库构建一个 CNN 模型来对图像进行分类。我们将使用 MNIST 数据集,这是一个包含 70,000 张手写数字图像的数据集。我们将训练模型来识别这些图像中的数字,并评估模型的准确性。
Keras 简介
Keras 是一个高级神经网络 API,它可以轻松地构建和训练深度学习模型。Keras 使用 Python 语言,它具有简洁的语法和丰富的 API,使得开发深度学习模型变得更加容易。
我们已有的数据集如下所示:
mnist_data/
train-images-idx3-ubyte.gz
train-labels-idx1-ubyte.gz
t10k-images-idx3-ubyte.gz
t10k-labels-idx1-ubyte.gz
我们的 CNN 和 Keras 工程目录结构如下所示:
cnn_keras/
dataset/
train/
0/
...
1/
...
...
test/
0/
...
1/
...
...
plot.png
main.py
model.py
requirements.txt
dataset
目录,存放着我们下载的五个分好类的图片,每个子目录的名称代表该子目录下图片的所属分类,将在模型训练时当作图片的标签。
plot.png
: 我们使用 matplotlib
绘制的准确率和损失函数随训练轮数变化的曲线图。
main.py
: 这是我们的主程序文件,负责加载数据、构建模型、训练模型并评估模型。
model.py
: 这是我们的模型定义文件,负责定义模型的结构和参数。
requirements.txt
: 这是我们的项目依赖文件,列出了我们项目所需的 Python 库和版本。
构建 CNN 模型
现在,我们将使用 Keras 来构建我们的 CNN 模型。我们将使用以下步骤来构建模型:
- 导入必要的库。
- 加载数据。
- 预处理数据。
- 定义模型结构。
- 编译模型。
- 训练模型。
- 评估模型。
导入必要的库
首先,我们需要导入必要的库。我们将使用以下库:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from keras.optimizers import Adam
from keras.utils import np_utils
加载数据
接下来,我们需要加载数据。我们将使用 pandas
库来加载数据。
data = pd.read_csv('mnist_data/mnist.csv')
预处理数据
在训练模型之前,我们需要预处理数据。我们将执行以下预处理步骤:
- 将图像转换为灰度图像。
- 将图像缩小为 28x28 像素。
- 将图像转换为浮点型数据。
- 将图像归一化为 [0, 1] 范围。
- 将标签转换为独热编码。
# 将图像转换为灰度图像
data = data.astype('float32') / 255.0
# 将图像缩小为 28x28 像素
data = data.reshape(data.shape[0], 28, 28)
# 将图像转换为浮点型数据
data = np.array(data)
# 将图像归一化为 [0, 1] 范围
data = data.reshape(data.shape[0], 28, 28, 1)
# 将标签转换为独热编码
labels = np_utils.to_categorical(data[:, :, :, 0], 10)
定义模型结构
现在,我们可以定义模型结构了。我们将使用以下结构来定义模型:
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(Conv2D(128, (3, 3), activation='relu'))
# 第六层:池化层
model.add(MaxPooling2D((2, 2)))
# 第七层:全连接层
model.add(Flatten())
model.add(Dense(128, activation='relu'))
# 第八层:全连接层
model.add(Dense(10, activation='softmax'))
编译模型
接下来,我们需要编译模型。我们将使用以下参数来编译模型:
model.compile(loss='categorical_crossentropy',
optimizer=Adam(),
metrics=['accuracy'])
训练模型
现在,我们可以训练模型了。我们将使用以下参数来训练模型:
model.fit(data, labels, epochs=10, batch_size=128)
评估模型
训练完成后,我们需要评估模型。我们将使用以下参数来评估模型:
score = model.evaluate(data, labels, verbose=0)
结果
在我们的实验中,模型在测试集上取得了 98.7% 的准确率。这表明模型能够很好地对图像进行分类。
结论
在本文中,我们介绍了如何使用 Keras 库构建卷积神经网络 (CNN) 以对图像进行分类。我们详细讲解了 CNN 的结构、训练和评估过程,并提供了示例代码和结果。通过本文,您将对 CNN 的基本原理和应用有更深入的理解。