写这篇博文是因为在写 PyTorch 中的卷积层(Convolutional Layer)类 这篇博文的过程中,遇到了一个问题。
在使用 nn.Conv2d 时,需要指定卷积核的一些参数,包括输入通道数、输出通道数、卷积核大小、步长等。
这里卷积核大小和步长很容易理解,对通道数的理解参见博文:输入通道数 & 输出通道数 - 理解
那么输出通道数是怎么来的呢?
是根据输入通道数和卷积核得到输出通道数吗?
如果是的,那么是怎么样得到的呢?
如果不是,那么输出通道数难道是自己想设哪个值就设哪个值吗?
我不懂呀 !!!!!!(痛苦面具 * 6)
卷积:卷积是原始图像与卷积核之间的滑动局部加乘计算过程。卷积运算是矩阵的一种哈德马积,不是线性代数中常用的乘积。
在图像和计算机视觉领域,卷积其实已经有几十年的发展历史。在传统的计算机视觉和模式识别中,卷积又被称为滤波器(Filter)。卷积就是对信息(信号)进行“过滤”(滤波),它能够“过滤出”我们感兴趣、对我们有用的信息。
对一张图片,进行卷积操作,可以得到很多种神奇的效果。图5来自维基百科,最上面是卷积核是一个单位矩阵,使用单位矩阵对原图进行卷积操作,得到的输出与原图一样;接下来的几个卷积核可以检测到物体边缘,或者进行锐化和模糊。(感叹:卷积好像“美颜”滤镜啊)
经过多年的研究,人们已经能够设计出不同的核矩阵,对图片进行转换,以达到不同的效果。不过,在深度学习出现之前,卷积核是人工设计的,当然需要消耗大量的时间和精力。
感谢梯度下降和反向传播,深度学习的出现使得不再需要人工设计卷积核。在卷积神经网络里,卷积核在初始化的时候是一些随机值,经过了训练,核矩阵是可以被学习出来的。或者说,卷积核是一些参数,可以通过机器学习训练得到。
下图展示了不同的5*5卷积核经过梯度下降法的训练,不断更新变化的过程:
以单通道卷积为例,输入为(1,5,5),分别表示1个通道(可以理解为 input 只有一个特征图),宽为5,高为5。假设一个卷积核大小为3x3,padding=0,stride=1。
卷积内核不断的在图像上进行遍历,最后得到3x3的卷积结果,结果如下:
以彩色图像为例,包含三个通道,分别表示RGB三原色的像素值,输入为(3,5,5),分别表示3个通道,每个通道的宽为5,高为5。
假设卷积核只有1个,卷积核通道也为3,每个通道的卷积内核大小都是3x3,padding=0,stride=1。
把上述图像通道放在一起,计算原理过程还是与上面一样,堆叠后的表示如下:
在上面的多通道卷积(只有1个卷积核)中,输出的卷积结果只有1个通道,把整个卷积的整个过程抽象表示,过程如下:
即:由于只有一个卷积核,因此卷积后只输出单通道的卷积结果(黄色的块状部分表示一个卷积核,黄色块状是由三个通道堆叠在一起表示的,每一个黄色通道与输入卷积通道分别进行卷积,也就是 channel 数量要保持一致,这里只是堆叠放在一起表示而已)。
那么,如果要卷积后也输出多通道,增加卷积核(filers)的数量即可,示意图如下:
备注:上面的feature map的颜色,只是为了表示不同的卷积核对应的输出通道结果,不是表示对应的输出颜色。
然后将每个卷积核对应的输出通道结果(feature map)进行拼接,图中共有m个卷积核,则输出大小变为(m * w’ * h’),其中w’、h’表示卷积后的通道尺寸,原始输入大小为(n * w * h)。
权值:
卷积核的值就是待学习的权重参数。
网络训练时,输出的结果会和数据集标签做损失计算,然后把计算得到的损失反向梯度下降去更新卷积核里的每一个参数。所以卷积核里面的参数最终是训练得到的。
偏置:
每一个 滤波器 都包括一个偏置参数(bias)。这个偏置参数是该 滤波器 中所有 内核 共享的。最终的卷积结果需要在加上该偏置值。
滤波器与内核的关系:
- 内核(kernel)是一个二维矩阵,长*宽;
- 滤波器(filter)也叫卷积核,过滤器。是一个三维立方体,长× 宽 × 深度, 其中深度便是由 多少张内核构成,与输入层的深度一致。
两者之间的关系:可以说 kernel 是 filter 的基本元素, 多张 kernel 组成一个 filter。
详见:
激活:
卷积与偏置加和后的值,还需要再经过激活函数(比如 ReLU)才得到最终特征图上的值,图像一般都选ReLU作为激活函数,因为大于1的时候趋向无穷大,这样反向计算损失的时候不会出现梯度消失的风险。
out_channels 表示卷积层中卷积核的数量,也就是提取特征的数量。
一个卷积核可以提取一种特定的特征,比如边缘、角落等。
当我们需要从输入数据中提取多种不同的特征时,就需要使用多个卷积核,每个卷积核都可以提取一种不同的特征。
而 out_channels 的数量就是卷积核的数量,即每个卷积核各自生成一个输出特征图,这些特征图汇总起来,就是最终的输出特征图。
输出通道数 out_channels 的值 可以根据具体的任务需求和模型设计来确定。
实际中,我们可以通过调整输出通道数,不断尝试和调整以找到一个合适的输出通道数。在深度卷积神经网络中,通常会随着网络深度的增加,逐渐增加输出通道数,以增强网络的特征提取能力。在训练过程中,通过交叉验证等方法来确定最优的超参数(包括输出通道数),从而得到一个最佳的模型。
原图像:
在 identity 卷积核中,只有中心位置 [2, 2] 位置处的权重为 1,其余均为 0,所以在进行卷积运算加权后时,像素只与自己本身位置进行了运算,最后返回的还是原像素的值,所以图像处理后是不变的。
edge detction(边缘检测)对图像识别中的特征提取是非常有作用的,边缘检测卷积核都有一个共同点,就是能够突出图片矩阵中变化剧烈的位置。矩阵如下所示,三种边缘检测核的效果是越来越明显,主要原因就是加强了卷积核中 [2, 2] 位置处与周围元素的区别,图片中变化剧烈位置的在加权后,数值大的更大,数值小的更小,形成了边缘检测效果。
锐化的本质还是利用的边缘检测的原理,放大 [2, 2] 位置与周围元素的权重的区别。与边缘检测权重和为 0 相比,锐化卷积核中所有权重加起来后的值为 1。当权重和大于 1 时,会整体使图片变亮,小于 1 会变暗,等于 1 就会保留原始亮度,所以锐化卷积核保留了原始图形的亮度,而上述的三个边缘检测核使图像变暗。
在盒模糊卷积核中,所有位置的权重均为 1/9,所以 [2, 2] 位置处的元素值会以一个相同权重与周围变得更相似,达到均匀模糊的效果。
高斯模糊卷积核依赖的是高斯函数,所以卷积核的值是围绕着中心点分布的,离中心点越近,贡献也就越大,所以权重值就越高,二维区域高斯曲线图如下:
首先列出一个 3×3 的高斯模糊卷积核,中心点权重为 4,离得最近的上下左右权重都是 2,稍远一点的对角位置贡献的权重都是 1,最后除以权重和 16,矩阵和效果如下所示:
可以发现,因为权重更加聚焦到中心点位置,高斯模糊的效果相比盒模糊要更清晰一些。
再列出 5×5 的高斯模糊卷积核,和 3×3 类似,以中心点画圆,离圆心越远权重越小,最后除以权重和 256,矩阵和效果图如下:
与 3×3 的高斯模糊对比,由于距离中心点更远的位置也贡献了权重,所以 5×5 要更模糊一些。
https://blog.csdn.net/yilulvxing/article/details/107452153
https://blog.csdn.net/chehec2010/article/details/126980842
https://blog.csdn.net/weixin_39615808/article/details/111637916
https://blog.csdn.net/i_silence/article/details/116483732