导图社区 《TensorFlow实战Google深度学习框架》
第六章:图像识别与卷积神经网络
编辑于2019-08-30 14:51:27卷积神经网络
结构
输入层
图像三通道三维矩阵
长
length
宽
wide
深度(图像的色彩通道)
channel
黑白(灰度)
channel=1
彩色
channel=3
卷积层
内核kernel | 过滤器filter
过滤器的前向传播过程(作用)
将当前层神经网络上的子节点矩阵转化为下一层神经网络上的一个单位节点矩阵(单位节点矩阵,长和宽都等于1,但深度不限的节点矩阵)
前向传播过程
通过一个过滤器从神经网络的当前层从左上角移动到右下角,并且在移动的过程中计算每一个对应的单位矩阵得到的
每移动一次,计算得到一个值;当深度为k时,会计算出k个值;
过滤器的尺寸
【输入节点矩阵的长宽】
由人工指定,常用Size
3x3
5x5
【输入节点矩阵的深度】
过滤器处理的矩阵深度和当前层神经网络的节点矩阵的深度是一致的。
过滤器的深度
=单位节点矩阵的深度
注意:过滤器的尺寸指的是一个过滤器输入节点矩阵的大小,而深度指的是输出单位节点矩阵的深度。
人工参数设置
输入节点矩阵kernel的长和宽
length
width
输出单位节点矩阵的深度
depth
输出结果的尺寸控制
对当前层进行全0填充zero-padding
设置过滤器的移动步长stride
特点
通过卷积层处理过的节点矩阵会变的更深;
作用
卷积层试图将神经网络中的每一小块进行更加深入地分析从而得到抽象层度更高的特征;
性质
在卷积神经网络中,每一个卷积层中使用的过滤器的参数都是一样的。
共享过滤器参数可以使得图像上的内容不受位置的影响。可减少神经网络的参数。
卷积层的参数和图片的大小无关,它只和过滤器的尺寸、深度以及当前层节点层节点矩阵的深度有关。
TensorFlow支持
卷积层参数设置
过滤器的尺寸
width
height
当前层节点矩阵的深度
depth-1
输出单位矩阵的深度
depth-2
filter_weight = tf .get_variable('weight', [5,5,3,16], initializer=tf.truncated_normal_initializer(stddev=0.1))
[5,5,3,16]
5,5
过滤器的尺寸
width
height
3,
当前层节点矩阵的深度
16
输出单位矩阵的深度
卷积前向传播算法
tf.nn.conv2d(input, filter_weight, strides, padding)
input
输入-input:当前层的节点矩阵
四维矩阵
第一维:batch_size
后三维:一个节点矩阵
举例
input[0,:,:,:]
表示一张图片
input[1,:,:,:]
表示二张图片
**input : ** 输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。(也可以用其它值,但是具体含义不是很理解)
filter_weight
卷积层的权重
stride
步长,不同维度上的步长
提供一个长度为4的数组,但是第一维和最后一维的数字要求=1
因为卷积层的步长支队矩阵的长和宽有效
padding
SAME
添加全0填充
VALID
不填充
偏置项
tf.nn.bias_add
给每一个节点加上一个偏置项
tf.nn.bias_add(conv, biases)
注意:这里不能直接使用加法,因为矩阵上不同位置上的节点都是需要加上同样的偏置项
去线性化
tf.nn.relu(bias)
池化层Pooling
特点
作用
不改变三维矩阵的深度,可以有效缩小矩阵尺寸
可以认为将一张高分辨率的图片缩小为分辨率更低的图片
比如,通过池化层可以缩小最后全连接层中的节点个数,从而达到减少整个神经网络中的参数
加快计算速度,防止过拟合问题
操作
最大池化层
max pooling
平均池化层
average pooling
过滤器
使用操作与卷积核相似
不同
卷积层使用的过滤器是横跨整个深度
池化层只影响一个深度上的节点
池化层的过滤器除了在长和宽两个维度移动,所以它还需要在深度这个维度上移动
作用
池化层的作用主要用于减小矩阵的长和宽,虽然也可以减小矩阵深度,但在实践中一般不会这样使用
Tensorflow支持
tf.nn.max_pool(actived_conv, ksize=[1,3,3,1],strides=[1,2,2,1],padding='SAME')
ksize
过滤器的尺寸第一位和最后一维必须等于1;意味着池化层的过滤器是不可以跨不同输入样例或者节点矩阵深度的
常用
[1,2,2,1]
[1,3,3,1]
strides
与卷积层的步长使用相同
tf.nn.avg_pool()
多轮(卷积层+池化层)自动(图像)特征提取
全连接层
完成分类任务
Softmax层
输出的是不同类别的可信度
通过softmax层可以得到当前类别属于不同类别的概率分布的情况
卷积模型
卷积神经网络架构
输入层--> (卷积层+ -->池化层?) +-->全连接层-->输出层
输入层
三维矩阵
卷积层+
一层或多层卷积层;一般最多连续使用三层卷积层
一遍卷积层的过滤器边长一般为3或者1,不会超过5,但也有特例为7或者11
在过滤器的深度上,大部分卷积神经网络都采用逐层递增的方式
池化层?
表示没有或者一层池化层
池化层可以避免过拟合和减少参数,但是也可以直接调整卷积层步长来完成
最大池化层最常用
池化层的过滤器边长一般为2或者3,步长也一般为2或者3
全连接层
1-2层全连接层
输出层
全连接层;分类
常见卷积模型
LeNet-5
卷积层串联
VGGNet
convX-Y
表示过过滤器的边长为X,深度为Y
AlexNet
Inception-v3
卷积层并联
特点
同时使用所有不同尺寸的过滤器,然后再将得到的矩阵拼接起来
不同的矩阵代表了Inception模块中的一条计算路径。
虽然过滤器的尺寸不同,只要所有的过滤器使用全0填充且步长为1,那么前向传播得到的结果矩阵的长和宽都与输入矩阵一致。这样经过不同过滤器处理的结果可以拼接成一个更深的矩阵
TensorFlow-Slim工具
net = slim.conv2d(input, 32, [3,3] )
第一个参数
输入节点矩阵
第二参数
当前卷积层过滤器的深度
第三参数
过滤器的尺寸
可选参数
过滤器的移动的步长
是否使用全0填充
激活函数的选择
变量的命名空间
迁移学习
作用
解决标注数据和训练时间的问题
一般来说,在数据量足够的情况下,迁移学习的效果不如完全重新训练。但是迁移学习所需要的训练时间和训练样本数要远远小于训练完整的模型。
结论
《DeCAF》
可以保留训练好的Inception-v3模型中所有卷积层的参数,只是替换最后一层全连接层。瓶颈层(bottleneck):最后一层全连接层之前的网络层。
图像特征提取
将新的图像通过训练好的卷积神经网络直到瓶颈层的过程可以看做是对图像进行特征提取的过程。