对于CNN卷积神经网络的前向传播和反向传播的理解

对于CNN卷积神经网络的前向传播和反向传播的理解

前向传播示意图:

在这里插入图片描述

​ 咋一看这张图,作为初学者可能会不知所云( ̄ω ̄=)?但是想要很好的理解前向传播的原理,我们得从这张图细说。

1.首先我们从x,w的参数组成说起?

​ 如图左下角所示,x[编号n,通道c,高h,宽w],这里需要的注意的是通道c和编号n的作用。如图,这里输入的图片格式采用3通道,即R,G,B可以看作是输入图片的深度为3。

在这里插入图片描述
这里的0,1,2分别代表R,G,B三种颜色层,而w[…,0/1/2,…,…]也是同理。而编号n的作用在于识别是否为同一张照片,即如图,x[0,0,…],x[0,1,…],x[0,2,…]代表他们同属于某一张图片,采用编号0。

2.filter滤波器与图片的对应关系是什么?

在这里插入图片描述
接着,我们思考右上角的计算式?对于不断变换的h,w对应是什么意思呢?结合上图,我们发现是filter滤波器窗口w在x上不断的移动的结果,而h,c对应的位置发生了变化(即滤波器窗口在向右移动)

在这里插入图片描述
而上述计算式中的out[编号n,x,y]中x,y对应的是最终输出的out中的坐标。

3.共享权重和偏重机制

​ 还是上述的计算式,对于同一张图(R/G/B,而不是RGB三张图共享),采用共享filter滤波器权重w和偏重b。

​ 当filter窗口扫描完一张图的所有像素位置,得到最终输出的out。这里需要的注意的是,滤波器的个数取决于上一层输入图的深度,即通道数。

​ 换一种角度理解就是,输入图有多少层,便需要多少个filter滤波器去提取特征。

反向传播示意图:

在这里插入图片描述

4.反向传播的式子怎么得来的?

​ 前向传播的关系式为:out=x*w+b,而反向传播时则需求解出dw是什么?

​ 反向传播的目的:更新参数w。因此要先算出dw。假设上一层会传过来一个梯度dj/dout(j对out的求导),根据链式求导法则,因此dw = dj/dout * dout/dw =dj/dout * x ,在计算机中方便为变量命名的缘故,将dj/dout记为dout,dj/dw记为dw,即图中的情况。

​ 即dw=dout*x;将dout反向乘以x得到dw

### 卷积神经网络传播 卷积神经网络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更新参数 ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super__Tiger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值