深度学习:卷积神经网络
1、二维卷积层
卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer)的神经网络。
1.1二维互相关运算
虽在二维卷积层中,一个二维输入数组和一个二维核(kernel)数组通过互相关运算输出一个二维数组。
图中:
- 输入是一个高和宽均为3的二维数组。我们将该数组的形状记为或(3,3)。
- 核数组的高和宽分别为2。
- 该数组在卷积计算中又称卷积核或过滤器(filter)。
- 卷积核窗口(又称卷积窗口)的形状取决于卷积核的高和宽,即。
1.2二维卷积层
二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏差来得到输出。
卷积层的模型参数包括了卷积核和标量偏差。
在训练模型的时候,通常我们先对卷积核随机初始化,然后不断迭代卷积核和偏差。
1.3互相关运算和卷积运算
卷积运算与互相关运算类似。
为了得到卷积运算的输出,我们只需将核数组左右翻转并上下翻转,再与输入数组做互相关运算。
在深度学习中核数组都是学出来的:卷积层无论使用互相关运算或卷积运算都不影响模型预测时的输出。
1.4特征图和感受野
二维卷积层输出的二维数组可以看作输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map)。影响元素的前向计算的所有可能输入区域(可能大于输入的实际尺寸)叫做的感受野(receptive field)。
⭐
二维卷积层的核心计算是二维互相关运算。在最简单的形式下,它对二维输入数据和卷积核做互相关运算然后加上标量偏差。
可以设计卷积核来检测图像中的边缘。
可以通过数据来学习卷积核。
卷积运算是将核数组左右翻转并上下翻转,再与输入数组做互相关运算。卷积运算与互相关运算虽然相似,但如果他们使用相同的核数组,对于同一个输入,输出往往不同。
特征图:二维卷积层输出的二维数组可以看做输入在空间维度上某一级的表征。
感受野:影响元素x的前向计算的所有可能输入区域(可能大于输入的实际尺寸)。
2、填充和步幅
填充是指在输入高和宽的两侧填充元素(通常是0元素)。
- 填充可以增加输出的高和宽,这常用来使输出与输入具有相同的高和宽。
步幅是指每次滑动的行数和列数。步幅可以减小输出的高和宽。
3、多输入通道和多输出通道
彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是和(像素),那么它可以表示为一个的多维数组。我们将大小为3的这一维称为通道(channel)维。
3.1多输入通道
当输入数据含多个通道时,我们需要构造一个输入通道数与输入数据的通道数相同的卷积核,从而能够与含多通道的输入数据做互相关运算。
假设输入数据的通道数为,那么卷积核的输入通道数同样为。
设卷积核窗口形状为。当时,我们知道卷积核只包含一个形状为的二维数组。
当时,我们将会为每个输入通道各分配一个形状为的核数组。
把这个数组在输入通道维上连结,即得到一个形状为的卷积核。
由于输入和卷积核各有个通道,我们可以在各个通道上对输入的二维数组和卷积核的二维核数组做互相关运算,再将这个互相关运算的二维输出按通道相加,得到一个二维数组。
这就是含多个通道的输入数据与多输入通道的卷积核做二维互相关运算的输出。
3.2多输出通道
当输入通道有多个时,因为我们对各个通道的结果做了累加,所以不论输入通道数是多少,输出通道数总是为1。设卷积核输入通道数和输出通道数分别为和,高和宽分别为和。如果希望得到含多个通道的输出,我们可以为每个输出通道分别创建形状为的核数组。将它们在输出通道维上连结,卷积核的形状即。在做互相关运算时,每个输出通道上的结果由卷积核在该输出通道上的核数组与整个输入数组计算而来。
⭐
- 使用多通道可以拓展卷积层的模型参数。
- 假设将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么卷积层的作用与全连接层等价。
- 卷积层通常用来调整网络层之间的通道数,并控制模型复杂度。
3、池化层
池化(pooling)层,它的提出是为了缓解卷积层对位置的过度敏感性。
3.1二维最大池化层和平均池化层
同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出。
- 池化层直接计算池化窗口内元素的最大值或者平均值,该运算也分别叫做最大池化或平均池化。
在二维最大池化中,池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。
当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值即输出数组中相应位置的元素。
📣
-
池化层每次对输入数据的一个固定形状窗口中的元素计算输出。
-
最大池化和平均池化分别取池化窗口中输入元素的最大值和平均值作为输出。
-
池化层的一个主要作用是缓解卷积层对位置的过度敏感性。
-
可以指定池化层的填充和步幅。
-
池化层的输出通道与输入通道数相同。
4、卷积神经网络(LeNet)
卷积神经网络就是含卷积层的网络。
LeNet交替使用卷积层和最大池化层后接全连接层来进行图像分类。
卷积层块里的基本单位是卷积层后接最大池化层:
- 卷积层用来识别图像里的空间模式,如线条和物体局部
- 最大池化层则用来降低卷积层对位置的敏感性。
卷积层块由两个这样的基本单位重复堆叠构成。
在卷积层块中,每个卷积层都使用的窗口,并在输出上使用sigmoid激活函数。
-
第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。
-
卷积层块的两个最大池化层的窗口形状均为,且步幅为2。
-
卷积层块的输出形状为(批量大小, 通道, 高, 宽)。
当卷积层块的输出传入全连接层块时,全连接层块会将小批量中每个样本变平(flatten)。
-
全连接层的输入形状将变成二维,
- 其中第一维是小批量中的样本,第二维是每个样本变平后的向量表示,且向量长度为通道、高和宽的乘积。
-
全连接层块含3个全连接层。
- 它们的输出个数分别是120、84和10,其中10为输出的类别个数。
特点:
1.相比MLP,LeNet使用了相对更少的参数,获得了更好的结果。
2.设计了maxpool来提取特征
实现
通过Sequential
类来实现LeNet模型。
import d2lzh as d2l
import mxnet as mx
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import loss as gloss, nn
import time
net = nn.Sequential()
net.add(nn.Conv2D(channels=6, kernel_size=5, activation='sigmoid'),
nn.MaxPool2D(pool_size=2, strides=2),
nn.Conv2D(channels=16, kernel_size=5, activation='sigmoid'),
nn.MaxPool2D(pool_size=2, strides=2),
# Dense会默认将(批量大小, 通道, 高, 宽)形状的输入转换成
# (批量大小, 通道 * 高 * 宽)形状的输入
nn.Dense(120, activation='sigmoid'),
nn.Dense(84, activation='sigmoid'),
nn.Dense(10))
参考文献
《动手学深度学习》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~