卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成。
卷积层
使用卷积核对图像的每个点赋予一个权值。一个神经元就是特征图的一个像素点,是一个数学表达式,有多个输入,多个权值。设计好神经网络后,用样本训练网络,就是求解神经元的权值。
卷积核(滤波器)特点
卷积核的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。卷积核矩阵所有的元素之和应该要等于1,这样卷积前后图像的亮度保持不变。如果卷积核矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。
卷积层权值共享
若特征图由10个32*32*1的特征图组成,即每个特征图上有1024个神经元,每个神经元对应输入图像上一块5*5*3的区域,即一个神经元和输入图像的这块区域有75个连接,即75个权值参数,则共有75*1024*10=768000个权值参数,这是非常复杂的,因此卷积神经网络引入“权值”共享原则,即一个特征图上每个神经元对应的75个权值参数被每个神经元共享,这样则只需75*10=750个权值参数,而每个特征图的阈值也共享,即需要10个阈值,则总共需要750+10=760个参数。卷积层只有一个卷积核也就是卷积层权值共享原则。
卷积调用
tensorflow:tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')x是输入描述,eg.[batch,28,28,3] w是卷积核描述 ed.[3,3,3,16]. 分别是行列分辨率,通道数,核个数
激活函数
在神经网络中,对于图像,我们主要采用了卷积的方式来处理,也就是对每个像素点赋予一个权值,这个操作显然就是线性的。激活函数作用是加入非线性因素,增加模型的非线性表达能力。因为神经网络的数学基础是处处可微的,所以选取的激活函数要能保证数据输入与输出也是可微的,运算特征是不断进行循环计算,所以在每代循环过程中,每个神经元的值也是在不断变化的。
池化层
原始图片经卷积后提取的特征仍然很大,池化相当于减少特征数量。
一般在浅层使用最大池化去除无用信息,在深层使用平均池化,因为网络深层每个神经元都包含高级语义信息。
最大池化和均值池化
最大值池化可以提取图片纹理,均值池化可以保留背景特征。
池化调用
tensorflow:pool=tf.nn.max_pool(输入描述,eg.[batch,28,28,6]
池化核描述(仅大小),ed.[1,2,2,1]
池化核滑动步长,eg.[1,2,2,1],中间的2*2表示行列滑动步长都是2
padding='SAME')
padding=same 表示加0填充 padding=valad表示不加0填充
池化层的两个参数在误差逆传播时不变。常用的参数值为f=2,s=2,应用频率非常高,其效果相当于高度和宽度缩减一半。
全连接层
全连接层作用:
全连接层的作用主要就是实现分类(Classification),卷积取的是局部特征,全连接就是把以前的局部特征加权(通过权值矩阵)。因为用到了所有的局部特征,所以叫全连接。全连接层参数特多(可占整个网络参数80%左右)。全连接层减少了特征位置对分类带来的影响,因为空间结构特性被忽略了,所以全连接层不适合用于在方位上找Pattern的任务,比如segmentation。
全连接层实现:
全连接层实际就是卷积核大小为上层特征大小的卷积运算。以VGG-16为例,对224x224x3的输入,最后一层卷积可得输出为7x7x512,如后层是一层含4096个神经元的FC,则可用卷积核为7x7x512x4096的全局卷积来实现这一全连接运算过程,其中该卷积核参数如下:
“filter size = 7, padding = 0, stride = 1, D_in = 512, D_out = 4096”
经过此卷积操作后可得输出为1x1x4096。
如需再次叠加一个2048的FC,则可设定参数为“filter size = 1, padding = 0, stride = 1, D_in = 4096, D_out = 2048”的卷积层操作。
全连接层别的作用(特殊的好处)
在迁移学习中,若目标域(target domain)中的图像与源域图像差异过大,FC能保持模型表示能力的迁移。所以冗余的参数并不是一无是处。
全连接层的的层数加深,模型非线性表达能力提高。
单个全连接层的神经元数(宽度),宽度增加,神经元个数增加。
提高全连接层层数和宽度理论上都可以提高模型学习能力,但是学习能力太好会造成过拟合。另外,运算时间也是问题。
全连接层与1*1卷积的关系:
全连接层的坏处就在于其会破坏图像的空间结构,因此人们便开始用卷积层来“代替”全连接层,通常采用1×1的卷积核,这种不包含全连接的CNN成为全卷积神经网络(FCN),FCN最初是用于图像分割任务,之后开始在计算机视觉领域的各种问题上得到应用,事实上,Faster R-CNN中用来生成候选窗口的CNN就是一个FCN。FCN的特点就在于输入和输出都是二维的图像,并且输入和输出具有相对应的空间结构,在这种情况下,我们可以将FCN的输出看作是一张热度图,用热度来指示待检测的目标的位置和覆盖的区域。在目标所处的区域内显示较高的热度,而在背景区域显示较低的热度,这也可以看成是对图像上的每一个像素点都进行了分类,这个点是否位于待检测的目标上。
过拟合
过拟合具体描述
训练一个特定的网络,随着迭代次数增多,网络对训练集拟合的很好(在训练集上loss很小),但是对验证集的拟合程度很差。过拟合一般是训练数据过少网络会出现的问题。
过拟合理解
把某些训练样本的自身特点当成一般性质。举一个典型例子(来源于keras教程)可助于理解:如果您作为一个人,只能看到三位伐木工人的图像,三位是水手的图像,并且其中只有一个伐木工戴着帽子,您可能会开始觉得戴一顶帽子是成为伐木工人(而不是水手)的标志。然后,您将做出一个非常糟糕的伐木工人/水手分类器。
有什么方法可以避免过拟合?
使用交叉验证法训练模型
在代价函数上加入正则化项
使用dropout(用在全连接层)
dropout
dropout来源于这样的假设
当网络对训练集拟合的很好而对验证集的拟合的很差时,可不可以让每次跌代随机的去更新网络参数(weights),而不是全部更新,引入这样的随机性就可以增加网络generalize 的能力。所以就有了dropout 。
dropout作用原理?
每层神经元代表一个学习到的中间特征,当数据量过小,出现过拟合时,显然这时神经元表示的特征相互之间重复和冗余。dropout直接作用是:减少冗余,即增加每层各个特征之间的正交性。每次迭代只有一部分参数更新,减慢收敛速度
dropout的具体方法?
Dropout 一般在全连接层使用,被drop的神经元不参加当前轮的参数优化。只有训练时使用dropout,测试时所有神经元都参与运算。
在训练的时候,我们只需要按一定的概率(retaining probability)p 来对weight layer 的参数进行随机采样,将这个子网络作为此次更新的目标网络。可以想象,如果整个网络有n个参数,那么我们可用的子网络个数为 2^n 。
测试时,不对网络的参数做任何丢弃,这时dropout layer相当于进来什么就输出什么。然后,把测试时dropout layer的输出乘以训练时使用的retaining probability p 。是为了使得dropout layer 下一层的输入和训练时具有相同的“意义”和“数量级”。
dropout调用?
在tensorflow中:tf.nn.dropout(上层输出,暂时舍弃的概率)