卷积⽹络是指那些⾄少在⽹络的⼀层中使⽤卷积运算来替代一般的矩阵乘法运算的神经⽹络。
图片分类、图片检索、图片分割、人脸识别、表情识别、图像生成、风格迁移、自动驾驶等
过程:
卷积操作是指:对不同的数据窗口数据⽤一组固定的权重逐个元素相乘再求和。
也可以⽤如下⽅式理解,如果想要低噪声估计,⼀种可⾏的⽅法是对得到的测量结果进行平均。可以认为时间上越近的测量结果越相关,所以采⽤⼀种加权平均的⽅法,对于最近的测量结果赋予更高的权重。
采⽤⼀个加权函数 w(a) 来实现,其中a表⽰测量结果距当前时刻的时间间隔:
s ( t ) = ∫ x ( a ) w ( t − a ) d a s(t) = \int x(a)w(t−a)da s(t)=∫x(a)w(t−a)da
这就是卷积操作,可以⽤星号表⽰: s ( t ) = ( x ∗ w ) ( t ) s(t) = (x∗w)(t) s(t)=(x∗w)(t)。
二维的情况:
S ( i , j ) = ( I ∗ K ) ( i , j ) = Σ m Σ n I ( m , n ) K ( i − m , j − n ) S ( i , j ) = ( I ∗ K ) ( i , j ) = Σ m Σ n I ( i − m , j − n ) K ( m , n ) S(i,j) = (I*K)(i,j)=\Sigma_m\Sigma_nI(m,n)K(i-m,j-n)\\ S(i,j) = (I*K)(i,j)=\Sigma_m\Sigma_nI(i-m,j-n)K(m,n) S(i,j)=(I∗K)(i,j)=ΣmΣnI(m,n)K(i−m,j−n)S(i,j)=(I∗K)(i,j)=ΣmΣnI(i−m,j−n)K(m,n)
==卷积是可交换的,原因是将核相对于输入进行了翻转。==核翻转的唯一目的是实现可交换性。
但我们通常在卷积层中会使⽤更加直观的 互相关 (Cross-correlation) 运算
(上图是进行了核翻转,下图没有进行翻转)
稀疏交互 与 参数共享
在卷积操作中,卷积核的每一个元素都作用在输入的每一位置上。所以,我们只需要学习⼀个参数集合,⽽不⽤对每⼀位置去学习⼀个单独的参数。
前馈⽹络中每⼀个输出单元与每⼀个输⼊单元都产⽣交互,如果有m 个输⼊和n 个输出,那么矩阵乘法需要m n 个参数并且相应算法的时间复杂度为 O ( m × n ) O(m\times n) O(m×n);卷积操作中如果我们限制每⼀个输出拥有的连接数为k,那么稀疏的连接⽅法只需要 k × n k\times n k×n个参数以及 O ( k × n ) O(k \times n) O(k×n)的运⾏时间。
平移等变
如果一个函数满足输入改变,输出也以同样的方式改变这一性质,
它是等变的
特别地,如果函数 f ( x ) f(x) f(x) 与 g ( x ) g(x) g(x) 满足 f ( g ( x ) ) = g ( f ( x ) ) f(g(x)) = g(f(x)) f(g(x))=g(f(x)),
我们就说 f ( x ) f(x) f(x) 对于变换 g g g 具有等变性。
对于卷积来说,如果令g 是输入的任意平移函数,那么卷积函数对于g 具有等变性
卷积神经⽹络具有平移不变性(Translation Invariance)或称平移等变。平移不变性意味着系统产⽣完全相同的响应(输出),不管它的输⼊是如何平移的。
卷积:图像经过平移,相应的特征图上的表达也是平移的。⽆论⽬标出现在图像中的哪个位置,它都会检测到同样的这些特征,输出同样的响应,所以卷积具有平移不变性。
一种聚集操作,在不同位置处对特征进⾏汇总统计降低开销。池化可以保留显著特征,降低特征规模。
池化函数是使⽤某⼀位置的相邻输出的总体统计特征来代替⽹络在该位置的输出
不管采⽤什么样的池化函数,当输⼊作出少量平移时,池化能够帮助输⼊的表⽰近似不变。
平移的不变性是指当我们对输⼊进⾏少量平移时,经过池化函数后的⼤多数输出并不会发⽣改变。局部平移不变性是⼀个很有⽤的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时。
一个无限强的先验需要对一些参数的概率置零并且完全禁止对这些参数赋值,
无论数据对于这些参数的值给出了多大的支持。
我们可以把卷积的使⽤当作是对⽹络中⼀层的参数引⼊了⼀个⽆限强的先验概率分布,要求该层学到的函数只能包含局部连接关系并且对平移具有等变性。
使用池化可以看作是增加了一个无限强的先验:这一层学得的函数必须具有对
少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。
洞察
通常指由多个并⾏卷积组成的运算,可以在每个位置提取多种类型的特征。
输⼊通常也不是实值的⽹格,⽽是由⼀系列向量的⽹格。形状应该是三维:行(宽度)、列(长度)、通道(高度,RGB)(批处理还要加上批处理索引,比如pytorch
中的输入是(batch_size, channel, width, height)
)。同理,卷积核数组的形状:第几行、第几列、输入通道,输出通道,四维。
因为卷积网络通常使用多通道的卷积,所以即使使用了核翻转,也不一定保证
网络的线性运算是可交换的。只有当其中的每个运算的输出和输入具有相同的通道数时,这些多通道的运算才是可交换的。
卷积核的每个通道与输⼊的对应通道进⾏运算。再将各个通道的结果相加得到输出。
假设输⼊图⽚的⼤⼩为 ( m ; n ) (m; n) (m;n),⽽卷积核的⼤⼩为 ( f ; f ) (f; f) (f;f),则卷积后的输出图⽚⼤⼩为 ( m − f + 1 ; n − f + 1 ) (m−f + 1; n−f + 1) (m−f+1;n−f+1),由此带来两个问题:
因此可以在进⾏卷积操作前,对原始图⽚在边界上进⾏填充(Padding),以增加矩阵的⼤⼩,通常将 0 0 0作为填充值。
设每个⽅向扩展像素点数量为p,则填充后原始图⽚的大小为 ( m + 2 p ; n + 2 p ) (m+ 2p; n + 2p) (m+2p;n+2p),卷积核大小保持 ( f ; f ) (f; f) (f;f) 不变,则输出图⽚大小 ( m + 2 p − f + 1 ; n + 2 p − f + 1 ) (m+ 2p−f + 1; n +2p−f + 1) (m+2p−f+1;n+2p−f+1)。常⽤填充的方法有:
有时需要通过设置步幅(Stride) 来压缩⼀部分信息。
步幅表⽰核在原始图⽚的⽔平⽅向和垂直⽅向上每次移动的距离。使⽤卷积步幅,跳过核中的⼀些位置(看作对输出的下采样) 来降低计算的开销。
通常我们设置在⽔平⽅向和垂直⽅向的步幅⼀样,如果步幅设为s,则输出尺⼨为 ( ⌊ m + 2 p − f s + 1 ⌋ ; ⌊ n + 2 p − f s + 1 ⌋ ) (⌊\frac{m+2p-f}{s} + 1⌋; ⌊\frac{n+2p-f}{s} + 1⌋) (⌊sm+2p−f+1⌋;⌊sn+2p−f+1⌋)。
非共享卷积(局部连接层)
想用一些局部连接的网络层。和具有一个小核的离散卷积运算很像,但并不横跨位置来共享参数。
平铺卷积
对卷积层和局部连接层进行了折衷。这里并不是对每一个空间位置的权重集合进行学习,我们学习一组核使得,在空间移动时它们可以循环利用。这意味着在近邻的位置上拥有不同的过滤器,就像局部连接层一样,但是对于这些参数的存储需求仅仅会增长常数倍,这个常数就是核的集合的大小,而不是整个输出的特征映射的大小。
卷积等效于使用傅立叶变换将输入与核都转换到频域、执行两个信号的逐点相乘,再使用傅立叶逆变换转换回时域。对于某些问题的规模,这种算法可能比离散卷积的朴素实现更快。
第⼀步,在Depthwise Convolution,输⼊有⼏个通道就设⼏个卷积核,对每个通道分配⼀个卷积核,这⾥的每个卷积核只处理⼀个通道(对⽐原始卷积过程每组卷积核处理所有通道);
第⼆步,在Pointwise Convolution,由于在上⼀步不同通道间没有联系,因此这⼀步⽤1x1 的卷积核组来获得不同通道间的联系。
更形式化的,我们假设:
此处1x1卷积层的存在是为了跨通道信息整合
我们需要的标准卷积核参数量为 K × K × c 1 × c 2 K×K×c1×c2 K×K×c1×c2。在深度可分离卷积中,第⼀步需要的参数量为 K × K × c 1 K×K×c1 K×K×c1,第⼆步需要的参数为 1 × 1 × c 1 × c 2 1×1×c1×c2 1×1×c1×c2,⼀共 K × K × c 1 + c 1 × c 2 K×K×c1+c1×c2 K×K×c1+c1×c2个参数。
我们将输⼊数组依据通道分组,每组需要的卷积核通道数减半就可以得到通道数减半的输出,拼接在⼀起同样得到相同大小的输出。
更形式化的,我们假设:
在分组卷积中,假设被分为 g g g组,则每⼀组输⼊的尺⼨为$ (H_{in,} W_{in}, c_1/g)$,对应该组需要的卷积核组的尺⼨为 ( K , K , c 1 / g , c 2 / g ) (K, K, c_1/g, c_2/g) (K,K,c1/g,c2/g),输出尺⼨为 ( H o u t , W o u t , c 2 / g ) (H_{out}, W_{out}, c_2/g) (Hout,Wout,c2/g)。最后,将 g 组的结果拼接在⼀起,最终得到 ( H o u t , W o u t , c 2 ) (H_{out}, W_{out}, c_2) (Hout,Wout,c2) ⼤⼩的输出。在这 个过程中,分组卷积需要的卷积核参数量为 K × K × ( c 1 / g ) × ( c 2 / g ) × g K × K × (c_1/g) × (c_2/g) × g K×K×(c1/g)×(c2/g)×g。是标准卷积的 1 g \frac{1}{g} g1
也称空洞卷积,它引⼊的参数被称为扩张率,其定义了核内值之间的间距。这种⽅法能以相同的计算成本,提供更⼤的感受野。在需要更⼤的观察范围,且⽆法承受多个卷积或更⼤的内核,可以⽤它。
如果输⼊图⽚的⼤⼩为 ( m ; n ) (m; n) (m;n),⽽卷积核的⼤⼩为 ( f ; f ) (f;f) (f;f),每个⽅向扩展像素点数量为 p p p,步幅设为 s s s,则标准卷积输出尺⼨为 ( ⌊ m + 2 p − f s + 1 ⌋ ; ⌊ n + 2 p − f s + 1 ⌋ ) (⌊\frac{m+2p-f}{s} + 1⌋; ⌊\frac{n+2p-f}{s} + 1⌋) (⌊sm+2p−f+1⌋;⌊sn+2p−f+1⌋)。如果扩张率为 r r r,则扩张卷积输出尺⼨ ( ⌊ m + 2 p − [ f + ( f − 1 ) ( r − 1 ) ] s + 1 ⌋ ; ⌊ n + 2 p − [ f + ( f − 1 ) ( r − 1 ) ] s + 1 ⌋ ) (⌊\frac{m+2p-[f+(f-1)(r-1)]}{s} + 1⌋; ⌊\frac{n+2p-[f+(f-1)(r-1)]}{s} + 1⌋) (⌊sm+2p−[f+(f−1)(r−1)]+1⌋;⌊sn+2p−[f+(f−1)(r−1)]+1⌋)
卷积层块和全连接层块两个部分。
卷积层块的输出形状为(批量⼤⼩, 通道, ⾼, 宽)。当卷积层块的输出传⼊全连接层块时,全连接层块会将⼩批量中每个样本变平(Flatten)。即将全连接层的输⼊形状将变成⼆维,其中第⼀维是⼩批量中的样本,第⼆维是每个样本变平后的向量表⽰,且向量长度为通道、⾼和宽的乘积。网络结构如图所⽰:
LeNet ⽹络在池化层之后再进⾏⾮线性处理(即sigmoid激活函数),现在通⽤的操作是经过卷积之后就经过⾮线性处理(sigmoid 激活函数),然后再进⾏池化操作。
该模型有5层卷积,去掉任意一层都会使结果不好,所以这个网络的深度似乎是很重要的
Relu:解决了梯度消失问题、计算快、收敛速度快
DropOut(随机失活):训练时随机关闭部分神经元,测试时整合所有神经元
数据增强:平移、反转、对称;改变RGB通道强度
LRN层:对当前层的输出结果做平滑处理
改参数
更深的网络,先将前半部分训练好固定,再训练后半部分
除了最后分类的,没有FC层
多卷积核增加特征多样性,深度上串联,padding技术
解决: 1*1卷积核进行降维
小卷积核代替大卷积核:降低参数量、增加非线性激活函数
残差学习网络
152层,不会存在梯度消失问题
去掉相同的主体部分,从而突出微小的变化