先说答案:
当卷积层的卷积核尺寸等于输入特征图的尺寸( K w , K h = l w i n , l h i n K_w,K_h = l_w^{in}, l_h^{in} Kw,Kh=lwin,lhin),卷积核的输出通道数就等价于全连接的输出神经元个数,此时的卷积层等价于全连接层。
说明:
假定输入特征图大小和通道数目分别是( l h i n l_h^{in} lhin, l w i n l_w^{in} lwin), C i n C_{in} Cin;输出特征图大小和通道数目分别为( l h o u t l_h^{out} lhout, l w o u t l_w^{out} lwout), C o u t C_{out} Cout.
卷积层参数是:卷积核大小( K h K_h Kh, K w K_w Kw), 输入通道 C i n C_{in} Cin, 输出通道 C o u t C_{out} Cout
若( K h K_h Kh, K w K_w Kw) == ( l h i n l_h^{in} lhin, l w i n l_w^{in} lwin),输出就刚好是( l h o u t l_h^{out} lhout, l w o u t l_w^{out} lwout) =(1,1), C o u t C_{out} Cout,等价于一个长度为 C o u t C_{out} Cout的向量。此时等价的全连接,输入是 l h ⋅ l w ⋅ C i n l_h\cdot l_w \cdot C_{in} lh⋅lw⋅Cin,输出是 C o u t C_{out} Cout。
思考二者的计算过程:
先考虑输入特征图中,一个通道的二维特征图。由于卷积核大小和原图相同,刚好对应位置相乘再相加,可以等价于把原图拉成一个一维向量,把卷积核也拉成一个一维向量,二者做点积(对应位置相乘累加),得到一个数值。对比全连接,相当于输出神经元只有1的时候,输入拉直为一个向量,参数就是等长的一个向量,二者做点积,得到一个数值输出。
再考虑输入是多通道的二维特征图,假定输出通道数为1。由于卷积核大小和原图相同,输出通道数为1,那么卷积核参数可以拉平,数量跟输入的特征图一样多,都是 l h ⋅ l w ⋅ C i n l_h\cdot l_w\cdot C_{in} lh⋅lw⋅Cin,卷积层变成了卷积核里面的每个参数喝输入特征图的每个参数相乘最后累加。类似地,可以等价于把输入特征图( l h ⋅ l w ⋅ C i n l_h\cdot l_w\cdot C_{in} lh⋅lw⋅Cin)拉成一维向量,把卷积核( l h ⋅ l w ⋅ C i n l_h\cdot l_w\cdot C_{in} lh⋅lw⋅Cin)也拉成一维向量,二者做内积。等价于全连接层地输入数据量是( l h ⋅ l w ⋅ C i n l_h\cdot l_w\cdot C_{in} lh⋅lw⋅Cin),输出数据量是1。
见下面图中的两个例子,图丑,将就一下:
上下分别对应前面讲的两种简单情况。输入特征图是 3 × 3 3\times 3 3×3尺寸(每个位置分别是abcdefghi九个数),两个例子对应的输入通道数目分别是1和2;卷积层卷积核的尺寸也是 3 × 3 3\times 3 3×3,对应于输入通道数目,一个卷积核的数据量分别是 1 × 3 × 3 1\times 3\times 3 1×3×3和 2 × 3 × 3 2\times 3\times 3 2×3×3,输出都是1通道,所以只有一个卷积核。全连接层在这里,就相当于把输入特征图拉直成了一维向量,把卷积核拉直了也成了一维向量,二者内积算出来就是最终结果。卷积和全连接化出来的实际计算一摸一样。
同理,最后考虑输入是多通道的二维特征图,假定输出通道数为 C o u t C_{out} Cout。等价于全连接层输出神经元个数从上面的1变成了 C o u t C_{out} Cout
下面是例子,图丑+1,再将就一下。
该例子中,输入特征图是 3 × 3 3\times 3 3×3尺寸(每个位置分别是abcdefghi九个数),2通道;卷积层卷积核的尺寸也是 3 × 3 3\times 3 3×3,因为输入通道是2,所以一个卷积核的数据量是 2 × 3 × 3 2\times 3\times 3 2×3×3,输出是2通道,所以有2个卷积核。右上角的括号里面的1,2表示第几个卷积核。全连接层在这里,就相当于把输入特征图拉直成了一维向量,把每一个卷积核拉直了成了一维向量,2个卷积核排在一起就是一个矩阵。卷积和全连接化出来的实际计算一摸一样。
下面通过二者的参数量和计算量对比,验证一下二者等价:
思考二者的参数数量区别:
对于卷积层,参数数量等于
K h ⋅ K w ⋅ C i n ⋅ C o u t K_h\cdot K_w\cdot C_{in} \cdot C_{out} Kh⋅Kw⋅Cin⋅Cout
= l h ⋅ l w ⋅ C i n ⋅ C o u t =l_h \cdot l_w \cdot C_{in} \cdot C_{out} =lh⋅lw⋅Cin⋅Cout
对于全连接层,参数数量等于
输 入 数 量 ∗ 输 出 数 量 输入数量*输出数量 输入数量∗输出数量
= ( l h ⋅ l w ⋅ C i n ) ⋅ C o u t =(l_h\cdot l_w \cdot C_{in})\cdot C_{out} =(lh⋅lw⋅Cin)⋅Cout
二者相同
思考二者的计算量(乘法的计算次数)的区别:
对于卷积层,计算量等于
K h ⋅ K w ⋅ C i n ⋅ l h o u t ⋅ l w o u t ⋅ C o u t K_h \cdot K_w \cdot C_{in} \cdot l_h^{out} \cdot l_w^{out} \cdot C_{out} Kh⋅Kw⋅Cin⋅lhout⋅lwout⋅Cout
= l h ⋅ l w ⋅ C i n ⋅ C o u t =l_h\cdot l_w \cdot C_{in}\cdot C_{out} =lh⋅lw⋅Cin⋅Cout
对于全连接层,计算量等于
l h ⋅ l w ⋅ C i n ⋅ C o u t l_h\cdot l_w \cdot C_{in}\cdot C_{out} lh⋅lw⋅Cin⋅Cout
二者相同
补充:
当我问什么情况下卷积可以完全替代全连接层时,我的同学会告诉我说 1 × 1 1\times 1 1×1的卷积层,让我看FCN论文。我没看论文,但是看了这篇论文把最后三层全连接分别用 7 × 7 , 1 × 1 , 1 × 1 7\times 7,1\times 1,1\times 1 7×7,1×1,1×1的卷积层替代了,我就问他为什么 7 × 7 7\times 7 7×7的卷积层也可以替代全连接?是因为这层的输入特征图尺寸是 7 × 7 7\times 7 7×7。
所以其实是,当卷积层的卷积核尺寸大小核输入特征的尺寸大小完全一样时,才会完全替代全连接。此时的卷积层输出通道数,等于全连接的输出神经元个数。在这个等价过程中,参数量和计算量并没有发生改变,唯一的区别是用卷积层计算的时候保留结构信息计算的,而用全连接是把数据拉成一维或者矩阵计算的,计算结果也是完全相同的。倘若计算机并没有说算卷积比算矩阵乘法更快,这种替代没有什么根本上的意义(如果保留的中间结构信息你没有在其他地方使用的话)。