本节主要介绍卷积神经网络
目录
概述
卷积神经网络中的层
卷积神经网络结构介绍
- 层的模式
概述
卷积神经网络非常相似于之前的一般神经网络。它们都由含有可学习的参数(权重和偏置)的神经元组成。每一个神经元接受一些输入,执行点乘并在之后跟随这一个非线性函数。整个神经网络依然表达着一个可微分的得分函数:从一端的原生像素映射到另一端的类别得分。它们依然最终有一个全连接层形式的损失函数并且在学习常规神经网络的所有的技巧和方法,在卷积神经网络同样适用。
在CIFAR-10中,图像由32*32*3个像素组成,因此一个全连接层仅仅有32**32*3=3072个权重。这似乎还可以接受。然而一副更大的图像例如200*200*3的图像,其神经元权重200**200*3=120000由此可以看出,增加的很快。因此,这种全连接方式极为浪费资源且这样大数量的参数会很快导致过拟合。卡通图如下
卷积神经网络利用输入是图像的优点,并且以一种更加合理的方式限制结构。不像一般神经网络,卷积神经网络的一个层有三个维度:宽,高,深度。一个层中的神经元仅仅和部分当前层前的输入相连,而不像全卷积的方式。
卷积神经网络中的层
一个简单的卷积神经网络是由一系列的层组成,并且每一个层都将一个激活函数块转换成另一个可谓分的函数。我们使用三种层类型来组建神经网络:卷积层,池化层和全连接层。我们通过堆叠这三种层来组建一个新的卷积结构。
卷积层
卷积层由一系列含有可学习参数的滤波器组成。每一个滤波器在空间上都仅仅有着很小的尺寸,然而却有着和输入块同样的深度。例如一个卷积层的滤波器的size为5*5*3(5表示宽和高,3表示输入块的深度,因为是通道为3的图像)。在前向传播的过程中,我们沿着输入块的长和宽滑动每一个滤波器,并计算滤波器和图像被掩部分的点积,图示如下:
当我们将滤波器沿着输入的长和宽滑动时候,我们计算的点积输出将组成一个二维的激活映射图,图上每一个点对应着滤波器划过的每一个位置的回应。 直觉上,我们认为神经网络将使得滤波器学习,即当一些视觉特征例如角的边缘或者最初层的一些颜色斑点,最终整个模式健在更高的神经网络层得到。现在假设我们在每一层都有一套完整的卷积滤波器(例如12个),并且它们每一个都产生一个独立地二维激活图。我们将这些激活图沿着深度的维度堆叠并且产生最终的输出。
局部连接性:
当处理高维度的输入,例如图像,我们不可能将当前神经元连接到之前层的所有神经元。取而代之的是,我们将每一个神经元连接到输入快的局部区域。这种连接性的空间范围是一个被称为感受野的超参数,其值等于当前神经元滤波器的大小。这种连接性沿着深度轴的范围总是等于输入快的深度,即连接在局部空间(沿着宽和高)是局部的,但是沿着输入块深度方向是完整的。例如,假设输入块的大小为(32,32,3),即RGB中CIFAR-10图像。如果感受野,即滤波器的大小为5*5,则每一个卷积层神经元在输入块的(5, 5, 3)区域有权重,权重大小为5*5*3,(还有一个偏置参数)。注意,沿着深度轴的连接性的范围必须是三,因为这是输入块的深度。
下图
左边图:左边图的输入块为红色部分,其尺寸为32*32*3(例如cifar-10图像),且蓝色的部分表示,第一个卷积层的神经元块。每一个卷积层的神经元仅仅连接在空间上输入块的局部区域,但是在深度上与输入块相同。左边图:神经元的计算依然和神经网络相同。神经元依然计算自身权重与输入的点积,并后跟非线性函数,然而神经元的连接性如今在空间上限制于局部区域。
空间排布:我们已经解释了卷积层的每个神经元对于输入块的连接性,但是我们依然没有讨论过输出有多少神经元以及它们如何进行排布。有三个参数控制着输出块的大小:深度,步长,零填充。
深度:首先,输出快的深度是一个超参数,它对应着滤波器的个数。每一个滤波器都去学习观察输入中不同的事物。沿着深度维度的不同神经元在出现不同角度的边缘或者颜色斑点时候可能会被激活。
步长:我们必须确定我们使用滤波器滑动的步长。当我们使用步长为1时,我们将滤波器每次移动一个像素。当步长为2收,滤波器每次移动两个像素(3或者更高的步长并不常用)。这将在空间上产生更小的输出块。
零填充:正如下图所示,有时在输入边界周围填充零会使得卷积更加方便。零填充的大小是一个超参数。0填充的好处是它使得我们能控制输出块的空间大小(最长见的强康市我们将使用它来使得输入和输出长宽相同)。
对于不同参数,输入输出参数关系如下:
W1*H1*D1表示滤波器的输入的大小,K表示滤波器的个数,F表示滤波器的尺寸,S表示步长,P表示零填充的数量。
W2*H2*D2表示输出的大小。例如,一个5*5*3的输入快,F=3,W=5,s=1,p=1,则输出尺寸(5-3+2)/1+1=5,如果神经元步长为2,输出尺寸(5-3+2*2)/2+1=3
零填充的使用说明
在上例中,步长为1时候,输入维度是5且输出维度是5。如果没有零填充,输出块的空间维度为3。通过零填充可以保证输入和输出空间大小相同。以这种方式使用零填充是非常常见的。
步长限制
空间排布的参数之间互相有着限制。例如,设置W=10,零填充,滤波器大小F=3,这步长就不可能为2,因为(W-F+2P)/S+1=4.5。这意味着神经元在整个输入上并不整齐地对应。因此这种设置将会变得无效,卷积库可能会抛出异常,你要么使用领填充要么裁剪输入或者其他办法使得输入与神经元互相适应。
参数共享
参数共享方法是用于控制卷及神经网络中的参数的个数。例如 Krizhevsky et al.提出的结构,输入图像大小[227*227*3],第一层神经元感受野大小F=11,步长S=4,没有零填充。则输出大小(227-11)/4 +1 =55因为卷积层深度K=96,则卷积层输出为[55*55*96]。输出大小表示着第一层神经元的多少,每一个神经元连接着一块大小为[11*11*3]的输入块。并且,在深度方向上的96个神经元连接着相同的[11*11*3]的区域,但是却有着不同的权重。我们可以看到,第一层卷积层有着55*55*96=290400个神经元,每一个神经元有着11*11*3=363个权重参数和一个偏置。则第一层总共的参数量为290400*364=105705600个。这样的数字太高了。
我们可以通过合理地假设大大减少参数量:如果一个特征在空间位置(x, y)出计算是有用的,那么它在其他位置计算也应该是有用的。即将深度切片,上例中得到96个深度切片,每个切片大小[55*55]。我们将对每一个切片使用相同的权重和偏置。使用这种参数共享的办法,第一层卷积层将仅仅拥有96个权重集合,每一个集合对应着一个深度上的切片,总共96*11*11*3=34848个独一无二而的权重,加上96个偏置,参数量总共34944。
一般情况下的设置为F=3,S=1,P=1。更多 ConvNet architectures
卷积如何进行梯度更新?
待续参见https://www.jefkine.com/general/2016/09/05/backpropagation-in-convolutional-neural-networks/
不同的卷积
1*1卷积:参见 Network in Network,1*1的卷积可用于多维降维并保持特征图的尺寸不变。例如输入为32*32*96,经过一个1*1*96的滤波器,输出为32*32*1。更多解释
更多关于扩张卷积、转置卷积参见https://github.com/vdumoulin/conv_arithmetic
池化层
在卷及神经网络中,常见的做法是在连续的卷积层之间插入池化层。它的作用是逐步减少特诊图的空间尺寸,进而减少参数数量以及网络的计算量,进而控制过拟合。池化层对输入的每一个深度切片进行独立操作,一般使用最大化池化操作,改变它们的尺寸。图示如下
最常用的池化层,使用大小为2*2的滤波器,并令步长为2,深度依然和普通卷积一样,与输入深度保持一致,在每一个输入深度切片上进行向下采样(缩小图像),一般丢弃75%的激活。注意,对于池化层,一般不使用zero-padding
丢弃池化层,许多人并不喜欢用池化操作,认为我们可以丢弃它。例如Striving for Simplicity: The All Convolutional Net建议仅仅使用卷积层。为了减少特征图的尺寸,论文建议偶尔使用更大的步长。生成模型中,人们发现丢弃池化层是一家你很重要的事情,例如variational autoencoders (VAEs) or generative adversarial networks (GANs)。未来的结构中,池化层似乎被用的越来越少。
全连接层
全连接层的神经元与前一层的激活函数以全连接的方式互相连接,正如在常规神经网络中的那样。参见神经网络节。关于全连接层如何处理多维输入。
参见
https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/content/fc_layer.html和https://stackoverflow.com/questions/43237124/role-of-flatten-in-keras
全连接层和卷积层之间可以互相转换。其中,将卷积层转换为全连接层在实际中非常有用。举例AlexNet,卷积结构接受224**224*3的图像,并且用一系列卷积层和池化层之后缩小图像为7*7*512的激活块。在这层之后,AlexNet使用两个大小为4096的全连接层,再在最后一层使用1000个神经元的全连接层用于计算类得分。我们可以将这三个全连接层都转化为卷积层:
- 将将第一个全连接层看做[7*7*512]的块和经过一个滤波器大小F=7,P = 0, S = 1, K = 4096的卷积层,输出块为[1*1*4096]。
- 将第二个全连接层看作是经过一个滤波器大小F=1,P = 0, S = 1, K = 4096的卷积层,得到输出为[1*1*4096]
- 与上两步相似,只是K=1000
卷积神经网络
最常见的卷及神经网络结构仅仅由CONV,POOL,Max pool和FC,Relu组成。
层的模式图如下
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
其中*表示重复,POOL?表示这是一个可选层。另外,一般情况下
N>=0且N<=3,M>=0,k>=0且K<3。
例如
INPUT -> FC
, implements a linear classifier. HereN = M = K = 0
.INPUT -> CONV -> RELU -> FC
INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU -> FC
. Here we see that there is a single CONV layer between every POOL layer.INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC
Here we see two CONV layers stacked before every POOL layer. This is generally a good idea for larger and deeper networks, because multiple stacked CONV layers can develop more complex features of the input volume before the destructive pooling operation.
选用更小的卷积滤波器而非更大的
假如你堆积三个3*3的带有激活函数层的卷积层。在这种情况下,在第一层每一个神经元对于输入块有一个3*3的感受野。在第二层的每一个神经元对于第一层的输出有一个3*3的感受野,然而相对于输入快的感受野则是5*5。相似情况,第三层的每一个神经元对于第二层的输出快有3*3的感受野,对于第一层的输出快有5*5的感受野,对于输入块有7*7的感受野。假如我们不使用三个3*3的卷积层而是直接对输入块用一个单独的7*7的卷积层,则这两种方法达到的效果一样。但是仅仅使用7*7的感受野并不好。首先,神经元在输入上计算一个非线性函数,但是堆叠三个包含非线性化卷积层加深了网络层,使得特征更加具有表现力。其次,假设所有层的输入块都有C个通道(则所有层的滤波器的个数以及深度必须为C,保证下一层的输入有C个通道),则使用单独的7*7卷积层将包含个参数,但是使用三个3*3卷积层将仅仅包含
。直观上,使用小型滤波器堆叠卷积层比使用大型的滤波器更加具有表现力,且需要的参数更少。然而,在实践中,当我们打算反向传播的时候,我们可能需要更多的内存来保存中间卷积层的结果。
最新进展
应该注意的是,线性层列的卷积模式最近由所突破。在Google的Inception结构和当今最好的Microsoft 亚洲的Residual Network。这两个都具有更加复杂和不同的连接结构。
实际操作:使用在ImageNet效果表现最好的模型
如果你对于如何设计网络结构感到困惑,大可不必为此烦恼。大约90%的应用不需要为此担心。在此,衷心的劝告是不要逞英雄。不要使用自己设计的结构去解决问题,你应该多看看在ImageNet上表现最好的结构,下载预训练模型,并基于你自己的数据集,将其微调。更多参考Deep Learning school
层的大小模式
我们将首先说明用于确定体系结构大小的通用经验法则,然后遵循规则并讨论该表示法:
- 输入层的大小,即图像大小,应该可以整除2。一般的数字包括32(CIFAR-10),64,96(STL-10)或者224(一般ImageNet ConvNets),384,和512。
- 卷积层应该使用较小的滤波器,例如3*3最多5*5,使用的步长S=1,并且关键的是使用zero-padding方法来使得卷积层不用调整改变输入的空间维度。即输入和输出大小相同。一般情况下,F=3并使用P=1,当F=5,则使用P=2。
- 池化层控制着输入空间维度的降采样。最常见的设置是使用2*2的感受野,进行最大池化操作,步长通常选择2。这种操作舍弃了大约75%的输入。但是池化层由于有损过大而备受争议,因此,通常不要使用大小为3*3或者更大。
为什么卷积层使用stride1?
在实际中,更小的步长效果更好。正如前文提到,步长为1可以让我们将所有的降采样工作留给池化层,卷积层仅仅改变输入快的深度。
为什么使用padding?
除了上述在卷积之后保持空间大小连续的好处之外,这样做实际上也提升了效果。如果卷积层没有零填充输入,并且仅仅执行有效卷积,则之后的块在每一次卷积之后都会减少一小块,且边缘的信息将会迅速丢失。
基于内存限制的折中
在上面的案例中,尤其早起的卷及神经网络结构中,内存量很快就被建立起来。例如,224*224*3的图像使用3层3*3的含有64个滤波器的卷积层并且padding为1将会产生三个大小为224*224*64的激活块。这个数量将导致大约1千万的激活或者说大约72MB的内存(这仅仅是单幅图像,同时对于激活和梯度)。由于GPUs受内存限制,我们有时必须要折中处理。实际中,人们更喜欢在第一个卷积层折中处理。例如,其中一个这种办法是在第一个卷积层使用步长为2,滤波器大小为7*7的卷积层。
翻译http://cs231n.github.io/convolutional-networks/