Convolutional Neural Networks for Visual Recognition 8

Convolutional Neural Networks (CNNs / ConvNets)

前面做了如此漫长的铺垫,如今终于来到了课程的重点。

Convolutional Neural Networks。 简称CNN,与之前介绍的一般的神经网络相似,CNN相同是由能够学习的权值与偏移量构成。每个神经元接收一些输入。做点积运算加上偏移量,然后选择性的通过一些非线性函数。整个网络终于还是表示成一个可导的loss function,网络的起始端是输入图像。网络的终端是每一类的预測值,通过一个full connected层。最后这些预測值会表示成SVM或者Softmax的loss function,在一般神经网络里用到的技巧在CNN中都相同适用。

那么。CNN与普通的神经网络相比,又有哪些变化呢?CNN的网络结构能够直接处理图像。换句话说CNN的输入就是直接假设为图像。这一点有助于我们设计出具备某些特性的网络结构,同一时候前向传递函数能够更加高效地实现。并且将网络的參数大大降低。

Architecture Overview

前面介绍的普通的神经网络,我们知道该网络接收一个输入,通过一系列的隐含层进行变换,每个隐含层都是由一些神经元组成,每个神经元都会和前一层的全部神经元连接,这样的连接方式称为 full connected,每一层的神经元的激励函数都是相互独立,没有不论什么共享。

最后一个full connected层称为输出层。在分类问题中,它表示每一类的score。

一般来说,普通的神经网络不能很好地扩展到处理图像,特别是高维图像。由于神经元的连接是full connected的方式,导致一般的神经网络处理大图像的时候将会引入海量的參数,而这样很easy造成overfitting。

而CNN。利用了输入是图像这一事实,他们用一种更加明智的方法来设计网络结构,详细说来,不像普通的神经网络,CNN中的每一层的神经元被排列成一个三维模型:拥有width。height以及depth。这里的depth指的是CNN每一层的纵深。并不是指整个CNN结构的纵深。比方,对于CIFAR-10数据库来说,输入是一个三维的volume。32×32×3,分别相应width,height和depth,我们将会看到,CNN中。每一层的神经元仅仅跟前一层的部分神经元相连,而没有full connected,并且最后的输出层是一个1×1×10的volume,由于最后一层表示每一类的score。CNN通过这样的结构,将一个输入的图像最后转化成一个表示每一类score的向量,下图给出了两种神经网络的示意图:

上图左边是一般的神经网络,这个网络有两个隐含层。右边是CNN,将每一层的神经元排列成一个三维的volume。能够将3D的输入volume转化为3D的输出volume.

Layers used to build ConvNets

上一节已经提到,CNN的每一层都将某种输入通过某些可导函数转化为还有一种输出,一般来说,我们主要利用三种类型的layer去构建一个CNN,这三种类型的layer各自是convolutional layer, pooling layer 以及full connected layer,这三种类型的layer通过组合叠加从而组成一个完整的CNN网络。我们先来看一个简单的样例,以CIFAR-10数据库为例,我们要设计一个CNN网络对CIFRA-10进行分类,那么一个可能的简单结构是:[INPUT-CONV-RELU-POOL-FC],当中:

INPUT:[32×32×3] 表示输入层,是图像的像素值,这样的情况下表示图像是宽为32个像素。高为32个像素,并且有R,G,B三个通道。

CONV: 是卷积层,计算输入层的局部神经元与连接到CONV层神经元的连接系数的点积。假设假设depth是12的话,那么可能的输出就是[32×32×12]。

POOL: 这一层主要运行降採样的功能,可能的输出为[16×16×12]。

FC: 这一层计算终于的每一类的score。输出为[1×1×10]。

与普通的神经网络一样,这一层的神经元与上一层的全部神经元都会连接。

所以,利用这样的结构,CNN通过一层一层的传递作用。将原始的图像最后映射到每一类的score。我们能够看到。有些层有參数,有些层没有參数。特别地,CONV/FC层不仅仅仅仅是通过激励函数做转化,并且參数(权值,偏移量)也起到很关键的数据,还有一方面,POOL/RELU 层仅仅是固定的函数在起作用,并没有涉及到參数,CONV/FC层的參数将通过梯度下降的方法训练得到,使得训练样本的预測值与目标值吻合。

下图给出了一个典型的CNN结构。

总之。CNN能够总结例如以下:

1):一个CNN结构是由一系列的运行不同转化功能的layers组成的,将输入的原始图像映射到最后的score。

2):整个网络结构,仅仅有少数几类不同功能的layer (CONV/FC/RELU/POOL 是眼下比較流行的几种)。

3):每一层都接收一个3-D的数据体,最后也会输出一个3-D的数据体。

4):有些层有參数(CONV/FC),有些层没有(RELU/POOL)。

5):有些层还可能有hyperparameters(CONV/POOL/FC)。有些层则没有(RELU)。

接下来,我们要描写叙述每一类layer的作用。以及相关的參数。

Convolutional Layer

Conv layer是CNN网络的核心部件。它的输出能够看成是一个3-D的数据体,CONV 层包括一系列可学的filters,这些filter的尺寸都很小,可是能够扩展到input的整个depth,前向传递的时候,filter在输入图像上滑动,产生一个2-D的关于filter的激励映射,filter仅仅会和局部的一些像素(神经元)做点积。所以每个输出的神经元能够看成是对输入层的局部神经元的激励,我们希望这些filter通过训练,能够提取某些实用的局部信息。

我们接下来探讨到更加详细的细节。

当输入是高维的变量,比方图像等,假设採用full connected的连接是不切实际的。相反,我们会採用局部连接的方式,那么每个局部区域我们称为receptive field,这样的局部连接是针对输入层的宽,高这两个维度来说,可是对于第三个维度depth来说,依旧是要全然连接,所以我们处理局部空间在宽。高维度与depth这个维度是不一样的。

宽,高维度上,我们採取局部连接,可是对于depth维度。我们採用全连方式。

比方。假设一个输入图像的尺寸是[32×32×3],我们定义下一层神经元的receptive field的尺寸是5×5,那么考虑到depth这个维度。终于每一次都有5×5×3=75个神经元与CONV层的一个神经元连接,意味着有5×5×3=75个权值。

再比方,假设如今有一个输入的数据体是16×16×20。那么假设定义一个receptive field为3×3的连接方法,那么在CONV层的每个神经元终于连接到上一层神经元的个数是3×3×20=180。

这两个样例都说明了。在宽,高维度我们採用局部连接的方式,而在depth维度,我们会全部连接。以下给出了一个简单的示意图:

前面我们介绍了CONV层的神经元与前一层的连接方式。可是CONV层本身的神经元怎样排列,并且其尺寸怎样,我们还没有讨论。其实,CONV层本身的神经元怎样排列以及CONV层的尺寸由三个因素决定:depth。stride。zero padding。

首先,depth决定了CONV层中有多少神经元能够与前一层相同的神经元相连,这个相似普通的神经网络,在普通的神经网络中,我们知道每个神经元都与上一层的全部神经元相连。全部每一层的全部神经元都是与上一层相同的神经元相连。我们将会看到。全部这些神经元将通过学习从而对输入的不同特征产生应激作用,比方,假设第一个CONV层接收的是原始输入图像。那么沿着depth维度排列的神经元(注意:这些神经元连接的输入层的神经元都相同)可能对不同的特性(比方边界,颜色,斑块)等产生激励。我们将这些连接到输入层同一区域的神经元称为一个depth volume。

接下来,我们必须指定stride,这个决定了我们怎样在CONV层排列depth volume,假设我们指定stride为1,那么depth volume的排列将会很紧凑,意味着隔一个神经元就会有一个depth volume。这样会产生比較大的重叠。并且输出的尺寸也会很大,假设我们增大stride,能够降低重叠。并且能够降低输出的尺寸。

zero padding就是为了控制输出的尺寸。对输入图像的边缘进行补零操作。由于卷积可能使输出图像的尺寸降低,有的时候为了得到与输入一样的尺寸,我们能够在做卷积之前先对输入图像的边缘补零,即先增大输入图像的尺寸,这样能够使得终于的卷积结果与补零前的输入图像的尺寸一致。

我们能够看到,输出层有一个depth。一个spatial size,depth能够指定,spatial size与输入层的size(W),receptive field的size,即filter的size(F)。我们定义的stride(S)。还有边缘的zero padding的size(P)有关。能够看成是这些变量的一个函数,我们能够证明终于输出的spatial size为:(W?F+2P)/S+1。

我们能够看一个样例。假设输入图像的尺寸为[227×227×3]。我们设计一个CONV层,每个神经元的receptive field为11,即F=11,stride为S=4,没有zero padding。那么输出的CONV层的spatial size为(227?11)/4+1=55。假设我们定义CONV层的depth为96,那么这个CONV层的终于尺寸为55×55×96, 从上面这个定义看出。这55×55×96个神经元中的每个都和输入图像的一个11×11×3的局部区域相连,并且每个depth volume中含有96个神经元,这96个神经元与输入图像的同一个11×11×3的局部区域相连,它们唯一的差别在于连接权值的不同。

继续看上面的样例,我们知道CONV层有55×55×96=29040个神经元。每个神经元都与输入层的11×11×3个神经元连接,那么CONV层的每个神经元都将有11×11×3=363个权值外加一个bias,那么终于的系数将会达到29040×(363+1)=105,705,600。很明显,这个系数量太大了。

我们能够利用一个合理的假设来大大系数的数量。我们将CONV层看成一个depth volume。比方上面这个样例,CONV层是一个55×55×96的volume,其depth为96。那么每个55×55的排列能够看成是一个slice,那么这个CONV层有96个slices,每个slice的尺寸都为55×55,我们让每个slice里的神经元都共享一组相同的连接系数。或者说相同的filter,那么意味着每个slice都仅仅有11×11×3个不同的系数,整个CONV层将仅仅有11×11×3×96=34848。假设每个slice的神经元也共享相同的bias,那么终于的系数为34848+96=34944个,我们看到,通过这样的假设。系数的总量大大降低了。每个slice里的55×55个神经元都共享相同的连接系数,实际运算中,全部的神经元都会计算相应的梯度。可是这些梯度终于会相加,在每个slice中仅仅做一次更新。

假设每个slice里的神经元都共享相同的连接系数。那么实际运算的时候能够利用卷积运算。其实这也是这个网络名称的由来,卷积在当中发挥关键的数据,全部我们有的时候把这些系数称为filter或者kernel。卷积的结果就是activation map,每个activation map叠加,最后形成一个55×55×96的volume。

总结一下CONV的特点:

接收一个尺寸为W1×H1×D1的volume。

定义一些相关的hyperparameter,比方filter的个数K,filter的size或者称为receptive fieldF,stride S以及zero padding P。通过运算能够得到一个例如以下的

尺寸为:W2×H2×D2的depth volume,当中,W2=(W1?F+2P)/S+1。H2=(H1?F+2P)/S+1。D2=K,通过參数共享,每个slice

会有一个F?F?D1的kernel,一共同拥有K个kernel,所以一共同拥有系数(F?F?D1)?K,在输出的数据体中,每个slice的尺寸都是W2×H2。一共同拥有D2=K个slice。

CONV层的backpropagation 相同是卷积运算,这个详细的细节留到后面详细探讨。

Pooling Layer

一般来说。在两个CONV layer之间,会插入一共pooling layer。pooling layer的作用一个是降低输入的空间尺寸,从而能够降低參数的数量及运算量。同一时候也能够控制overfitting。

Pooling layer与上一层的每个slice是一一相应的,没有相互交叉。最常见的pooling 运算是採用max 操作。在2×2的一个空间区域内,以stride为2进行将採样。pooling操作仅仅在宽,高维度上进行。所以不会改变depth,输出与输入的depth将会一样。总结来说。Pooling layer:

接收一个尺寸为W1×H1×D1的volume。定义一些相关的hyperparameter,filter的size或者称为receptive fieldF,stride S,通过运算能够得到一个例如以下的尺寸为:W2×H2×D2的depth volume,当中。W2=(W1?F)/S+1。H2=(H1?F)/S+1。D2=D1,pooling layer不会又系数,也不会使用zero padding。下图给了一个pooling的示意图:

max pooling 的backpropagation。简单来说就是仅仅对输入的最大值进行梯度运算,所以每次前向运算的时候,最好能够将最大值的位置记录下来,这样每次backward的时候就能够方便运算。

Full-connected Layer

FC layer就像普通神经网络里的隐含层一样,FC layer中的每个神经元与上一层全部的神经元都会连接(full connected),涉及到的运算也和普通的神经网络一样。值得注意的一点是,FC与CONV layer之间的差别仅在于CONV layer里的神经元仅仅和上一层的局部神经元相连。可是两者的运算模式是一样的。都是做点积。因此在FC与CONV之间存在相互转换的可能。

对于CONV layer。假设我们从FC的角度来看。相当于乘了一个很大的稀疏矩阵(大部分系数为0。由于仅仅有局部神经元的连接是有效的),并且这些非0系数在某些block中是相等的(系数共享)。

反过来,不论什么FC layer也能够有效地转换成CONV layer。比方一个神经元个数K=4096的FC layer。接收的输入是7×7×512,我们能够等同于利用一个CONV层其hyperparameter设定为 F=7, P=0, S=1, K=4096。我们设定filter的spatial size与输入的spatial size是一样的。这样最后会得到一个1×1×4096的输出。

上面所说的两种转换,当中FC 转换为CONV 在实际运算中很实用,考虑一个实际的CNN网络。最原始的输入为224×224×3的图像,经过一系列的转换运算。我们得到了一个尺寸为7×7×512的volume,接下来我们用两个FC layer,将这个volume转换为尺寸为4096的volume,最后连接到size为1000的输出,我们能够将这三个FC layer用CONV layer的运算模式来表示。

将第一个FC layer替换成CONV layer,其filter size 为7,我们能够得到1×1×4096的输出。将第二个FC layer替换成CONV layer,其filter size 为1,输出的volume为1×1×4096。

相同。最后一个FC layer用filter size为1的CONV layer替换,最后的输出为1×1×1000。

上面所说的每个转换都涉及到系数矩阵的reshape问题。这样的转换能够让我们将CNN结构很有效的在更大的图像上滑动。比方,假设一个224×224的图像生成了一个尺寸为7×7×512的volume。从224降到7,一共降了32倍。那么,假设输入的图像是384×384,那么我们会生成一个12×12×512的volume,那么我们利用这三层FC layer,转换成CONV layer。我们终于会得到6×6×1000的输出。意味着每一类的score不仅仅是一个数。而是一个6×6的数组。

我们能够看到,假设图像保持不动,而CNN网络每次以32个像素的stride在图像上移动,最后得到的结果是一样的。

一般来说,利用CNN网络做一次遍历。得到一个6×6的score。比反复调用CNN结构36次计算其在图像不同位置之间的score要更加高效,由于这36次调用使用的是同一个网络结构,共享全然一样的系数及运算模式。

这样的实际应用中,是一种提高分类性能的技巧,比方我们将一幅图先放大,然后再利用CNN结构做遍历,最后将全部得到的score求平均。

最后一点,假设我们想将CNN网络以小于32的stride有效地应用在图像上,能够通过多次前向传递运算达到目的。比方,我们想以16个像素的stride遍历图像。能够做两次运算,第一次是直接将CNN网络在原图上做遍历。第二次,先将原图在宽,高方向分别平移16个像素。然后在平移后的图像上做遍历。

ConvNet Architectures

我们已经看到,CNN网络一般仅仅有几种类型的layer:CONV。POOL(一般默觉得max pooling)以及FC,一般我们也会把RELU单独列为一层,用来运行非线性运算的操作,我们看看这些layer怎样构建一个完整的CNN网络。

比較常见的模式是先叠加几层CONV-RELU layer,后面连上POOL layer。这样将输入的图像逐渐降低到一个比較小的尺寸,接来下。就连上Full connected layer。最后的FC layer是输出。所以一般比較常见的模式例如以下所看到的:

INPUT -> [[CONV -> RELU]*N -> POOL?

]*M -> [FC -> RELU]*K -> FC

当中*表示反复叠加的意思。而POOL?表示这是可选择的,并且N>=0,一般N<=3,M>=0,K>=0,通常K<=3,以下是一些常见的CNN网络结构。

INPUT -> FC,这是最普通的线性分类器。N = M = K = 0.

INPUT -> CONV -> RELU -> FC

INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU -> FC 我们看到CONV layer后面连着Pool layer。

INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC 我们看到在连接POOL layer之前,已经有两个CONV layer叠加到一起了。

一般我们会选择小尺寸的filter,这在实际应用中的效果会更好。一般来说。输入图像的尺寸最好是2的幂次方,比方32,64,96,224,384以及512。CONV 层一般用比較小的filter,比方3×3或者5×5。stride一般设为1,为了让卷积运算之后图像的尺寸保持不变,有的时候会引入zero padding。zero padding的大小一般为P=(F-1)/2。pool layer运行降採样的功能,最常见的pool是用max pooling,在一个2×2的区域内,这样相当于将图像缩小一半,在设计CNN网络的时候。对于这些參数要小心设定。要确保每个layer的输出尺寸与设想的一致。

如今流行的CNN网络结构都是很庞大的。比較著名的CNN结构有例如以下几个LeNet, AlexNet, ZF Net, Google Net, VGGNet,详细的介绍能够參考课程站点。这里不再详述。

声明:lecture notes里的图片都来源于该课程的站点,仅仅能用于学习,请勿作其他用途。如需转载。请说明该课程为引用来源。

http://cs231n.stanford.edu/

时间: 2024-07-30 11:21:58

Convolutional Neural Networks for Visual Recognition 8的相关文章

卷积神经网络用于视觉识别Convolutional Neural Networks for Visual Recognition

Table of Contents: Architecture Overview ConvNet Layers Convolutional Layer Pooling Layer Normalization Layer Fully-Connected Layer Converting Fully-Connected Layers to Convolutional Layers ConvNet Architectures Layer Patterns Layer Sizing Patterns C

Convolutional Neural Networks for Visual Recognition 2

Linear Classification 在上一讲里,我们介绍了图像分类问题以及一个简单的分类模型K-NN模型,我们已经知道K-NN的模型有几个严重的缺陷,第一就是要保存训练集里的所有样本,这个比较消耗存储空间:第二就是要遍历所有的训练样本,这种逐一比较的方式比较耗时而低效. 现在,我们要介绍一种更加强大的图像分类模型,这个模型会很自然地引申出神经网络和Convolutional Neural Networks(CNN),这个模型有两个重要的组成部分,一个是score function,将原始

Convolutional Neural Networks for Visual Recognition 5

Setting up the data and the model 前面我们介绍了一个神经元的模型,通过一个激励函数将高维的输入域权值的点积转化为一个单一的输出,而神经网络就是将神经元排列到每一层,形成一个网络结构,这种结构与我们之前介绍的线性模型不太一样,因此score function也需要重新定义,神经网络实现了一系列的线性映射与非线性映射,这一讲,我们主要介绍神经网络的数据预处理以及score function的定义. data processing 给定一个训练集,S={xi∈RD|i

Convolutional Neural Networks for Visual Recognition 7

Two Simple Examples softmax classifier 后,我们介绍两个简单的例子,一个是线性分类器,一个是神经网络.由于网上的讲义给出的都是代码,我们这里用公式来进行推导.首先看softmax classifier 的例子.给定输入X∈RN×D,权值W∈RD×K,偏移量b∈R1×K,我们可以得到分类器对每个样本的预测分数:f=XW+b,我们可以用softmax 函数将预测分数转为概率:pi=efi∑jefj,pi 表示样本属于第i类的概率,fi,fj表示线性函数对样本属于

cs231n Convolutional Neural Networks for Visual Recognition 2 SVM softmax

linear classification 上节中简单介绍了图像分类的概念,并且学习了费时费内存但是精度不高的knn法,本节我们将会进一步学习一种更好的方法,以后的章节中会慢慢引入神经网络和convolutional neural network.这种新的算法有两部分组成: 1. 评价函数score function,用于将原始数据映射到分类结果(预测值): 2. 损失函数loss function, 用于定量分析预测值与真实值的相似程度,损失函数越小,预测值越接近真实值. 我们将两者结合,损失

Convolutional Neural Networks for Visual Recognition 4

Modeling one neuron 下面我们开始介绍神经网络,我们先从最简单的一个神经元的情况开始,一个简单的神经元包括输入,激励函数以及输出.如下图所示: 一个神经元类似一个线性分类器,如果激励函数是sigmoid 函数(σ(x)=1/(1+e?x)),那么σ(∑iwixi+b)相当于是求该输入所对应的输出为1的概率,P(y=1|xi;w),那么该输入所对应的输出为0的概率为 P(y=0|xi;w)=1?P(y=1|xi;w).在神经网络中,常用的激励函数一个是sigmoid函数,另一个是

CS231n: Convolutional Neural Networks for Visual Recognition - Spring 2017

喜大普奔!!!!! CS231n 2017新鲜出炉啦!!!!! 课程主页:http://cs231n.stanford.edu/ 有讲义,有教案,有讲座,更重要的是--还有官方授课视频!!!!!意不意外?惊不惊喜?开不开心???!!!

Convolutional Neural Networks for Visual Recognition 6

-###Learning 前面,我们介绍了神经网络的构成,数据的预处理,权值的初始化等等.这一讲,我们将要介绍神经网络参数学习的过程. Gradient Checks 梯度的运算,在理论上是简单的,但是在实际的应用中,却非常容易出错,梯度的运算常见的有如下两种形式: 形式一: df(x)dx=f(x+h)?f(x)h h是一个很小的常数,实际运算的时候,h大概等于1e?5,但我们通常会用下面这种形式计算梯度: 形式二: df(x)dx=f(x+h)?f(x?h)2h 利用这个表达式,需要我们对l

Convolutional Neural Networks for Visual Recognition 3

Gradient Computing 前面我们介绍过分类器模型一般包含两大部分,一部分是score function,将输入的原始数据映射到每一类的score,另外一个重要组成部分是loss function,计算预测值 与实际值之间的误差,具体地,给定一个线性分类函数:f(xi;W)=Wxi,我们定义如下的loss function: L=1N∑i∑j≠yi[max(0,f(xi,W)j?f(xi,W)yi+1)]+αR(W) 我们看到L与参数W有关,所以我们需要找到一个合适的W使得L尽可能小