基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型

一、卷积神经网络模型知识要点卷积卷积

1、卷积

2、池化

3、全连接

4、梯度下降法

5、softmax

本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主要就是给大家做个铺垫,如有错误请指正,相互学习共同进步。

二、卷积神经网络讲解

2.1卷积神经网络作用

大家应该知道大名鼎鼎的傅里叶变换,即一个波形,可以有不同的正弦函数和余弦函数进行叠加完成,卷积神经网络也是一样,可以认为一张图片是由各种不同特征的图片叠加而成的,所以它的作用是用来提取特定的特征,举个例子,比如给定一张图片,然后我只想提取它的轮廓,于是就需要卷积神经网络。

2.2卷积神经网络模型

如图是大名鼎鼎的LeNet-5(识别数字的卷积网络),效果和论文在此,这里拿出来只是为了说明一下卷积神经网络的模型,就像图中那样,经过多次,卷积,池化(又叫子采样),然后全连接,就完工了。

2.3 卷积

2.3.1 卷积的原理

其实卷积很好理解,左侧绿色的部分的5*5矩阵其实一般就是我们输入的图片的灰度值(可以想象成
一张5px*5px的黑白照片,然后把黑白照片上的每一个点转化成矩阵上的每一个元素),然后上面的黄色部分矩
阵就是我们的过滤器,用来提取特征,(其实应该叫滤波器或者卷积核),让卷积核在输入矩阵上进行从左到右
,从上到下滑动,然后每一次滑动,两个矩阵对应位置的元素相乘然后求和,就是右边那个矩阵的一个元素。

2.3.2 滑动的步长-stride

上面那张图片从左到右,每次滑动的时候只移动一格,但是其实它一次滑动多格,这就是步长

2.3.3 卷积的边界处理-padding

如上图所示,卷积后的矩阵只有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模式

2.3.4 卷积与神经网络

右下角就是卷积的数学公式,矩阵的对应元素相乘求和,然后加上一个偏置值

2.4 池化

池化分为两种,一种是最大池化,在选中区域中找最大的值作为抽样后的值,另一种是平均值池化,把选中的区域中的平均值作为抽样后的值,这样做的,原因是为了后面全连接的时候减少连接数

2.5 全连接

左边的是没有没有进行卷积的全连接,假设图片是1000*1000的,然后用1M的神经元去感知,最后需要10^12个权值作为参数,右边是经过卷积过的,每个圆点是一个神经元,因此只是用一个卷积核的话,其实只要100*10^6,数量级就大大减少,而且因为提取的就是所需的特征,所以在加快训练速度的时候对结果并不会产生过大的影响,甚至更为精确。

2.6 梯度下降法

可能很多人会问,那个卷积核是怎么得出来的呢,其实它是被各种训练集训练出来的,利用梯度下降法使得我们的参数到达最优解。

梯度下降法可以这样子理解,假设我们正在下山,要使得下山的路径达到最短,于是我们每走一步之前就判断一下四面八方从哪个方向跨出这一步会最短,不过学过算法的人应该都知道,有个问题就是,我们当前走的这一步是当前位置最短的,但是真正从山上到山下最短路径可能并不路过这一步。也就是说这是个局部最优解,而不是全局最优解,我们得到的路径并不一定是最短的,但是也足够优秀,原因就是,得到最优解费时费力,性价比并不高。这一个知识点还是建议大家伙去看一下斯坦福Andrew Ng的《机器学习》,然后就能理解上面所说的权值参数要少的意义了。

2.7最后 softmax

softmax是分类用的,说直白一点就是归一化,因为这个店最好跟例子结合起来,所以暂时不多说,感兴趣的可以去网上找,也可以关注后面的系列文章。

三、总结

其实感觉讲的并不深入,因此还是希望各位能自己去仔细钻研一下,这里给各位一些基础吧,读起论文和数学公式来会更轻松一些。

四、参考

<span style="font-family:Microsoft YaHei;">神经网络介绍
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
</span>

时间: 2024-11-10 08:37:40

基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型的相关文章

基于tensorflow的MNIST手写识别

这个例子,是学习tensorflow的人员通常会用到的,也是基本的学习曲线中的一环.我也是! 这个例子很简单,这里,就是简单的说下,不同的tensorflow版本,相关的接口函数,可能会有不一样哟.在TensorFlow的中文介绍文档中的内容,有些可能与你使用的tensorflow的版本不一致了,我这里用到的tensorflow的版本就有这个问题. 另外,还给大家说下,例子中的MNIST所用到的资源图片,在原始的官网上,估计很多人都下载不到了.我也提供一下下载地址. 我的tensorflow的版

基于PyTorch实现MNIST手写字识别

本篇不涉及模型原理,只是分享下代码.想要了解模型原理的可以去看网上很多大牛的博客. 目前代码实现了CNN和LSTM两个网络,整个代码分为四部分: Config:项目中涉及的参数: CNN:卷积神经网络结构: LSTM:长短期记忆网络结构: TrainProcess: 模型训练及评估,参数model控制训练何种模型(CNN or LSTM). 完整代码 -Talk is cheap, show me the code. # -*- coding: utf-8 -*- # @author: Awes

使用逻辑回归进行mnist手写字识别

1.引言 逻辑回归(LR)在分类问题中的应用十分广泛,它是一个基于概率的线性分类器,通过建立一个简单的输入层和输出层,即可实现对输入数据的有效分类.而该网络结构的主要参数只有两个,分别是权重和偏置,本文定义损耗函数为负对数,然后通过随机梯度下降算法(SGD)来对参数进行更新,并定义误差函数来衡量训练的阶段. 2.具体训练过程 在第3部分将会给出本文的完整python代码,其中用到的文件mnist.pkl.gz可以去网上下载,放到与python文件同一目录下面即可. 首先,定义一个基于object

tensorflow笔记(四)之MNIST手写识别系列一

tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html 前言 这篇博客将利用神经网络去训练MNIST数据集,通过学习到的模型去分类手写数字. 我会将本篇博客的jupyter notebook放在最后,方便你下载在线调试!推荐结合官方的tensorflow教程来看这个notebook! 1. MNIST数据集的导入 这里介绍一下MNIST,MNIST是在

TensorFlow 入门之手写识别(MNIST) softmax算法

TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST 卢富毓 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算法 我们知道MNIST的每一张图片都表示一个数字,从0到9.我们希望得到给定图片代表每个数字的概率.比如说,我们的模型可能推测一张包含9的图片代表数字9的概率是80%但是判断它是8的概率是5%(因为8和9都有上半部分的小圆),然后给予它代表其他数字的概率更小的值. 这是一个使用softmax回归(sof

Tensorflow编程基础之Mnist手写识别实验+关于cross_entropy的理解

好久没有静下心来写点东西了,最近好像又回到了高中时候的状态,休息不好,无法全心学习,恶性循环,现在终于调整的好一点了,听着纯音乐突然非常伤感,那些曾经快乐的大学时光啊,突然又慢慢的一下子出现在了眼前,不知道我大学的那些小伙伴们现在都怎么样了,考研的刚刚希望他考上,实习的菜头希望他早日脱离苦海,小瑞哥希望他早日出成果,范爷熊健研究生一定要过的开心啊!天哥也哥早日结婚领证!那些回不去的曾经的快乐的时光,你们都还好吗! 最近开始接触Tensorflow,可能是论文里用的是这个框架吧,其实我还是觉得py

win10下通过Anaconda安装TensorFlow-GPU1.3版本,并配置pycharm运行Mnist手写识别程序

折腾了一天半终于装好了win10下的TensorFlow-GPU版,在这里做个记录. 准备安装包: visual studio 2015: Anaconda3-4.2.0-Windows-x86_64: pycharm-community: CUDA:cuda_8.0.61_win10:下载时选择 exe(local) CUDA补丁:cuda_8.0.61.2_windows: cuDNN:cudnn-8.0-windows10-x64-v6.0;如果你安装的TensorFlow版本和我一样1.

Haskell手撸Softmax回归实现MNIST手写识别

Haskell手撸Softmax回归实现MNIST手写识别 前言 初学Haskell,看的书是Learn You a Haskell for Great Good, 才刚看到Making Our Own Types and Typeclasses这一章. 为了加深对Haskell的理解,便动手写了个Softmax回归.纯粹造轮子,只用了base. 显示图片虽然用了OpenGL,但是本文不会提到关于OpenGL的内容.虽说是造轮子, 但是这轮子造得还是使我受益匪浅.Softmax回归方面的内容参考

我的第一个svm程序:手写字识别

之前学过svm相关知识,基本原理不算复杂,今天做了一个手写字识别程序,总算验证了svm的效果. 因为只是验证效果,实现上原则是简单,使用python + libsvm + PIL(python image library).这部分工作花了一些时间: PIL: http://www.pythonware.com/products/pil/ 下载源码包,解压之后运行:python setup.py install即可. max下python libsvm安装使用:http://blog.csdn.n