【CNN】卷积神经网络- part1
1.卷积
1.局部连接
定义:只是于输入数据的一部分区域相连,每个神经元只关注一小部分
作用:模仿人类的视野机制,极大的减少了模型参数的数量,降低了计算成本
2.权重共享
定义:所有神经元使用相同的权重向量来检测输入数据的不同局部区域。换句话说,卷积核(滤波器)在整个输入上滑动时,其内部的权重保持不变。
作用:不仅进一步减少了模型参数的数量,提高了计算效率,还赋予了模型平移不变性(translation invariance),意味着无论某个特征出现在图像的哪个位置,模型都能识别它。这使得CNN非常适合处理具有平移不变性的任务,如图像分类。
3.池化
定义:减少特征图的空间尺寸,从而降低计算复杂度并控制过拟合。最常见的形式是最大池化(Max Pooling),它通过取每个固定大小子区域的最大值来缩小特征图的尺寸。
作用:减少维度外,池化还能提供某种程度的位置不变性,因为它减少了输出对输入中小变化的敏感性。
1.1 卷积运算
滑动卷积核,在每个局部区域先乘再和,最终生成特征图,输出标量。
代码实现二维卷积算子
import torch
import torch.nn as nn# 定义输入矩阵和卷积核
input_matrix = torch.tensor([[1., 2., 3.],[4., 5., 6.],[7., 8., 9.]
], dtype=torch.float32) kernel = torch.tensor([[0., 1.],[2., 3.]
], dtype=torch.float32) # 将输入扩展为四维张量
input_tensor = input_matrix.view(1, 1, 3, 3) # 创建卷积层(
conv_layer = nn.Conv2d(in_channels=1,out_channels=1,kernel_size=2,bias=False # 禁用偏置项
)# 手动设置卷积核权重
conv_layer.weight.data = kernel.view(1, 1, 2, 2)# 执行卷积操作
output = conv_layer(input_tensor)# 输出结果
result = output.squeeze().detach() print("卷积结果:\n", result)
1.2 权重共享
这个卷积核包含了一组权重,用于从输入数据中提取特征。通过权值共享,网络能够在不同的输入位置之间共享计算和参数,从而大大减少模型参数的数量,提高网络的泛化能力。
减少模型的参数数量,降低了过拟合风险,因为使用了相同的权重和偏置,所以实现平移不变性。且更加简洁
1.3 卷积之步长
假设有一个大小为5×5的输入图像(为了简化问题,不考虑颜色通道等复杂情况),而卷积核的大小是3×3。
如果步长设置为1,那么卷积核就从左上角开始,每次向右移动1个单位,当到达图像边缘后,向下移动1个单位,继续向右扫描。这样在横向和纵向都会有很多重叠的计算区域,最终得到的输出特征图尺寸较大,会得到一个3×3的矩阵,可以捕捉到更密集的空间细节。
若步长设置为2,则卷积核在每次移动时会跳过1个单位(因为步长是2),这样输出特征图的尺寸就会减小,会得到一个2×2的矩阵,计算量也会相应减少。较大的步长容易导致特征图中信息的稀疏,但可以有效降低模型的复杂度。
2.4 卷积的Padding边缘填充
保持输入和输出图像尺寸保持一致性。
卷积之后的特征图大小可以通过一个具体的公式来计算。假设输入图像的尺寸是 W×H(宽度和高度),卷积核的大小是 F×F,步长(stride)为 S,填充(padding)大小为 P,则输出特征图的尺寸 W×H 可以通过以下公式计算: