卷积神经网络 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