2.0 卷积网络 Con-volutional neural network
1. 卷积
1)数学定义:S(t) = ∫ x(a) * w(t -a) da 等价于 S(t) = (x*w)(t)
S(t):feature_map 特征图;x(a):input 输入;w:kernel_function 核函数(滤波器,算子)
对于工业数据,数据大多是 离散的、多维的 等,对上述卷积公式修正:S(i, j) = I * K(i, j) = Σm Σn I(i+m, j+n) * K(m, n)。I为Input输入,K为卷积核,核尺寸为(m,n),公式的含义为:对于(m,n)的卷积核,在Input的 (i, j) 位置 的卷积,m和n都为0时,Input的左上角和K的左上角对应元素相乘,m和n变化时卷积核和input对应元素的位置也随之变化,最后累加完成整个卷积过程。
2. 卷积特征提取
前置知识:灰度图像只有一个通道,像素值从 0 ~ 255, 0最暗为黑色,255最亮为白色。
CV领域,在图像的(x,y)位置,基于邻域的函数运算,称为卷积核。不同卷积核实现的函数功能不同,卷积核中各元素值累加和为1,表示权重。如:Sobel边缘检测算子,对于 bottom sobel,中间行为0,上下两行有数值,计算结果就是:图像竖直方向上,下一行元素值减去上一行元素值,为竖直方向像素值的导数(梯度)。因此,卷积结果就是:检测到的边缘特征是 水平条纹形状的,竖直方向的梯度。
可视化网站(膜拜大佬):https://setosa.io/ev/image-kernels/。
3. 卷积和前馈网络的关系
卷积也是一种前馈网络,相较于全连接的前馈网络,其特征主要为:稀疏连接、权重共享。卷积来源于人眼的局部感知原理,全连接相当于全局感知,不利于特征提取且计算量大,局部感知相当于视线集中于一点会看的更清楚。
相似点:
卷积过程,input元素和卷积核元素乘积再累加,input元素为输入,卷积核元素为权重,写成表达式也是 向量内积的线性形式,和前馈网络一致,所以,卷积实质也是前馈网络。和前馈网络一致,卷积网络除了权重累加外也可以有偏置,一个卷积核,对应一个Output的通道,对应一个偏置。卷积的偏置 是一个 一维列表,长度为 c_out。
差异性:
稀疏连接:multi-layer是前面一层的所有输入元素都乘权重才得到下一层的一个激活;卷积只需要input中和卷积核对应位置的元素乘权重就会得到下一层的一个特征点。
权重共享:multi-layer下一层的每个激活和上一层连接的权重值都不一样;而卷积下一层的每个特征点和上一层激活之间的权重都是用的 卷积核 的权重。
4. 工程中关于卷积的一些约定
4.1 核函数尺寸和和上下游的关系
在工程中,彩色的RGB图像一般会一次输入多张图片,称为一个batch。RGB为彩色图像的三个通道。卷积核要处理有多个通道的输入,那么卷积核也需要有多个通道,最后将每个通道的卷积结果累加形成一个结果通道。
1)每个核函数的通道数都要和input的通道数保持一致。
2)核函数的个数即 feature map 的通道数。
4.2 output的宽和高计算
padding填充:对图片的外边缘填充一圈一圈的0。
stride步长:用于降采样,即:卷积核每完成一个卷积运算会移动几个单位长度。
dilation膨胀因子:卷积核间元素间隔插入0元素,为了增大感受野。只是卷积核尺寸变了,其余不变。膨胀后的卷积核尺寸:H方向:dilation[0] * (k[0] - 1) + 1 。
4.3 工程上input、kernel、output的size
Input = [ N,c_in,H,W ]
kernel = [ c_out,c_in,k_h,k_w ],【在torch中,kernel = [ c_in,c_out,k_h,k_w ] 】
Output = [ N,c_out,H',W' ]
N:batch,表示每次输入的图片数量。
5. 常见卷积变种
注:下列卷积网络的优化,并不要求模型最终输出计算数值上的严格相等,只要保证优化后的计算也能达到神经网络要求的size维度即可。这和以往的等价计算概念要有所区分。因为卷积操作本身就是一个黑匣子,无法严格证明怎么做就一定会好。所以,卷积变种中的优化,更多体现的是 通过优化卷积结构和计算方式,使得最终模型达到完全相同的size维度。而不是追求最终数值上的严格一致,因为并不能保证一开始的那种计算结果就是最佳结果。只要优化后的模型在实际中的表现良好,就认为改进有效。!!!
5.1 1×1卷积
建立通道之间的联系,卷积+步长:有效降低维度,减小计算量。
5.2 分组卷积
卷积中卷积核个数很多,channel过大。12年在AlexNet中提出分组卷积,主要是为了解决 GPU显存不足的问题(显存不足限制的是单次计算的计算量,所以将卷积计算的单次计算量减小就能够解决显存不足问题, 如:在保证outputshape不变的前提下减小kernel的shape)。
分组主要是:对Input的 c_in 维度进行分组,因为c_in的所有通道组成Output的一个通道,所以对c_in分组还原时:将几个组的计算结果分别累加得到真实结果;对kernel的 c_out 维度进行分组,因为kernel的c_out表示卷积核个数且每个每个卷积核都会直接构成Output的一个通道,所以对c_out分组还原时:分别将分组后的各个结果在输出的channel维度直接拼接即可。但是吧:分组卷积没这么干,分组卷积将Input按照 c_in 分成了 g 组,然后将kernel按照 c_out 分成了 g 组,然后input和kernel做 g 次普通卷积,最后再按照 c_ou t的拆分进行拼接。这样操作后,最终得到的Output的shape和修改前一致且最终验证效果也不错。
5.3 深度可分离卷积
在分组卷积的基础上将Inut的可分组数量开到最大,这样的分组后结果的input的 c_in = 1,input的每个channel分别卷积以致通道之间没有关联,但这样必然导致最终Output的channel变大,所以最后再通过 1×1 卷积处理,将Output的channel削减到指定的大小 同时也有关联各个分离的通道卷积层的效果。
5.4 空间可分离卷积
在input的层面优化到了极致,为了进一步降低显存压力,将 k × k 的卷积核 分成 k × 1 和 1 × k 两步卷积操作,最终结果得到的维度size也和改进前一致,没毛病。同样的,这样操作确实省计算,但是二者 无论在数学的计算数值上 还是 工程效果 上,二者肯定都是不等价的,表达效果肯定弱了。因为 k × k 的卷积是从 两个维度综合提取出特征,而 分离后的卷积核每次只能从 一个维度上提取特征,效果肯定不等,但是计算量肯定小了。
5.5 膨胀卷积(空洞卷积)
卷积操作后面一般会紧跟pooling操作,pooling除了抑噪、降低冗余信息、减小计算量等作用外,还有增大感受野的作用。但是pooling操作会丢失一部分信息且经过上采样无法还原,所以,为了增大卷积提取特征时的感受野且不改变卷积核尺寸(卷积核尺寸变了,输出网络层的尺寸也会边) =》膨胀卷积。膨胀卷积的效果等价于在普通卷积核的每个间隔插入了0元素。
5.6 反卷积
适用上采样,先放大input尺寸(在中间插0),然后转置kernel再做正向卷积。但是注意:反卷积并不能完全还原为原来图像,只是还原后的尺寸前后一致。
5.7 可变形卷积
应对transformer的冲击,注意力机制可以将不同的区域之间进行关联,但是普通卷积kernel只能和input对应位置的元素做运算,所以kernel在对input相应区域做权重计算的时候,会对kernel映射的input的位置进行offset,这样kernel就可以卷积到其它的的像素位置。
6. 卷积的维度 conv1D、2D、3D
-
判断几维要去掉batch和channel,图像是二维,视频是三维。二维卷积的最小取数单位是平面,stride也从两个方向上滑动;三维卷积的最小取数单位是一个立方体,stride从三个方向上滑动完才算完成一次卷积。
- 1D的kernel:[c_out, c_in, k_w]
- 2D的kernel:[c_out, c_in, k_h, k_w]
- 3D的kernel:[c_out, c_in, k_x, k_y, k_z]
官网:https://pytorch.org/docs/stable/index.html
博客:https://blog.csdn.net/u012348774/article/details/104695411
自己写代码验证。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验