卷积神经网络(Convolution Neural Network)是深度学习领域中的一种特征提取工具。相较于传统的全连接神经网络(Fully-Connected Neural Network),卷积神经网络具有局部连接(local connectivity) 和 参数共享(parameter sharing)的优势,在减少了参数的情况下提高了特征提取的能力,因此被广泛使用。本文从PyTorch官方文档中关于torch.nn.conv2d的内容出发来解释多通道卷积的概念.
多通道卷积计算过程展开
以下内容是PyTorch文档中关于torch.nn.conv2d 的描述
Applies a 2D convolution over an input signal composed of several input planes.
In the simplest case, the output value of the layer with input size (?,?in,?,?)and output (?,?out,?out,?out)can be precisely described as :
where ⋆ is the valid 2D cross-correlation operator, N is a batch size, C denotes a number of channels, H is a height of input planes in pixels, and W is width in pixels.
由于深度学习的库为了尽可能的发挥GPU加速计算的功能,都是通过批量计算卷积来提高计算效率,因此输出和输出的第一个维度是相同的,都是?。接下来,我们将问题简化,仅仅关注某一个对于输入张量的卷积计算。下文中我们将输入张量中的某个通道成为输入通道(input channel),将输出向量中的某个通道成为输出通道(output channel)。???(Ni,?out)是第?个输出张量中某个输出通道的结果。从公式中的求和操作
以看出,对于每一个输出通道的结果,需要对每个输入通道内的内容进行卷积计算,因此对于每个输出通道,其与输入通道是一对多的关系。
接下来我们看公式中的weight(?outj,?)⋆input(Ni,?)部分 ,这部分进行的是某个输入通道与某个卷积核的卷积操作。PyTorch文档中指明所执行的操作其实计算的是卷积核(kernal)与输入张量的互相关(cross correlation)。互相关⋆与卷积的区别是计算卷积之前需要将卷积核旋转180度之后再计算。通过将卷积计算简化为互相关的计算,可以减少计算过程中不必要的操作以及开销。 由于在梯度后向传播的过程中卷积的参数是可更新的,在此情况下,对于提取特征来说,卷积操作和互相关是等价的,在TensorFlow 中,卷积计算部分也被简化为计算互相关,在其他开源库中也采用了类似的处理方式。接下来我们以对图像的卷积计算来解释对于某个输出通道如何计算其结果,下图是对一个3×3的图片使用3×3的卷积核进行计算的展开图,输出通道的数量为3:
(?进入小程序 动手训模型)
从上图可以看出,对于输入通道数为3的张量,当有3个3×3×3卷积核时,输出了3个不同的特征图。读者需要注意的是,卷积核的维度是由是由输入张量的通道数决定的,如果卷积核的大小为?,则卷积核的维度为?×?×?in,而这正是该卷积层对于某个输出通道需要学习的参数数量。整个卷积层关于卷积核的参数量为?out×?in×?×?,偏置对应的参数量为?out。
对于上图,我们在PyTorch中构建一个相同功能的卷积层,其参数量的大小如下图所示:
多通道卷积输出维度
通过以上部分内容,我们了解了卷积核展开后的计算过程以及各层的参数量,接下来我们来看输出张量的维度计算。对于(?,?in,Hin,Win)的输入,其输出维度为(?,?out,Hout,Wout),其中Hout,Wout由以下公式确定:
从以上公式可以看出,输出张量的维度由输入向量的维度,padding的大小,膨胀系数的大小,卷积核的大小,步长共同决定。
以VGG16 为例计算网络的参数量
接下来我们针对上图中红色矩形框中的内容来计算网络的参数量:
红框内部的网络结构中,有13个卷积层和3个全连接层是有参数的,总共是16个带参数的层。所有的的参数加起来大约有138M,而其中第一个全连接层的参数量就有100M,由此可以看出卷积层相对于全连接层能节省很多的参数。