介绍
目前存在许多的深度学习库和平台(如Tensorflow、Keras、Pytorch、Caffe或Theano),在这篇文章中,我将尝试列出所有这些参数,以了解它们对计算时间、训练参数数量和卷积输出通道大小的影响。
输入形状:(3,7,7)-输出形状:(2,3,3)-K:(3,3)-P:(1,1)-S:(2,2)-D:(2 ,2)— G:1
这篇文章的各部分将根据以下参数进行划分。这些参数可以在Conv2d模块的Pytorch文档中找到:
in_channels(int)—输入图像中的通道数out_channels(int)—卷积产生的通道数kernel_size(int或元组)—卷积核的大小stride(int或tuple,可选)—卷积的步长。默认值:1padding(int或tuple,可选)—在输入的两侧都添加了零填充。默认值:0dilation(int或tuple,可选)—核元素之间的间距。默认值:1groups(int,可选)—从输入通道到输出通道的blocked connections数量。默认值:1bias(布尔值,可选)—如果为True,则将可学习的偏差添加到输出中。默认:True最后,我们将根据参数和输入通道的大小计算输出通道的大小。
什么是核?
输入图像与核之间的卷积 简单来说,通过应用Convolution product,核将从左到右,从上到下移动整个图像。
Convolution product 输入形状:(1,9,9)-输出形状:(1,7,7)-K:(3,3)-P:(0,0)-S:(1,1)-D:(1 ,1)— G:1
如果你还不熟悉滤波器和卷积矩阵,那么我强烈建议你多花点时间来理解卷积核。它们是二维卷积层的核心。
可训练参数和偏差
可训练参数,简称“参数”,是神经网络训练时需要更新的所有参数。在Conv2d中,可训练元素是组成核的值。对于3×3的卷积核,我们有3*3=9个可训练的参数。
我们可以包含偏差,也可以不包含。偏差的作用将加到convolution product的总和上。这个偏差也是一个可训练的 参数,它使3 x 3核的可训练参数数量增加到了10。
输入输出通道数
输入形状:(1,7,7)-输出形状:(4,5,5)-K:(3,3)-P:(0,0)-S:(1,1)-D:(1 ,1)— G:1
使用层的好处是能够在同一时间执行类似的操作。换句话说,如果我们想要对一个输入通道应用4个相同大小的不同的filters,那么我们将有4个输出通道。这些通道是4个不同的filters的结果。因此产生于4个不同的核。
在上一节中,我们看到了可训练参数是构成卷积核的要素。因此参数的数量随卷积核的数量线性增加。因此与所需输出通道的数量成线性关系。还要注意,还要注意,计算时间也与输入通道的大小成比例地变化,与内核的数量成比例地变化。
请注意,“参数”图中的曲线是相同的 同样的原理也适用于输入通道的数量。让我们考虑RGB编码图像的情况。这幅图像有3个通道:红色,蓝色和绿色。我们可以决定在这3个通道上使用相同大小的filters来提取信息,以获得4个新通道。
输入形状:(3,7,7)-输出形状:(4,5,5)-K:(3,3)-P:(0,0)-S:(1,1)-D:(1 ,1)— G:1
每个输出通道都是经过过滤的输入通道的和。对于4个输出通道和3个输入通道,每个输出通道都是3个经过过滤的输入通道的和。换句话说,卷积层由4*3=12个卷积核组成。
需要注意的是,参数的数量和计算时间与输出通道的数量成比例地变化。这是因为每个输出通道都链接到不同于其他通道的核。输入通道的数量也是如此。计算时间和参数数量成比例增长。
核大小
到目前为止,所有示例都给出了3 x 3大小的核。实际上,其大小的选择完全取决于您。可以创建核心大小为1 * 1或19 * 19的卷积层。
输入形状:(3,7,9)-输出形状:(2,3,9)-K:(5,2)-P:(0,0)-S:(1,1)-D:(1 ,1)— G:1
可以使用不同高度和宽度的核。在信号图像分析中通常是这种情况。如果知道要扫描信号或声音的图像,那么我们可能希望使用5 * 1大小的核。
最后,您会注意到所有大小均由奇数定义。定义均匀的核大小也是可以接受的,实际上,很少这样做。通常,选择奇数大小的核是因为在中心像素周围存在对称性。
由于卷积层的所有可训练参数都在核中,因此参数的数量随核的大小线性增长。计算时间也成比例地变化。
Strides
默认情况下,核从左到右,从下到上,从一个像素移动到另一个像素。但是这个动作也可以改变,通常用于对输出通道进行下采样。例如,当步长为(1,3)时,两个数分别代表了垂直滑动和水平滑动步长值。这将产生水平下采样3的输出通道。
输入形状:(3,9,9)-输出形状:(2,7,3)-K:(3,3)-P:(0,0)-S:(1,3)-D:(1 ,1)— G:1
Strides对参数的数量没有影响,但是计算时间在逻辑上随Strides线性减少。
Padding
Padding定义在卷积滤波之前添加到输入通道侧面的像素数量。通常,padding像素设置为零。
输入形状:(2,7,7)-输出形状:(1,7,7)-K:(3,3)-P:(1,1)-S:(1,1)-D:(1 ,1)— G:1
当您希望输出通道的大小与输入通道的大小相等时,这是非常有用的。简单来说,当核为3*3时,输出通道的大小每边少1。为了解决这个问题,我们可以使用padding 1。
因此,padding对参数的数量没有影响,但是会产生与padding的大小成比例的额外计算时间。但是通常来说,与输入通道的大小相比,padding通常足够小,可以认为对计算时间没有影响。
Dilation
默认值为1,对应的是卷积时输入通道上的核的每个像素之间的偏移量。
输入形状:(2,7,7)-输出形状:(1,1,5)-K:(3,3)-P:(1,1)-S:(1,1)-D:(4 ,2)— G:1
如果我们以(4,2)的Dilation为例,那么输入通道上核的感受野会在垂直方向上扩大了4 *(3 -1)= 8,水平方向是2 * (3–1)=4 (对于3乘3的核)。
就像padding一样,Dilation对参数的数量没有影响,对计算时间的影响非常有限。
Groups
在特定的情况下,Groups是非常有用的。例如,如果我们有几个连接的数据源,当没有相互依赖的时候,输入通道可以独立分组。最后,输出通道在最后连接起来。
如果有2个输入通道和4个输出通道,有2组。这就像把输入通道分成两组(每组一个输入通道),然后使其经过卷积层,而卷积层的输出通道数是原来的一半。然后将输出通道连接起来。
输入形状:(2,7,7)-输出形状:(4,5,5)-K:(3,3)-P:(2,2)-S:(2,2)-D:(1 ,1)— G:2
重要的是要注意两件事。首先,组的数量必须能整除输入通道数和输出通道数(公约数)。其次,每个组共享核。
对于Pytorch的计算时间,该算法针对组进行了优化,因此可以减少计算时间。但是,还应考虑必须用于组形成和连接输出通道的计算时间。
输出通道大小
在知道所有参数的情况下,可以根据输入通道的大小计算输出通道的大小。