卷积神经网络(CNN)

本文主要介绍了卷积神经网络的原理

什么是 CNN?

卷积神经网络(Convolutional Neural Network, CNN) 是深度学习中处理图像数据的核心结构,它利用“局部感知 + 权重共享”的机制,有效提取图像中的空间特征,被广泛应用于图像分类、目标检测、图像分割、人脸识别等任务中。


CNN 的基本结构

CNN 通常由以下几类层堆叠而成:

  1. 卷积层(Convolutional Layer)
  2. 激活函数(Activation Function, 如 ReLU)
  3. 池化层(Pooling Layer)
  4. 全连接层(Fully Connected Layer)
  5. 输出层(用于分类或回归)

1. 卷积层(Conv)

卷积操作的本质是:使用小窗口滑动输入图像,对每个局部区域计算加权求和。

数学表达为:

$$
y(i, j) = \sum_m \sum_n x(i+m, j+n) \cdot k(m, n)
$$

其中:

  • ( x ):输入图像区域
  • ( k ):卷积核(滤波器)
  • ( y(i, j) ):输出特征图上的一个像素

卷积层的作用是从图像中提取边缘、纹理、形状等局部特征


2. 激活函数(ReLU)

每次卷积输出后,需通过非线性激活函数,使网络能学习非线性模式。

常用激活函数:

  • ReLU:$$( f(x) = \max(0, x) )$$
  • Leaky ReLU
  • Sigmoid / Tanh(较少用于 CNN)

3. 池化层(Pooling)

池化层用于降低特征图空间维度、减少计算量、增强鲁棒性,防止过拟合。

常见池化方式:

  • 最大池化(Max Pooling):选局部最大值
  • 平均池化(Average Pooling):选局部平均值

例如 $$( 2 \times 2 ) $$ 最大池化:

1
2
3
4
5
输入:
[[1, 3],
[2, 4]]

→ 输出:4

卷积和池化操作的区别

卷积:

提取特征(边缘、纹理、形状等),构建深层语义

$$
y(i, j) = \sum_m \sum_n x(i + m, j + n) \cdot w(m, n) + b
$$

通过加权求和来进行计算

权重是可训练的参数

池化:

压缩特征图,降低尺寸,增强模型鲁棒性,减少过拟合

通过 固定规则(对特定局部区域max()或者avg()) 来进行计算

无可训练参数


4. 全连接层(Fully Connected Layer)

在卷积和池化提取出图像特征后,最终的表示会展平(flatten)成向量输入到全连接层,进行分类或回归任务。

每一个神经元与上一层所有输出相连接,类似传统神经网络的结构。

通常是网络中的“决策层”。


5. 输出层(用于分类或回归)

根据任务类型,输出层设置为:

  • 分类任务:使用 softmax 激活函数输出类别概率:

    $$
    P(y_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}
    $$

  • 回归任务:直接输出连续数值(不加激活函数,或用线性)


CNN 的整体流程

1
输入图像 → 卷积层 → ReLU → 池化层 → 卷积层 → ReLU → 池化层 → Flatten → 全连接层 → Softmax

关于 CNN 的图文讲解(来自CSDN)

多组卷积核的意义:

我们之所以使用多组卷积核,是因为每个卷积核只能提取图像中某一种类型的局部特征,如边缘、纹理或方向变化等,而图像中的信息是多样且复杂的。通过使用多组卷积核,模型可以从不同角度、多种尺度上提取丰富的特征,增强对图像的理解能力。同时,对于彩色图像,每组卷积核会分别作用于多个通道(如RGB),并整合它们的特征,从而构建更有表现力的特征图,为后续的分类、检测等任务提供更强的信息基础。


CNN代码展示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import torch.nn as nn
import torch.nn.functional as F

class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1) # 输入通道1,输出通道32
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) # 卷积层2
self.pool = nn.MaxPool2d(2, 2) # 最大池化层
self.fc1 = nn.Linear(64 * 7 * 7, 128) # 全连接层1
self.fc2 = nn.Linear(128, 10) # 全连接层2,输出10类

def forward(self, x):
x = self.pool(F.relu(self.conv1(x))) # Conv1 + ReLU + Pool
x = self.pool(F.relu(self.conv2(x))) # Conv2 + ReLU + Pool
x = x.view(-1, 64 * 7 * 7) # 展平
x = F.relu(self.fc1(x)) # 全连接1 + ReLU
x = self.fc2(x) # 全连接2(输出层)
return x

卷积通用计算公式

设输入特征图大小为:

$$
H_{in} \times W_{in}
$$

卷积核大小为 $$( K \times K )$$ $$步长为 ( S )$$ 填充为 $$( P )$$ 则输出特征图大小为:

$$
H_{out} = \left\lfloor \frac{H_{in} - K + 2P}{S} \right\rfloor + 1
$$

$$
W_{out} = \left\lfloor \frac{W_{in} - K + 2P}{S} \right\rfloor + 1
$$


作者

Gary

发布于

2025-05-25

更新于

2025-05-26

许可协议

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...