Tensorflow 多层卷积神经网络 CNN

卷积神经网络 CNN

深度学习,卷积神经网络CNN与其他机器学习算法类似,可以看做是一个分类器,提取特征,然后进行特征映射。

1. 提取特征

CNN中特征提取时通过使用卷积核,和共享权值来降低计算复杂度。

  如1000*1000图像,使用卷积核10*10,下一层的特征参数为1000*1000*100,使用共享权值,参数变为100.

1.1 局部感知和参数共享

局部感知野,也就是卷积核。

卷积是一个函数在另一个函数上叠加产生的效果。

参数共享,也就是说每一层都把卷积核固定,进一步讲就是每一层每一个通道提取的特征应该都是一类的。如:边界,分叉处,中心等。

特征不是卷积核,是原始输入经过卷积核处理得到的。

1.2 多核卷积

多个卷积核,可以学习多种类型的特征。

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu= None, data_format=None, name=None)

  输入一个4D的input,filter张量,返回卷积。

  input: [batch, in_height, in_width, in_channels]

  filter: [filter_height, filter_width, in_channels, out_channels]

  strides: 步长。4值向量。

  padding: \'SAME\' or \'VALID\'

使用几个卷积核,channel就是多少,如果图像是多信道(彩色图),还要*3

1.3 池化

池化也是一个降采样的过程,它的作用首先是降低了计算复杂度,另外可以防止过拟合,并提取更粗维度(概况)的特征信息。

tf.nn.max_pool(value, ksize, strides, padding, data_format=\'NHWC\', name=None)

  value: 4D tensor, type float32 需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width,   channels]这样的shape

  ksize: a list,在各个维度怎么取池化。池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

  strides: 和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]

  padding:和卷积类似,可以取\'VALID\' 或者\'SAME\'  

  返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式

1.4 多层卷积

多层卷积的目的是因为一层卷积学到的特征往往都是局部的,层数越高,学到的特征就越全局化。

1.5 激活函数

激活函数都是非线性的,为系统引入非线性因素,可以非线型分类。

知乎颜沁睿的这个回答很不错,借来参考。

https://www.zhihu.com/question/22334626/answer/21036590

2. 特征映射

2.1 Dropout

dropout是为了防止过拟合,让某些特征失效(非永久)。训练模型,可以检验特征的有效性。

生物学的理解挺有意思:让一个没见过猫的小孩识别猫,猫的特征有很多:尖耳朵,圆眼睛,胡须等等,刚开始能记得很多特征,但哪些是有用的、哪些没用并不能有效区分。后来过了很久,只记得猫是圆眼睛有胡须的,这个过程就相当于是dropout部分特征信息,然后再重新来识别猫,再增加或者删除一些特征。

2.2 输出层

输出层是卷积层得到的特征信息的组合集合。

3. 训练算法

训练算法训练的是什么?

CNN我们可以看到它是原始输入,然后经过多个卷积核,卷积层处理得到最终输出特征集合,然后映射到标记label。如果去除激活函数引入的非线性信息,我们可以说y=Wx +b。

训练算法,训练的是W,也就是卷积核,对不对?还是卷积核提取出一系列特征信息,在最后训练特征信息身上的参数? 不过这样的话卷积核是随机选取的吗?亦或者,卷积核和参数都在训练。。。名字很高大上,叫反向传播。

参考:

http://www.jianshu.com/p/3b611043cbae

http://blog.csdn.net/zouxy09/article/details/8781543/

http://www.36dsj.com/archives/24006