1.卷积层
卷积层旨在学习输入的特征表示。
卷积神经网络有两种方式降低参数数目。
-
局部感知
也称稀疏连接。在处理图像这样的高纬度输入时,让每个神经元与前一层的所有神经元进行全连接是不现实的。相反,每个神经元只与输入数据的局部区域进行连接。该连接的空间大小叫作神经元的感知野。然后在更高层将局部的信息综合起来就得到了全局的信息。
如有一副1000×1000像素的图像和1000个隐藏层神经元,如果全连接,就有1000×1000×1000个连接,也就是10e9个权值参数。那么通过局部感知,每个隐含层神经元只与前一层10×10个像素相连那么去权值参数为1000×100=10e5,减少了原来的万分之一。
而那10×10个像素对应的10×10个参数,其实就是相当于卷积操作 -
权值共享
生成特征图的卷积核是相同的。权值共享模式可以减少模型的复杂度,使网络更容易训练。
上述参数依然很多,在上面局部连接中每个神经元对应100个参数,而有1000个神经元。如果这1000个神经元,每个神经元对应的100个参数是相等的,那么参数数目就变成100了,换少了全连接的千万分之一。 -
卷积过程
卷积核W覆盖在原图X的一个局部的面上,W对应位置的权值乘以X对应神经元的输出,对各项乘积求和并赋值到矩阵Y(输出图)的对应位置。
卷积层代码
tf.nn.conv2d(
intput,
filter,
strides,
padding,
use_cudnn_on_gpu=None,
data_format=None,
name=None
)
第一个参数input:指需要做卷积的输入图像,它要求是一个张量(Tensor),具有[batch, in_height, in_width, channels]这样的形状,具体含义是“训练一批图片,图片高度,图片宽度,图像通道数”
第二个参数filter:是CNN中的卷积核,他要求是一个张量,具有[filter_height, filter_width,in_channels, out_channels]这样的形状,具体含义是“ 卷积核高度,卷积核宽度,图像通道数,卷积核个数 ”,
其中第三维就是input的第四维。
结果返回一个张量,这个输出就是特征图。
2.池化层
理论是讲,卷积后,就可以用所有的提取到的特征去训练分类器了,例如softmax分类器。但这样做的面临计算量的问题。例如:对于100×100像素的图像,假设已经学习得到了100个定义在5×5输入上的特征(即:有100个卷积核),每一个特征和图像都会得到一个(100-5+1)×(100-5+1)=9216维(展开为一维向量)的卷积特征。由于有100个特征,所以每个样例就有921600维的卷积特征向量。这还容易出现过拟合。
所以就需要用到池化,即对图像不同位置的特征进行进行聚合统计。例如可以计算图像一个区域上的某个特定特征的平局值或最大值,这些概要统计特征不仅具有更少的维度,而且会改善结果,不容易过拟合。
池化层旨在通过特征图的分辨率来实现空间不变性和减少训练参数。
池化层代码
tf.nn.max_pool(
value,
ksize,
strides.
padding,
data_format='NHWC',
name=None)
第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是特征图(Feature Map),依然是[batch, height, width, channels]这样的形状.
这里的第四维就是卷积层的卷积核个数------同时这也说明了“ 每个池化层的特征图和它相应的前一卷积层的特征图相连,因此他们的特征数量相同,空间不变性”。
第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1,height,wudth,1]。因为不是在batch和channel上池化,所以这两个维度设为1.
3.全连接层
旨在执行对原始图像的高级抽象。在全连接层不保存空间信息。最后全连接层的输出传递到输出层。对于分类任务,softmax回归由于可以生成输出的概率分布而被普遍使用。
softmax函数:
tf.nn.softmax(logits,name=None)
参数logits为输入数据,输出为概率分布。
4.Dropout层
随机失活神经元,防止过拟合现象。
Dropout函数
tf.nn.dropout(x,
keep_prob,
noise_shape=None,
seed=None,
name=None)
第一个参数”x“:输入张量,即输入数据。
第二个参数keep_prob:float型,每个元素被保留下来的概率。