CNN卷积核计算原理

一、单通道卷积

以单通道卷积为例,输入为(1,5,5),分别表示1个通道,宽为5,高为5。假设卷积核大小为3x3,padding=0,stride=1。

在这里插入图片描述
相应的卷积核不断的在图像上进行遍历,最后得到3x3的卷积结果,结果如下:
在这里插入图片描述

二、多通道卷积

以彩色图像为例,包含三个通道,分别表示RGB三原色的像素值,输入为(3,5,5),分别表示3个通道,每个通道的宽为5,高为5。假设卷积核只有1个,卷积核通道为3,每个通道的卷积核大小仍为3x3,padding=0,stride=1。

卷积过程如下,每一个通道的像素值与对应的卷积核通道的数值进行卷积,因此每一个通道会对应一个输出卷积结果,三个卷积结果对应位置累加求和,得到最终的卷积结果(这里卷积输出结果通道只有1个,因为卷积核只有1个。

可以这么理解:最终得到的卷积结果是原始图像各个通道上的综合信息结果。
在这里插入图片描述

上述过程中,每一个卷积核的通道数量,必须要求与输入通道数量一致,因为要对每一个通道的像素值要进行卷积运算,所以每一个卷积核的通道数量必须要与输入通道数量保持一致。

在这里插入图片描述

三、多核卷积

下图为双核卷积的效果。
在这里插入图片描述

三、卷积核输出特征大小计算

若图像为正方形:设输入图像尺寸为WxW,卷积核尺寸为FxF,步幅为S,Padding使用P,经过该卷积层后输出的图像尺寸为NxN:
在这里插入图片描述
若图像为矩形:设输入图像尺寸为WxH,卷积核的尺寸为FxF,步幅为S,图像深度(通道数)为C,Padding使用P,则卷积后输出图像大小:
在这里插入图片描述
注意:Padding的作用用于解决图像边缘信息损失的问题。
在这里插入图片描述
如same:(same模式只有步长为1时,输入和输出的尺度才相同)
输入特征图为5x5,卷积核为3x3,外加padding 为1,则其输出尺寸为:
在这里插入图片描述

池化操作:
设输入图像尺寸为WxH,其中W:图像宽,H:图像高,D:图像深度(通道数),卷积核的尺寸为FxF,S:步长。池化后输出图像大小:
在这里插入图片描述
当进行池化操作时,步长S就等于池化核的尺寸,如输入为24x24,池化核为4x4,则输出为:
在这里插入图片描述
若除不尽,则取较小的数,如池化核为7x7,则输出为:
在这里插入图片描述
不是用四舍五入,就是取最小的整数,即使为3.9,也是取3。
池化的作用:
1.特征不变形:池化操作是模型更加关注是否存在某些特征而不是特征具体的位置。
2.特征降维:池化相当于在空间范围内做了维度约减,从而使模型可以抽取更加广范围的特征。同时减小了下一层的输入大小,进而减少计算量和参数个数。
3.在一定程度上防止过拟合,更方便优化。
空洞卷积(也称扩张卷积,膨胀卷积)–dilated convolution

在这里插入图片描述
其中 d为空洞卷积的空洞率(正常的卷积d=1),p为padding,k为kernel size。
下面的空洞卷积核是d=2,k=2的空洞卷积卷积核。

当d=2,k=2时,-d(k-1)-1 = -3,即相当于 一个k=3的正常卷积核。下图的正好是3x3的。
在这里插入图片描述

更多基础知识见网址:https://cs231n.github.io/convolutional-networks/#conv

### 计算卷积操作 #### 定义与基本概念 卷积是一种用于信号处理和图像处理中的重要数学工具,在机器学习领域尤其是深度学习中被广泛应用。通过两个函数f(τ) 和g(t−τ),其定义如下: \[ (f * g)(t)= \int_{-\infty}^{+\infty} f(\tau)g(t-\tau)d\tau \] 对于离散情况下的卷积,则可以表示为求和形式[^1]。 #### 卷积的具体计算步骤 当涉及到具体的数值计算时,通常会遵循以下几个方面来完成一次完整的卷积运算: - **输入准备**: 准备好待处理的数据序列以及滤波器(kernel)。这两个部分构成了卷积过程中最基本的要素。 - **翻转核矩阵**: 将给定的核矩阵沿中心位置做镜像变换得到新的权重分布图谱。这一步骤是为了后续能够按照标准定义执行滑动窗口乘法累加操作而做的预处理工作。 - **平移并相乘累积**: 把经过上述调整后的核放置于原始数据集之上,并逐步向右移动一定步长(step size), 对应位置上的元素逐位相乘之后再求总和, 形成一个新的输出值;重复此过程直到遍历整个输入空间为止。 ```python import numpy as np def convolve(input_data, kernel): input_width = len(input_data) kernel_size = len(kernel) output_length = input_width - kernel_size + 1 result = [] for i in range(output_length): sum_value = 0 for j in range(kernel_size): sum_value += input_data[i+j]*kernel[j] result.append(sum_value) return np.array(result) ``` 该Python代码片段展示了如何实现简单的线性卷积算法。这里假设`input_data`是一个列表或者数组类型的对象,代表要进行卷积的一维信号源;同样地,`kernel`也是一个相同类型的变量用来存储作为模板使用的权重组件。 #### 边缘效应及其应对策略 由于边界处无法获得足够的邻居节点来进行有效的卷积计算,因此会产生所谓的“边缘效应”。为了克服这个问题,一般采用填充(zero-padding)的方法扩展原图尺寸,使得即使处于边界的像素也能参与到正常的卷积流程当中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值