![](https://tumytime.github.io/picx-images-hosting/image.7awxc3fekp.webp)
在卷积神经网络的卷积层中,不同的通道使用的卷积核参数是不一样的。每个通道都有自己对应的卷积核参数,这些参数用于在该通道上对输入数据进行滤波操作,提取特定的特征。
通道之间的卷积核参数是不共享的,即每个通道都有自己独特的卷积核参数。这种设计可以让神经网络更加灵活地学习不同通道之间的特征表示,从而提高网络的表征能力。
$1×1$卷积核作用
卷积层中的卷积核数量决定了输出的通道数,而每个卷积核的通道数取决于输入数据的通道数
卷积核数决定了输出通道数: 在卷积神经网络中,每个卷积层包含多个卷积核。每个卷积核在输入数据上进行卷积操作,生成一个对应的输出特征图(通道)。因此,卷积核的数量决定了输出特征图的通道数。如果一个卷积层有n个卷积核,那么输出将包含n个通道。
每个卷积核的通道数取决于输入的通道数: 当卷积核在输入数据上进行卷积操作时,每个卷积核会同时处理输入数据的所有通道。例如,如果输入数据是RGB图像,有3个通道(红色、绿色、蓝色),那么每个卷积核将同时在这3个通道上进行卷积操作。这样,每个卷积核的通道数就等于输入数据的通道数。因此,卷积核的通道数取决于输入数据的通道数。
增加网络深度(增加非线性映射次数)
首先直接从网络深度来理解,1x1 的卷积核虽小,但也是卷积核,加 1 层卷积,网络深度自然会增加。
1x1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很深。并且1x1卷积核的卷积过程相当于全连接的计算过程,通过加入非线性激活函数,可以增加网络的非线性,使得网络可以表达更复杂的特征。
feature map的含义
在每个卷积层,数据都是以三维形式存在的。你可以把它看成许多个二维图片叠在一起,其中每一个称为一个feature map。在输入层,如果是灰度图片,那就只有一个feature map;如果是彩色图片,一般就是3个feature map(红绿蓝)。层与层之间会有若干个卷积核(kernel),上一层和每个feature map跟每个卷积核做卷积,都会产生下一层的一个feature map。
feature map(下图红线标出) 即:该层卷积核的个数,有多少个卷积核,经过卷积就会产生多少个feature map,也就是下图中 豆腐皮儿
的层数、同时也是下图豆腐块
的深度(宽度)!!这个宽度可以手动指定,一般网络越深的地方这个值越大,因为随着网络的加深,feature map的长宽尺寸缩小,本卷积层的每个map提取的特征越具有代表性(精华部分),所以后一层卷积层需要增加feature map的数量,才能更充分的提取出前一层的特征,一般是成倍增加(不过具体论文会根据实验情况具体设置)!
在卷积神经网络中,每个卷积层都包含多个卷积核(也称为滤波器),每个卷积核生成一个特征图。当前一层输出的特征图与后一层卷积核进行卷积操作时,可以看作是在进行矩阵相乘操作。增加后一层的特征图数量实际上意味着增加了后一层卷积核的数量,这可以使网络在进行特征提取时拥有更多的“过滤器”,从而更全面地捕获输入数据中的不同特征和模式。
卷积特征的可视化,有助于我们更好地理解深度网络。卷积网络在学习过程中保持了图像的空间结构,也就是说最后一层的激活值(feature map)总和原始图像具有空间上的对应关系,具体对应的位置以及大小,可以用感受野来度量。利用这点性质可以做很多事情:
- 前向计算。我们直接可视化网络每层的 feature map,然后观察feature map 的数值变化. 一个训练成功的CNN 网络,其feature map 的值伴随网络深度的增加,会越来越稀疏。这可以理解网络取精去燥。
WHY越来越稀疏
在一个训练成功的CNN(Convolutional Neural Network)网络中,随着网络深度的增加,feature map 的值会越来越稀疏的现象可以通过以下方面进行详细解释:
特征稀疏性在深层网络中的原因:
- 激活函数的非线性作用:在卷积神经网络中,通常在每个卷积层之后都会使用非线性激活函数(如ReLU)。这种非线性激活会导致大部分神经元的输出接近于0,只有部分神经元会激活并输出非零值,从而导致 feature map 的稀疏性。
- 权重更新和特征选择:随着网络的训练,CNN 会根据损失函数进行权重更新,通过学习提取对分类任务有用的特征。在网络深度增加的过程中,网络会更加注重对关键特征的提取,而相对不重要的特征很可能被抑制,这也会导致 feature map 的稀疏性。
稀疏特征对网络性能的影响:
- 泛化能力提升:存储较少的激活值可以增加网络的泛化能力,减少过拟合的风险,因为网络更多地关注于对区分性重要的特征进行学习。
- 计算效率提高:稀疏的特征图在后续的层次中减少了计算量,因为对于很多值较小或接近于零的神经元,不必执行额外的乘法运算,从而提高了网络的计算效率。
深度增加导致特征复杂性:
- 随着网络深度的增加,特征图表示的特征也会变得越来越复杂和抽象,需要更少的激活来描述一个高级别的特征,这也间接导致 feature map 的稀疏性。
综上所述,随着网络深度的增加,一个训练成功的CNN 网络中的 feature map 的值会变得越来越稀疏,这主要是由于非线性激活函数的作用、权重更新和特征选择机制,以及深层网络中复杂特征的表示所导致的结果。这种稀疏性有助于提升网络的泛化能力、计算效率,并反映了网络对关键特征的学习和抽象能力。
激活一个神经元的过程
激活一个神经元的过程可以简单描述为以下几个步骤:
加权求和(Weighted Summation):神经元接收来自上一层或输入数据的输入信号,每个输入信号都会乘以对应的连接权重(weights),然后将所有加权输入信号求和,得到一个加权和。这个加权和可以表示为:$[ z = \sum_{i=1}^{n} (w_i \cdot x_i) + b ]$,其中 $(w_i)$ 是第 $(i)$ 个输入信号的权重,$(x_i)$ 是对应的输入值,$(b)$ 是神经元的偏置项(bias)。
激活函数(Activation Function):将上一步计算得到的加权和$(z)$输入到激活函数中,激活函数会对加权和进行非线性变换,从而输出神经元的激活值(activation value)。常见的激活函数包括ReLU、Sigmoid、Tanh等。激活函数将决定神经元是否被激活,以及激活级别如何。
输出值(Output):激活函数的输出值即为神经元的最终输出,也可以表示为神经元的激活值。这个输出值将会被传递到下一层神经元或作为最终输出。
总结起来,激活一个神经元的详细过程就是通过加权求和得到输入信号的加权和,然后经过激活函数进行非线性变换得到最终的输出值。这个过程在神经网络的每一层都会被重复执行,用于处理来自前一层神经元的信号并生成新的表示。
- 反向计算。根据网络最后一层最强的激活值,利用感受野求出原始输入图像的区域。可以观察输入图像的那些区域激活了网络,利用这个思路可以做一些物体定位。
1x1卷积核增加网络深度的原因
在卷积神经网络中,1x1卷积核通过在通道维度上进行卷积操作,可以起到增加网络深度的作用。这是因为1x1卷积核可以在不改变空间尺寸的情况下,增加通道数量,从而增加网络的深度,提供更多的非线性变换和表达能力。以下是1x1卷积核如何增加网络深度的原理:
通道维度的变换: 1x1卷积核的作用是在每个空间位置对输入数据的通道进行线性变换。通过对输入数据的每个通道分别进行加权求和,可以生成新的特征表示。这样,在1x1卷积层之后,输出将具有更多的通道数,因此网络的深度也会增加。
引入非线性变换: 尽管1x1卷积核是在通道维度上进行卷积操作,但其引入的非线性激活函数(如ReLU)会使输出具有更丰富的特征表示能力。这种非线性变换有助于增加网络的深度,使网络能够学习到更复杂的特征。
增加网络的表达能力: 通过1x1卷积核增加网络的深度,网络可以更好地捕获不同抽象级别的特征。每个1x1卷积层都可以看作是一个含有非线性激活函数的全连接层,因此可以提高网络的表达能力和学习能力。
WHY使用1x1卷积核
增加网络深度有什么好处?为什么非要用 1x1 来增加深度呢?其它的不可以吗?
其实,这涉及到感受野
(感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小)的问题,我们知道卷积核越大,它生成的 featuremap 上单个节点的感受野就越大,随着网络深度的增加,越靠后的 featuremap 上的节点感受野也越大。因此特征也越来越抽象。
但有的时候,我们想在不增加感受野的情况下,让网络加深,为的就是引入更多的非线性。
而 1x1 卷积核,恰巧可以办到。
我们知道,卷积后生成图片的尺寸受卷积核的大小和跨度影响,但如果卷积核是 1x1 ,跨度也是 1,那么生成后的图像大小就并没有变化。
但通常一个卷积过程包括一个激活函数,比如 Sigmoid 和 Relu。
所以,在输入不发生尺寸的变化下,却引入了更多的非线性,这将增强神经网络的表达能力
升维/降维
其实这里的升维、降维具体指的是通道数的变化,当我们确定了卷积核尺寸后,我们的height、width都不变,那么这里的维度具体指的就是channels。我们通过改变卷积核的数量来改变卷积后特征图的通道channels来实现升维、降维的效果。这样可以将原本的数据量进行增加或者减少
下面分别举两个例子就能明显看到效果
![](https://tumytime.github.io/picx-images-hosting/image.4ckn8pum0v.webp)
升维
![](https://tumytime.github.io/picx-images-hosting/image.3nrdop8yvr.webp)
降维
![](https://tumytime.github.io/picx-images-hosting/image.2ruw98zwjt.webp)
![](https://tumytime.github.io/picx-images-hosting/image.1e8d57p5wp.webp)
其实很明显的能看出来,无论是升维还是降维,我们都是通过改变卷积核的数量实现的,卷积后的特征图的通道数channels同卷积核的数量保持一致,这里其实不仅仅是1x1卷积核能实现这个功能,其他尺寸的卷积核也可以,那么我们为什么要选用1x1卷积核呢
使用1x1卷积核升维/降维的原因
当我们仅仅只是想要改变通道数的情况下,1x1卷积核是最小的选择,因为大于1x1的卷积核无疑会增加计算的参数量,内存也会随之增大,所以只想单纯的去提升或者降低特征图的通道,选用1x1卷积核最为合适, 1x1卷积核会使用更少的权重参数数量。
跨通道的信息交互
1x1卷积核只有一个参数,当它作用在多通道的feature map上时,相当于不同通道上的一个线性组合,实际上就是乘以一个系数再加起来,但是这样输出的feature map就是多个通道的整合信息了,能够使网络提取的特征更加丰富。
使用1x1卷积核,实现降维和升维的操作其实就是 channel 间信息的线性组合变化。
比如:在尺寸 3x3,64通道个数的卷积核后面添加一个尺寸1x1,28通道个数的卷积核,就变成了尺寸3x3,28尺寸的卷积核。 原来的64个通道就可以理解为跨通道线性组合变成了28通道,这就是通道间的信息交互。
注意:只是在通道维度上做线性组合,W和H上是共享权值的滑动窗口。
减少卷积核参数(简化模型)
下面仅以计算权重数为例子进行计算(不添加偏差bias)
一层卷积添加1x1卷积核,分别计算权重数
不使用1x1卷积核
使用1x1卷积核
可以看到不使用1x1的卷积核是使用卷积核的10倍左右
GoogLeNet的3a模块
- 不使用1x1卷积核 权重数:192 × (1×1×64) +192 × (3×3×128) + 192 × (5×5×32) = 387072
这个网络的说明如下
- 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
- 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
- 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
- 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。
- 使用1x1卷积核
权重数:192 × (1×1×64) +(192×1×1×96+ 96 × 3×3×128)+(192×1×1×16+16×5×5×32)= 157184
不使用1x1的卷积核是使用1x1卷积核的权重数2倍
ResNet
ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,参数数量进一步减少
![](https://tumytime.github.io/picx-images-hosting/image.8ojgga406k.webp)
其中右图又称为bottleneck design
,目的一目了然,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,
当我们的特征图通道数为256时,变得很大,出现的问题是计算复杂度会很高,这里做法是通过1×1卷积投影映射回64维,再做一个3×3通道数不变的卷积,然后再通过1×1卷积投影回去256维,因为输入是256维,输出要匹配上,这样设计之后复杂度就跟左图差不多了。
左图参数量:64 x ( 3 x 3 x 64)+64 x ( 3 x 3 x 64 ) = 73728
当通道数增加到 256时:256 x ( 3 x 3 x 256 ) + 256 x ( 3 x 3 x 256 ) = 1179648
右图参数量:256 x ( 1 x 1 x 64) + 64 x ( 3 x 3 x 64 ) + 256 x ( 1 x 1 x 64) = 69632
当通道数增加为256时,可以发现添加两层1x1的卷积的参数量和64为原有残差块参数量差不多。
对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的网络中,目的是减少计算和参数量(实用目的)