01.多个卷积核的多通道卷积

1例图

根据实验原理,将我们的逻辑抽象成组件之后,连线如下图所示。

2.多个卷积核的多通道卷积理论讲解

在前面的章节中我们了解了卷积的过程,就是使用一个小的卷积核与输入特征矩阵进行滑动卷积的过程。

前面的章节中为了能更好的说清楚卷积的过程,其输入特征矩阵都是单通道的,是灰度图或者二值化图,但是实际上图像大部分都是彩色图,也就意味着不是一个通道的特征输入。卷积的过程中大部分都是多通道的卷积,并且在卷积完之后还会加上偏置项

多通道卷积的定义:

在多通道卷积过程中,输出特征矩阵是由每个通道的卷积核与对应通道的输入特征矩阵在对应位置进行卷积,然后将多个通道的卷积结果相加的结果。

以输出特征矩阵的左上角“1”为例,其值是由第一个通道的卷积核第一个通道的输入特征矩阵的左上角进行卷积加上第二个通道的卷积核第二个通道的输入特征矩阵的左上角进行卷积加上第三个通道的卷积核与第三个通道的输入特征矩阵的左上角进行卷积,最后得到的卷积结果相加得到输出特征矩阵的左上角值为“1”,其他的以此类推。

在得到输出特征矩阵后,偏置矩阵就会与输出特征矩阵相加,得到本次多通道卷积的最终结果

由此我们得到两个结论

  1. 输入特征的通道数决定卷积核的通道数卷积核通道个数=输入特征通道个数)。
  2. 卷积核的个数决定了输出特征矩阵的通道数与偏置矩阵的通道数卷积核个数=输出特征通道数=偏置矩阵通道数)。

2.2卷积过程的偏置bias

对于卷积神经网络的偏置,是对卷积后输出的特征矩阵的每一个位置都进行偏置运算。

如下图的红色字体,例如两个卷积核运算后,第一个卷积核的偏置是-1,那么就要对每一个位置元素都进行-1运算操作,第二个卷积核的偏置是1,那么就要对每一个位置的元素进行+1操作。

就得到了相应的求完偏置的输出特征图。

代码实现

#导入包
import torch
import torch.nn as nn
#nn.Sequential 是容器 自带forward方法
conv1_pool_layer=nn.Sequential(nn.Conv2d(in_channels=3,out_channels=5,kernel_size=3,stride=1,padding='same',bias=True),
                          # 窗口是2 步长为2
                          nn.MaxPool2d(2, 2),
                          nn.Conv2d(in_channels=5,out_channels=1,kernel_size=3,stride=1,bias=True),
)

# class convmodel(nn.Module):
#     def __init__(self):
#         super(convmodel,self).__init__()
#         self.conv1_layer=nn.Conv2d(in_channels=3, out_channels=5, kernel_size=3, stride=1, bias=False)
#     def forward(self,x):
#         return self.conv1_layer(x)

#仿真  1张3通道的图片
#torch.rand(2,3,30,30)中的第一个2表示样本数量=2,3表示通道数,长 宽为30x30
image=torch.rand(2,3,6,6)
#卷积进行计算后池化的结果
result1=conv1_pool_layer(image)

# model=convmodel()
# result2=model(image)
print(result1.shape)
# print(result2.shape)

02.卷积类型

本节目标:

1. 卷积结果,感受一下数字识别的可视化过程,更好的理解卷积。

2.学习卷积类型,包括(二维卷积(单通道),二维卷积(多通道),三维卷积 、反卷积(转置卷积)

空洞卷积(膨胀卷积),可分离卷积、扁平卷积、分组卷积、混洗分组卷积)

1. 卷积结果

一般来讲,卷积结果指的是将原本的特征输入图中的特征进行提取,这里我们分享一个数字识别卷积的可视化过程

通过上述的动画,可以发现卷积实际上将原本图像中的某一特征进行提取。

2. 卷积类型

2.1 二维卷积(单通道卷积版本)

之前所讲卷积相关内容其实真正意义上叫做二维卷积(单通道卷积版本),即只有一个通道的卷积。

如下图,我们对于卷积核(kernel)的描述一般是大小3x3、步长(stride)为1、填充(Padding)为0(VALID)

2.2 二维卷积 (多通道版本)

彩色图像拥有R、G、B这三层通道,因此我们在卷积时需要分别针对这三层进行卷积

最后将三个通道的卷积结果进行合并(元素相加),得到卷积结果

2.3 三维卷积

二维卷积是在单通道的一帧图像上进行滑窗操作,输入是高度为H,宽度为W的二维矩阵。

而如果涉及到视频上的连续帧或者立体图像中的不同切片,就需要引入深度通道,此时输入就变为高度为H,宽度为W,深度为C的三维矩阵。

不同于二维卷积核只在两个方向上运动,三维卷积的卷积核会在三个方向上运动,因此需要有三个自由度。

这种特性使得三维卷积能够有效地描述3D空间中的对应关系,它在一些应用中具有显著的优势,例如3D对象的分割以及医学图像的重构等。

三维卷积核的大小为k*k*d,三维特征图的深度为L,一般d<L,由于卷积核本身是三维的(如下图所示),在三维的特征图上进行卷积时权重是共享的,输出时一个三维的特征图.

2.4 反卷积(转置卷积)

卷积是对输入图像及进行特征提取,这样会导致尺寸会越变越小,而反卷积是进行相反操作。
只是并不会完全还原到跟输入图一样,只是保证了与输入图像尺寸一致,主要用于上采样
从数学上看,反卷积相当于是将卷积核转换为稀疏矩阵后进行转置计算。也被称为转置卷积

如下图,进行转置卷积(反卷积)示意图

2.5空洞卷积(膨胀卷积)

空洞卷积主要是为扩大感受野,在卷积核两个面的元素之间插入空格“膨胀”内核,形成“空洞卷积”(或称膨胀卷积),
并用膨胀率参数L表示要扩大内核的范围,即在内核元素之间插入L-1个空格。当L=1时,则
内核元素之间没有插入空格,变为标准卷积。图中未L=2的空洞卷积。

注意:在pytorch中使用dilation参数

2.6 可分离卷积

2.6.1 空间可分离卷积

空间可分离卷积简单地将卷积核划分为两个较小的卷积核。 最常见的情况是将3x3的卷积核划分为3x1和1x3的卷积核,如下所示:

intermediate image 是中间图像。

现在,我们不是用9次乘法进行一次卷积,而是进行两次卷积每次3次乘法(总共6次),以达到相同的效果。 乘法较少,计算复杂性下降,网络运行速度更快。

import numpy as np
a=np.array([[10,20,30],
            [40,50,60],
            [70,80,90]])
b=np.array([[3,6,9],
            [4,8,12],
            [5,10,15]])
print(f"a*b",np.sum(a*b))
c=np.array([1,2,3]
           )
d=a*c
f=np.array([[3],[4],[5]]
           )
print(f"d*f",np.sum(d*f))

2.6.2 深度可分离卷积

深度可分离卷积由两部组成:

首先使用给定的卷积核尺寸对每个通道分别卷积并将结果组合,该部分被称为depthwise convolution(深度卷积),随后深度可分离卷积使用单位卷积核进行标准卷积并输出特征图,该部分被称为pointwise convolution(逐点卷积)。

解释性的例子

假设卷积核输入端的特征图大小为(8x8)x3,输出端的大小为(8x8)x1,卷积核尺寸为(3x3),步长为1,无填充,则深度可分卷积首先使用3个(3x3)的卷积核在每个通道分别卷积,并组合得到(8x8)x3的张量,随后使用1个(1x1)x3的单位卷积核输出结果为(8x8)x1,所需的参数总量为X;若使用标准卷积,则1个(3x3)x3的卷积核所需的参数总量为4X,是前者的4倍左右。

图示:

2.7 扁平卷积

扁平卷积是将标准卷积拆分成为3个1x1的卷积核,然后再分别对输入层进行卷积计算。

2.8 分组卷积

2012年,AlexNet论文中最先提出来的概念,当时主要为了解决GPU显存不足问题,将卷积分组放到两个GPU中并行执行。

在分组卷积中,卷积核被分成不同的组,每组负责对相应的输入层进行卷积计算,最后再进行合并。

下图中卷积核被分成两个组,前半部负责处理前半部的输入层,后半部负责后半部的输入层,最后将结果组合。

注意:输入通道必须可以整除groups,在pytorch中使用groups参数

如果输入通道和输出通道都除以groups的话,最后拼接一下,输入通道必须可以整除groups,输出通道必须可以整除。

如果输入通道除以groups的话,最后拼接一下,只需要输入通道必须可以整除groups。

2.9 混洗分组卷积

混洗分组卷积(Shuffle Grouped Convolution)是一种结合了分组卷积(Grouped Convolution)和通道混洗(Channel Shuffle)的卷积策略,旨在平衡模型的计算效率与表征能力。

分组卷积将输入通道和输出通道分别划分为多个组,每个组内独立进行卷积计算。分组卷积最终结果会按照原先的顺序进行合并组合,阻碍了模型在训练时特征信息在通道间流动,削弱了特征表示。

通道混洗(Channel Shuffle),打破分组卷积的通道隔离,让不同组的特征能够交互。将分组后的通道重新排列,使每个输出组包含来自不同输入组的通道。

混洗分组卷积示意图如下:

更多推荐