基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型
1、卷积
2、池化
3、全连接
4、梯度下降法
5、softmax
本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主要就是给大家做个铺垫,如有错误请指正,相互学习共同进步。
大家应该知道大名鼎鼎的傅里叶变换,即一个波形,可以有不同的正弦函数和余弦函数进行叠加完成,卷积神经网络也是一样,可以认为一张图片是由各种不同特征的图片叠加而成的,所以它的作用是用来提取特定的特征,举个例子,比如给定一张图片,然后我只想提取它的轮廓,于是就需要卷积神经网络。
如图是大名鼎鼎的LeNet-5(识别数字的卷积网络),效果和论文在此,这里拿出来只是为了说明一下卷积神经网络的模型,就像图中那样,经过多次,卷积,池化(又叫子采样),然后全连接,就完工了。
其实卷积很好理解,左侧绿色的部分的5*5矩阵其实一般就是我们输入的图片的灰度值(可以想象成一张5px*5px的黑白照片,然后把黑白照片上的每一个点转化成矩阵上的每一个元素),然后上面的黄色部分矩阵就是我们的过滤器,用来提取特征,(其实应该叫滤波器或者卷积核),让卷积核在输入矩阵上进行从左到右,从上到下滑动,然后每一次滑动,两个矩阵对应位置的元素相乘然后求和,就是右边那个矩阵的一个元素。
上面那张图片从左到右,每次滑动的时候只移动一格,但是其实它一次滑动多格,这就是步长
如上图所示,卷积后的矩阵只有3*3,比原来的图片要小了,因为边界没有了,所以要考虑这个边界的问题,网上说卷积的边界处理有两种方式:
一、丢掉边界,也就是就按右边那个缩小的矩阵来。
二、复制边界,也就是把左边的最外层原封不动地复制过去
但是在看matlab代码和tensorflow代码的时候发现并不是那么简单的事情。
matlab中conv2这个“padding”参数可以设为三个值FULL,SAME,VALID
tensorflow中conv2d的"padding"参数可以设为两个值SAME,VALID
它们对边界是这样处理的,对输入的矩阵,包裹n层0,然后再按照上面所说的卷积方法进行卷积,这个n怎么求呢,
FULL:edge_row = kernel_row - 1; edge_cols = kernel_cols - 1;
SAME:edge_row = (kernel_row - 1) / 2;edge_cols = (kernel_cols - 1) / 2;
VALID:edge_row = edge_cols = 0;
edge_row就是边的行数,kernel_row就是卷积核的行数,所以上面讲的其实就是VALID模式
右下角就是卷积的数学公式,矩阵的对应元素相乘求和,然后加上一个偏置值
池化分为两种,一种是最大池化,在选中区域中找最大的值作为抽样后的值,另一种是平均值池化,把选中的区域中的平均值作为抽样后的值,这样做的,原因是为了后面全连接的时候减少连接数
左边的是没有没有进行卷积的全连接,假设图片是1000*1000的,然后用1M的神经元去感知,最后需要10^12个权值作为参数,右边是经过卷积过的,每个圆点是一个神经元,因此只是用一个卷积核的话,其实只要100*10^6,数量级就大大减少,而且因为提取的就是所需的特征,所以在加快训练速度的时候对结果并不会产生过大的影响,甚至更为精确。
可能很多人会问,那个卷积核是怎么得出来的呢,其实它是被各种训练集训练出来的,利用梯度下降法使得我们的参数到达最优解。
梯度下降法可以这样子理解,假设我们正在下山,要使得下山的路径达到最短,于是我们每走一步之前就判断一下四面八方从哪个方向跨出这一步会最短,不过学过算法的人应该都知道,有个问题就是,我们当前走的这一步是当前位置最短的,但是真正从山上到山下最短路径可能并不路过这一步。也就是说这是个局部最优解,而不是全局最优解,我们得到的路径并不一定是最短的,但是也足够优秀,原因就是,得到最优解费时费力,性价比并不高。这一个知识点还是建议大家伙去看一下斯坦福Andrew Ng的《机器学习》,然后就能理解上面所说的权值参数要少的意义了。
softmax是分类用的,说直白一点就是归一化,因为这个店最好跟例子结合起来,所以暂时不多说,感兴趣的可以去网上找,也可以关注后面的系列文章。
三、总结
其实感觉讲的并不深入,因此还是希望各位能自己去仔细钻研一下,这里给各位一些基础吧,读起论文和数学公式来会更轻松一些。
四、参考文章
神经网络介绍
http://ufldl.stanford.edu/wiki/index.php/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C
技术向:一文读懂卷积神经网络CNN
http://www.cnblogs.com/nsnow/p/4562308.html
深度学习(卷积神经网络)一些问题总结
http://blog.csdn.net/nan355655600/article/details/17690029
卷积神经网络(CNN)
http://ibillxia.github.io/blog/2013/04/06/Convolutional-Neural-Networks/
Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
http://www.cnblogs.com/nsnow/p/4562363.html
数据挖掘系列(10)——卷积神经网络算法的一个实现(转)
http://blog.sina.com.cn/s/blog_4ff49c7e0102vl5m.html
Matlab/DeepLearnToolbox
https://github.com/rasmusbergpalm/DeepLearnToolbox
Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现
http://blog.csdn.net/zouxy09/article/details/9993371
Deep Learning论文笔记之(五)CNN卷积神经网络代码理解
http://blog.csdn.net/zouxy09/article/details/9993743
斯坦福 池化
http://ufldl.stanford.edu/wiki/index.php/%E6%B1%A0%E5%8C%96
CNN神经网络层次分析
http://blog.csdn.net/liulina603/article/details/44915905
深度学习笔记1(卷积神经网络)
http://blog.csdn.net/lu597203933/article/details/46575779
CNN公式推导
http://blog.csdn.net/lu597203933/article/details/46575871
前向型神经网络之BPNN(附源码)
http://blog.csdn.net/heyongluoyao8/article/details/48213345
残差与误差的区别
http://wenku.baidu.com/link?url=DUDkyV1tnD_SEGzgcxb9AaFU5VUcP9ISNR8q39-fpCcq_LGUHY7ucx5vDwr-MCfU_ofr7yIQZ_UgTfiivTtaDOulW2DD3pGs07eYmiQv5P7
反向传导算法
http://deeplearning.stanford.edu/wiki/index.php/%E5%8F%8D%E5%90%91%E4%BC%A0%E5%AF%BC%E7%AE%97%E6%B3%95
图像卷积与滤波的一些知识点
http://blog.csdn.net/zouxy09/article/details/49080029
CNN卷积神经网络原理简介+代码详解
http://doc.okbase.net/u012162613/archive/126058.html
卷积神经网络(lenet)
http://deeplearning.net/tutorial/lenet.html
激活函数的作用
https://www.zhihu.com/question/22334626
神经网络入门第一部分
http://blog.sina.com.cn/s/blog_6a67b5c50100tspb.html
神经网络入门第二部分
http://blog.sina.com.cn/s/blog_6a67b5c50100tspe.html
卷积神经网络全面解析
http://www.moonshile.com/post/juan-ji-shen-jing-wang-luo-quan-mian-jie-xi
Deep learning:四十一(Dropout简单理解)
http://www.cnblogs.com/tornadomeet/p/3258122.html
DeepLearning (六) 学习笔记整理:神经网络以及卷积神经网络
http://www.07net01.com/2015/11/963741.html
深度卷积网络CNN与图像语义分割
http://blog.csdn.net/xiahouzuoxin/article/details/47789361
MATLAB conv2卷积的实现
http://blog.csdn.net/celerychen2009/article/details/38852105