卷积神经网络(CNN)入门教程
Chen Xi

卷积神经网络(CNN)入门教程

卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型,特别擅长处理图像数据。它通过使用卷积运算来提取特征,并通过池化层和全连接层来分类或回归。这篇教程将详细介绍 CNN 的基本原理和结构,并提供一个使用 Python 实现的示例。


1. CNN 的基本概念

1.1 卷积层(Convolutional Layer)

卷积层是 CNN 的核心组件,用于提取输入数据的特征。卷积层通过卷积核(或滤波器)在输入数据上滑动,并计算点积,从而生成特征图(feature map)。

  • 卷积核(Filter):通常是一个小矩阵,用于检测特定的特征,例如边缘、纹理等。
  • 步幅(Stride):卷积核滑动的步伐。步幅越大,特征图越小。
  • 填充(Padding):在输入数据的边界添加零值,以控制特征图的大小。

公式
特征图的大小计算公式为:

Output size=(Input sizeFilter size+2×Padding)Stride+1\text{Output size} = \frac{(\text{Input size} - \text{Filter size} + 2 \times \text{Padding})}{\text{Stride}} + 1

(金猪言:公式部分可稍微理解,我也不是很懂,了解原理即可)

1.2 激活函数(Activation Function)

激活函数引入非线性,使得模型可以表示更复杂的函数。常用的激活函数有 ReLU(Rectified Linear Unit)、Sigmoid 和 Tanh。

  • ReLU:( f(x) = \max(0, x) )
  • Sigmoid:( f(x) = \frac{1}{1 + e^{-x}} )
  • Tanh:( f(x) = \tanh(x) )

1.3 池化层(Pooling Layer)

池化层用于减少特征图的大小,从而减少计算量和防止过拟合。常见的池化操作有最大池化(Max Pooling)和平均池化(Average Pooling)。

  • 最大池化:取池化窗口中的最大值。
  • 平均池化:取池化窗口中的平均值。

1.4 全连接层(Fully Connected Layer)

全连接层连接卷积层输出的所有特征,用于综合特征信息进行分类或回归。全连接层通常在 CNN 的最后一层。

2. CNN 的结构

典型的 CNN 结构由以下几部分组成:

  1. 输入层:接受输入数据(如图像)。
  2. 多个卷积层和池化层:提取特征。
  3. 全连接层:分类或回归。
  4. 输出层:产生最终结果,如类别标签。

3. CNN 的实现

下面是一个使用 Python 和 TensorFlow/Keras 库实现的 CNN 示例。该模型用于对手写数字进行分类(MNIST 数据集)。

3.1 环境设置

首先,确保安装了必要的库:

1
pip install tensorflow

3.2 导入库和数据集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

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

# 数据预处理
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)

3.3 构建模型

1
2
3
4
5
6
7
8
9
10
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

3.4 编译和训练模型

1
2
3
4
5
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_data=(test_images, test_labels))

3.5 模型评估

1
2
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc}")

3.6 保存和加载模型

1
2
3
4
5
# 保存模型
model.save('mnist_cnn.h5')

# 加载模型
new_model = models.load_model('mnist_cnn.h5')

4. 进阶内容

4.1 数据增强

数据增强是提高模型泛化能力的技术之一。它通过随机变换训练数据(如旋转、缩放、翻转等),生成更多样的数据样本,防止过拟合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
rotation_range=10,
width_shift_range=0.1,
height_shift_range=0.1,
zoom_range=0.1,
horizontal_flip=False
)

# 使用增强后的数据进行训练
datagen.fit(train_images)
model.fit(datagen.flow(train_images, train_labels, batch_size=64),
epochs=5, validation_data=(test_images, test_labels))

4.2 正则化

正则化技术,如 L2 正则化和 Dropout,可以防止模型过拟合。

  • L2 正则化:在损失函数中加入权重的 L2 范数,以限制权重大小。
  • Dropout:在训练期间随机丢弃一定比例的神经元,减少模型对特定路径的依赖。
1
2
3
# 使用 L2 正则化和 Dropout
model.add(layers.Dense(64, kernel_regularizer=tf.keras.regularizers.l2(0.001), activation='relu'))
model.add(layers.Dropout(0.5))

4.3 迁移学习

迁移学习利用预训练的模型(如 VGG、ResNet 等)来提取特征,然后在新的数据集上进行微调。这种方法在数据有限的情况下非常有效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from tensorflow.keras.applications import VGG16

# 加载预训练模型,不包含顶层的全连接层
conv_base = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))

# 冻结卷积基
conv_base.trainable = False

# 构建新的模型
model = models.Sequential([
conv_base,
layers.Flatten(),
layers.Dense(256, activation='relu'),
layers.Dropout(0.5),
layers.Dense(1, activation='sigmoid')
])

总结

卷积神经网络是深度学习中处理图像数据的核心工具。它通过卷积层提取特征,通过池化层减少数据维度和计算量,通过全连接层进行分类或回归。本文介绍了 CNN 的基本概念和结构,并通过 TensorFlow/Keras 提供了一个具体的实现示例。随着技术的进步,CNN 在计算机视觉等领域的应用越来越广泛。人脸识别离不开它,所以有必要对其进行了解。

Powered by Hexo & Theme Keep
This site is deployed on