CNN——卷积、池化与误差反向传播

本文深入探讨卷积神经网络(CNN)的结构与原理,包括输入层、卷积层、激活函数、池化层和全连接层等组成部分。详细解释深度、权值共享、卷积及池化操作,并通过实例演示输出层尺寸的计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

卷积神经网络(CNN)

组成:输入层、卷积层、激活函数、池化层、全连接层
卷积神经网络中重要概念就:
深度:深度大小就等于所用的filter的个数[卷积层],也可以理解为提取的层数。
权值共享:给一张输入的图片用同一个filter去提取,filter里面的数据叫做权重,图中每个位置都是由同一个filter扫描的因此权重一样,也就是权值共享。
卷积:特征提取
池化:特征压缩,压缩方法有max法和mean


卷积神经网络相对于神经网络最重要的部分是卷积层跟池化层,这两个概念其实也不难理解,卷积层就是在输入层的基础上对输入的数据进行特征提取,这个过程称为卷积。而池化层的作用简单来说就是特征压缩。池化操作常用的又分为两个,一个是max操作另一个就是mean操作,下面我们会逐个讲解。


卷积:

卷积的概念:图像中不同数据窗口中的数据和卷积核(一个滤波矩阵)作内积的操作叫做卷积。
卷积核的概念:卷积时使用到的权值用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行、列都是奇数,是一个权矩阵。
卷积核采用奇数的原因:一方面是因为在进行卷积的时候一般都是以卷积核的中心为基础然后进行滑动的,所以选为奇数,主要是方便以模块中心为标准进行滑动卷积。另一方面如果卷积核尺寸选用偶数那么就会得到 padding (周围填补的长度)为奇数,就不能平均分配到卷积张量两边,所以结合上面两种原因卷积核尺寸选为奇数。

卷积的计算:

注意这里面输入层最外圈添加了一层0,说明此时padding = 1
在这里插入图片描述
在这里插入图片描述
滑动输入层上同卷几层尺寸大小相同的矩形框,直至从左上方滑动到右下方结束滑动,完成一次卷积。因为这里是用了两个卷积核(filtering),所以最终输出层的深度为2.

输出层尺寸计算方法:

这里的输出层包括卷积后的输出层以及池化以后的输出层,二者的计算方法一样都是采用下列计算方法。
out=[(Rin−F+2∗P)]/S+1out=[(Rin-F+2*P)]/S+1out=[(RinF+2P)]/S+1

其中 Rin 表示输入层矩阵尺寸大小,F 表示滤波矩阵尺寸大小,P 表示( padding )填充尺寸,S 表示滑动步长。
比如 :输入图片大小为 200*200 , 卷积矩阵为 5*5 ,padding = 1, stride =2 ; 池化矩阵 3*3 ,padding = 0 ,stride = 1 ; 又一层卷积 3*3 ,padding = 1 , stride = 1 ,问特征图大小为多少?
首先第一次卷积:[200-5+21]/2+1 = 99.5 ,因为是整数运算所以这里结果取 99 。
池化: [99-3+2
0]/1+1 = 97
第二次卷积: [97-3+1*2]/1+1 = 97
所以最终结果是 97 ,最终输出图片大小为 97 *97 *2 ,2 为深度


池化层向前传播的两种方法:

在这里插入图片描述

反向传播过程中池化操作[upsample]:

max法反向传播的时候只需要知道正向传播的时候传进来的那个最大数据所在的位置,然后反向的时候直接恢复那个位置的数值,其他都为零,可以理解为其他的不重要可以忽略为零。

1、前向传播是max法
在这里插入图片描述
2、前向传播是mean法

mean反向传播的时候将数据平均化即可。
在这里插入图片描述


误差反向传播

首先我们要知道我们下面用到的【x】表示的是误差传播到结点的结果或损失函数对这个结点激活前的导数。

一、池化层的向上传播[卷积层A激活函数—本池化层—卷积层B]

现在知道误差传播到本池化层的结果是【x+】,现在求误差传播到卷积层A的结果,从卷积层A到本池化层正向传播时经历了激活和池化两个过程,所以反向的时候首先需要进行池化层的反正传导,前面已经提过了然后就是需要对激活函数进行求导。公式推导见后面部分。
二、卷积层的向上传播[池化层A—卷积层—池化层B]
已知误差传播到本卷积层的结果是【x】,现在求误差传播到池化层A的结果,由于池化层没有激活(池化后的结果直接传到下一层),因此从池化层A到卷积层只有池化操作,反向传播时也就只有反向池化操作。


图片展示:
因为整张图片上传以后是横着的,所以我就截成两个了,谁会把整张图上传上去的希望能够指导一下,谢谢。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### 卷积神经网络的前向传播 卷积神经网络(CNN)是一种专门用于处理具有网格结构的数据(如图像数据)的深度学习模型。其核心操作是卷积层,该层通过应用一系列滤波器来提取输入特征的不同方面。 在前向传播过程中,输入数据经过多个卷积层和池化层的操作逐步被转换成更高层次的抽象表示形式[^1]。具体来说: - **卷积运算**:对于每一个位置,计算局部区域内的加权求和并加上偏置项; - **激活函数**:通常采用ReLU作为非线性变换单元; - **池化操作**:减少空间维度的同时保留重要信息; 这些过程共同作用使得原始像素级的信息逐渐转化为语义级别更强的表现形式,从而有利于后续分类或其他任务执行。 ```python import torch.nn as nn class ConvNet(nn.Module): def __init__(self, num_classes=10): super(ConvNet, self).__init__() self.layer1 = nn.Sequential( nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2)) def forward(self, x): out = self.layer1(x) return out ``` ### 卷积神经网络的反向传播 为了训练一个有效的卷积神经网络,在定义好损失函数之后还需要实现参数更新机制——即所谓的“反向传播”。这一阶段的目标是从最后一层开始逐层向前传递误差梯度,并据此调整各层权重以最小化整体预测错误。 针对每一层而言,主要涉及两个方面的计算工作: - 计算当前层相对于上一层输出的变化率 (δ),这一步骤依赖于链式法则以及具体的激活/聚合方式; - 更新对应的可调参量 w 和 b ,一般会利用随机梯度下降(SGD) 或者其他优化方法来进行迭代改进; 值得注意的是,由于存在共享权重特性,因此同一组过滤器会在不同位置重复使用相同的参数集,这也意味着在整个网络范围内只需维护少量独立变量即可完成全局最优解搜索[^2]. ```python loss_fn = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) def backward_pass(output, target): loss = loss_fn(output, target) optimizer.zero_grad() # 清除之前的梯度 loss.backward() # 反向传播计算梯度 optimizer.step() # 使用SGD更新参数 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值