之——重要超参通道数,二维卷积
目录
杂谈
我们常做的图像处理一般是彩色图像,转化为灰度会有信息的丢失。
当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如,每个RGB输入图像具有3×ℎ×w的形状。我们将这个大小为3的轴称为通道(channel)维度。下面将更深入地研究具有多输入和多输出通道的卷积核。
正文
1.输入通道
计算机视觉通常会处理RGB三原色通道:
torch采用的处理方法是为每一个通道设置一个卷积核,结果是所有通道卷积结果的和:
所以随着通道数的改变,卷积核维度也会发生相应变化:、
实现一下多输入通道互相关运算。 简而言之,我们所做的就是对每个通道执行互相关操作,然后将结果相加:
import torch
from d2l import torch as d2l
def corr2d_multi_in(X, K):
# 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起
return sum(d2l.corr2d(x, k) for x, k in zip(X, K))
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])
corr2d_multi_in(X, K)
2.多输出通道
三维卷积核是为了接受三维输入,那么想要产生多输出的话,就可以采用多个三维卷积核:
直观地说,我们可以将每个通道看作对不同特征的响应。而现实可能更为复杂一些,因为每个通道不是独立学习的,而是为了共同使用而优化的。因此,多输出通道并不仅是学习多个单通道的检测器。
#多输出
def corr2d_multi_in_out(X, K):
# 迭代“K”的第0个维度,把每个卷积核都对输入“X”执行互相关运算。
# 最后将所有结果都叠加在一起,表示在新的维度0上堆叠
return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]]])
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]],
[[1.0, 2.0], [3.0, 4.0]]])
#构建多输出核
K = torch.stack((K, K + 1, K + 2), 0)
print(K.shape) #torch.Size([3, 2, 2, 2]) 3个2通道的2*2卷积核
print(X.shape) #torch.Size([2, 3, 3]) 2个3*3的待卷积图片
corr2d_multi_in_out(X, K).shape #torch.Size([3, 2, 2]) 卷出了3个2*2的图像输出
3.意义理解
多输入多输出有什么作用呢:
卷积神经网络(Convolutional Neural Networks,CNNs)中的多输入多输出通道(通常称为多通道卷积或多通道卷积核)具有重要的意义,主要有以下几个方面的作用:
特征学习:多通道卷积允许网络同时学习多个不同类型的特征。每个输入通道可以捕捉图像中的不同方面或属性,例如颜色、纹理、边缘等。通过将这些不同通道的特征合并,网络可以更全面地理解输入数据。
特征组合:多通道卷积允许网络在学习过程中将不同通道的特征组合起来,以获得更高级别的特征表示。这有助于网络更好地理解数据中的复杂关系和结构。
降低过拟合:多通道卷积可以增加网络的参数数量,从而提高模型的容量。这有助于减少过拟合,因为网络可以更好地适应训练数据,并且能够泛化到新的数据。
处理多模态数据:当处理多模态数据(例如同时包含图像和文本的数据)时,多输入通道允许网络同时接受和处理不同类型的输入。这对于多模态任务非常有用,如图像字幕生成或视觉问题回答。
提高性能:多通道卷积在某些任务上可以显著提高性能。例如,在图像分割任务中,多通道卷积可以帮助网络分割出不同类型的对象或区域,每个通道对应一个目标类别。
总之,多输入多输出通道在卷积神经网络中的应用可以帮助网络更好地处理复杂数据,学习更丰富的特征表示,并在各种计算机视觉和深度学习任务中取得更好的性能。它们允许网络从不同的视角和特性中获取信息,这对于理解和处理多样性的数据非常重要。
4.逐点卷积
考虑到输入输出通道的作用,诞生了不进行空间模式提取只完成通道融合的卷积层,也就是1×1卷积层,等价于全连接层:
这里输入和输出具有相同的高度和宽度,输出中的每个元素都是从输入图像中同一位置的元素的线性组合。 我们可以将1×1卷积层看作在每个像素位置应用的全连接层,以ci个输入值转换为co个输出值。 因为这仍然是一个卷积层,所以跨像素的权重是一致的。
注意1*1卷积和直接把输入卷积加起来是不一样的,1*1可以通过n组核输出n组卷积结果,而单纯相加只有一个结果。
逐点卷积的应用:1*1卷积在步幅1不填充情况下类似全连接层,它提出的主要作用是在不用像真正的全连接层一样Flatten,可以在不改变特征图大小情况下灵活地改变通道数。
通常来说大的深度学习模型都是要多输入多输出卷积的,也就是用n组m个核对m个输入维度做卷积得到n个输出特征图,而有了逐点卷积后,则可以先用一组m个核对m个输入图像做卷积但不相加,而是用逐点卷积将这m个通道的结果融合起来,同时控制输出特征图个数,而不是通过n组核来控制输出n个特征图片,极大减少了计算量:
MobileNet 是一种轻量级卷积神经网络(Convolutional Neural Network,CNN),旨在在计算资源有限的移动设备上进行高效的图像分类和计算机视觉任务。MobileNet 的核心原理是通过深度可分离卷积(Depthwise Separable Convolution)和逐点卷积(Pointwise Convolution)来减少网络的参数数量和计算复杂性,从而实现高效的模型。
MobileNet 的主要原理包括以下几个关键概念:
深度可分离卷积(Depthwise Separable Convolution): 这是 MobileNet 的核心组件之一。传统卷积操作同时进行空间卷积和通道卷积,而深度可分离卷积将这两个操作拆分为两个独立的步骤。首先,进行深度卷积(Depthwise Convolution),对每个输入通道执行卷积操作。然后,使用逐点卷积(Pointwise Convolution),将深度卷积的输出通过 1x1 卷积核组合起来。这样可以大大减少参数数量,因为深度卷积通常是计算密集型的操作。
宽度多项式(Width Multiplier): MobileNet 引入了一个宽度多项式因子,允许用户控制网络的宽度,即每层的通道数。通过调整宽度多项式因子,可以在减少模型大小和计算复杂性之间进行权衡。较小的因子会减少通道数,从而减少参数数量和计算成本。
分组卷积(Grouped Convolution): MobileNet 还引入了分组卷积的概念,将卷积核分为多个组,每个组对输入进行部分卷积。这有助于降低计算复杂性,特别是在深度可分离卷积中。
全局平均池化(Global Average Pooling): MobileNet 通常使用全局平均池化来代替全连接层,这有助于减少参数数量并降低过拟合的风险。
5.补充小结
总结以上所有,完整的二维卷积层参数情况:
后记
-
输出通道数是又一个新的超参数。
-
多输入多输出通道可以用来扩展卷积层的模型。
-
每个输入通道有独立的二维卷积核,所有通道相加得到一个输出结果。
-
每个输出通道有独立的三维卷积核。
-
当以每像素为基础应用时,1×1卷积层相当于全连接层。
-
1×1卷积层通常用于调整网络层的通道数量和控制模型复杂性。