卷积神经网络与普通的神经网络十分相似:他们都由神经元构成,这些神经元拥有可学习的权重和偏差。每一个神经元接收一些输入,执行点积运算并以非线性可选择地跟随它。整个网络仍然表征一个单个可微分的分数函数:从一端的单个图片像素到另一端的类别分数。他们在最后一个(全连接)层上仍然有一个损失函数(例如SVM或Softmax),并且我们为学习常规神经网络而设计的所有提示和技巧仍然适用。
那么什么改变了? CNN结构明确假设输入是图像,这允许我们将某些属性编码到架构中。这将使得前向函数更加有效地实现,并且大大减少网络中的参数数量。
1 架构简介
回顾:常规神经网络。正如我们前一个章节看到的,神经网络接收一个输入(一个矢量),并通过一系列的隐藏层将它进行转化。每一个隐藏层都由一组神经元构成,其中每一个神经元都与前一个层的神经元完全连接,而层内的神经元则完全独立,不共享任何的连接。最后的全连接层被称为“输出层”,并且在分类设置中它代表了类别分数。
常规神经网络不能很好地缩放到完整的图像。在CIFAR-10中,图片只有32*32*3大小(宽32,高32,3个颜色通道),所以在常规神经网络的第一个隐藏层中,一个全连接的神经元将会拥有32*32*3=3072个权重。这个数目看起来仍然能够管理,但显然这种全连接的结构不能够缩放到更大的图片。例如,一个200*200*3的图片,将会导致神经元拥有200*200*3=120,000个权重。此外,我们将会有许多个这样的神经元,所以参数数量会急剧上升!显然,这种完全的连接是浪费的,并且巨大的参数数量将会立刻导致过度拟合。
神经元的3D量。卷积神经网络利用了输入由图像组成的事实,并且其通过更有效的方式对架构进行了约束。特别地,不同于常规神经网络,CNN的层具有以三维排列的神经元:宽度,高度和深度。(注意,这里的深度指的是激活量的第三维,而不是指完整神经网络的深度,即网络中的层的总数。)例如,CIFAR-10中的输入图像是一个激活的输入量,并且该量尺寸是32*32*3(宽度,高度和深度)。我们马上就会知道,层中的神经元只会被连接到前一个层的一小块区域,而不是以完全连接的方式连接到所有的神经元。此外,对于CIFAR-10最后的输出层尺寸是1*1*10,因为在CNN结构的最后,我们将把整个图像缩减为一个类别分数的单一向量,该向量是沿着深度维度排列的。这里是一个图示:
左图:一个3层的神经网络。右图:一个神经元以三维排列的卷积神经网络(宽度,高度和深度),如其中一个层展示的那样。CNN的每一个层将3D的输入量转化成3D的输出量。在这个例子中,红色的输入层代表了图片,所以它的宽和高将会是图片的尺寸,并且深度将会是3(红色,绿色和蓝色通道)。
CNN是由许多层构成的。每个层都有一个简单的API:它利用一些可能具有参数的可微函数,将3D的输入量转化为3D的输出量。
2 CNN的层
如上所述,简单的CNN是一系列层,并且CNN的每一个层都通过一个可微函数将一个量转化为另一个量。我们用三个主要类型的层去构建CNN结构:卷积层(Convolutional Layer),池化层(Pooling Layer),全连接层(Fully-Connected Layer)。我们将会堆叠这些层去构建一个完整的CNN结构。
示例结构:简介。下面我们将会涉及到更多的细节,但是一个用于CIFAR-10分类的简单CNN将会有这样的结构:INPUT-CONV-RELU-POOL-FC,细节如下:
- INPUT[32*32*3]将保存图像的原始像素值,在这种情况下是一个宽度32,高度32,以及具有三个颜色通道R,G,B的图像。
- CONV层将计算连接到输入局部区域中的神经元的输出,每一个都计算它们的权重和它们在输入量中连接到的小区域之间的点积。如果我们决定使用12个滤波器,这可能会产生一个[32*32*12]的量。
- RELU层将应用一个元素激活函数,例如阈值是零点的max(0,x)。这将不改变量的尺寸[32*32*12]。
- POOL层将会沿着空间维度(宽度,高度)执行一个向下采样操作,从而产生诸如[16*16*2]的量。
- FC层将计算类别分数,产生一个[1*1*10]的量,其中10个数字中每个对应一个类别分数,例如CIFAR-10中的10个类别。顾名思义,和普通的神经网络一样,该层的每一个神经元都将连接到前一个量中的所有数字。
用这种方式,CNN就一层一层地将原始的图像,从原始的像素值转化成了类别分数。注意一些层包含参数而另一些不包含。特别的,CONV/FC层所执行的转化,不仅仅是激活的输入量的函数,也是参数的函数(神经元的权重和偏差)。而另一方面,RELU/POOL层会实现一个固定的函数。CONV/FC层中的参数将使用梯度下降进行训练,以使得对于每一个图像,CNN计算的类别分数和它在训练集中的标签保持一致。
总结:
- CNN结构在最简单的情况下是将图像量转化为输出量(例如,保存类别分数)的图层列表。
- 有几种不同类型的层(例如,CONV/FC/RELU/POOL是目前最受欢迎的层)
- 每一层都通过一个可微分的函数,接收一个3D的输入量,并将它转化成一个3D的输出量
- 有的层具有参数,有的层不具有参数(例如,CONV/FC具有,RELU/POOL不具有)
- 有的层具有附加的超参数,有的曾不具有(例如,CONV/FC/POOL具有,RELU不具有)
示例CNN结构的激活。最初的量存储了原始的图片像素(最左边)而最后的量存储了类别分数(最右边)。处理路径上每一个激活的量都展示为一列。因为可视化3D的量十分困难,我们列出了每个量的横向切片。最后一层的量保存着每个分类的分数,但是这里我们知可是火了前五名的分数,并把每个的标签标示出来。完整的网页演示。这里展示的结构是一个小型的VCG网络,我们稍后会继续讨论。
转载:https://blog.csdn.net/sinat_28728095/article/details/56284699