http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_pros.html
http://nooverfit.com/wp/category/tensorflow/
todo
卷积核的个数与卷积核的大小概念
同一层,同时使用33, 44, 5*5 三种大小的卷积核?效果意义?
一、函数定义:
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
除去name参数用以指定该操作的name,与方法有关的一共五个参数:
input:
指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一
filter:
相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意:第三维in_channels=input的第四维。每个卷积得到的值等于前三维对应数值的点乘之和,所以通道与卷积核个数-out_channels不是一个概念。
strides:卷积时在input图像上每一维的步长,是长为4的向量[1,height_stride,width_stride,1],1代表移动一步
padding:
string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同的卷积方式(后面会介绍)。前者代表通过补0使,卷积提取的特征与原来的patch一致;VALID代表不填充
use_cudnn_on_gpu:
bool类型,是否使用cudnn加速,默认为true
结果返回一个Tensor,这个输出,就是我们常说的feature map
二、计算流程
情况a,现在有一张 3×3 单通道的图像(对应的shape:[1,3,3,1]),用一个1×1的卷积核(对应的shape:[1,1,1,1],形如[[[[2.5]]]])去做卷积,最后会得到一张3×3的feature map(图像上从左到右,从上到下每次取一个元素,与卷积核计算乘积)。
input = tf.ones([1,3,3,1],"float")
filter = tf.ones([1,1,1,1])*2.5
op2 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID')
print sess.run(input)
print sess.run(filter)
print(sess.run(op2))
2.增加图片的通道数,使用一张3×3 五通道的图像(对应的shape:[1,3,3,5]),用一个1×1的卷积核(对应的shape:[1,1,1,1])去做卷积,仍然是一张3×3的feature map,这就相当于每一个像素点,卷积核都与该像素点的每一个通道做点积
卷积层的理解

卷积层负责提取特征(how?原理),采样层负责特征选择(pooling保留邻域内最大特征值),全连接层负责分类(如softmax映射到概率分布,最大的概率值推测为分类结果)
卷积层:假设输入是一张图像3232大小,卷积层只有一个卷积核(55大小),从图像左上角开始,每次取出一个55的patch,与卷积核一一对应算 卷积得到一个特征值,然后移动一个步长(stride),再次得到新的特征值,最终构成一个特征图(2828,32-5+1)。

采样层:pooling,一般是最大采样(maxpooling),假如从特征图左上角开始,每次取22的矩阵进行maxpooling,得到4个值中的最大值,完成特征提取(也是特征压缩,2828压缩到14*14的)。

多轮卷积-采样,是为了学习到更抽象的特征表达(也可以理解为弱分类器进行级联加强分类能力),比如第一层卷积可以提取出图像的纹理、色彩、边缘(采样保留重要特征),第二轮便可以在基础特征上抽象出更为复杂的特征(长边,折线等)。最终全连接层根据提取的特征进行分类。
卷积神经网络的出现,以参数少,训练快,得分高,易迁移的特点全面碾压之前的简单神经网络。(?为什么有这些优点,待深究)
疑问:
-
卷积核是什么,为什么可以提取特征?
-- 卷积核放在神经网络里,就代表对应的权重(weight) -
为什么cnn在图像识别、语音识别,自然语言处理上较为成功?
-- 都可以将复杂任务分解为细粒度较简单的子任务,且子任务间有顺序、位置、逻辑联系。比如数字7识别,可以分解为识别一条横线和一条竖线,且横线和竖线间有相对位置联系。
同时局部与局部之间关联性不大,也就是局部的变化,很少影响到另外一个局部。(横线部分稍微倾斜扭曲,并不影响竖线的识别)。 -
采样层的逻辑?maxpooling的逻辑?
1)比如手写数字像素图,我们肉眼不关心空白的地方,也不关心数字中间黑色填充的地方,更关心的是黑白相交的边缘(想象一个数字的描边版)。计算机也如此,主要提取边缘特征(不是图片边缘的意思),不重要的区域特征可以丢弃或者较少保留,这样就可以减少参数。
2)依然以22 maxpooling为例,若采样层之前是一个边缘检测的滤波器,22矩阵中最大的值就代表在这个区域,该位置最符合边缘特征。
Maxpooling 就是在这个区域内选出最能代表边缘的值,也就是9,然后丢掉那些没多大用的信息

- 全连接层神经网络:比如输入[batch,784], 隐层a[784,1024],隐层b[1024,512]。我们大概会得到7841024512个参数,这些参数量非常巨大!模型复杂,计算慢,容易过拟合。
网友评论