人工智能-深度学习(3)TensorFlow 实战一:手写图片识别
http://gitbook.cn/gitchat/column/59f7e38160c9361563ebea95/topic/59f7e86d60c9361563ebeee5
wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html
一、简介
手写图片识别的实现,分为三步:
- 1,数据的准备
- 2,模型的设计
- 3,代码实现
我的另一篇博文-神经网络的解释
什么是神经网络
input层代表将二维数组从所有行都排列成一行,hidden层代表若干次处理,output层存储计算得到的结果,最后输出概率最大的
知乎神经网络的解释
总结一下:
神经元就是分类器,可以根据正确的值进行调整反向传播训练神经网络
1.神经网络深入浅出
!!!!!!!!!!!!!!!!!认真看两遍,保证你神清气爽。看懂了后,回来点个赞,就当你的答谢了。这个博客下的另一篇文章也写的不错
2.从机器学习谈起 推荐 不错,不过,我推的都只是适合初学者哦,大神们绕道走开
3.还有一篇关于SVM的,虽然有点跑题了,但是也觉得特别好。SVM讲解
虽然第三个链接有点跑题,但是讲真,学AI怎能不学SVM,这是我在一次双语课上做pre,查资料用到的最多的一个blog了。认真看两遍,基本可以自己跑代码了。还是不会的,欢迎私信我,一起进步。哈哈哈哈哈
开心,我以为会没人看,一晚上醒来赞变多了,也算是肯定了。学神经网络的人儿们好好努力哦,好了,大早上的,我也继续看书了。作者:知乎用户 链接:https://www.zhihu.com/question/22553761/answer/267280164
来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、数据的准备
Kaggle 里包含了42000份训练数据和28000份测试数据(和谷歌准备的 MNIST 数据,在数量上有所不同)。训练和测试数据的下载地址可以百度也可以点这里。下载下来是两个CVS文件。
三、模型设计
这个模型,组成是这样的:
- 使用一个最简单的单层的神经网络进行学习
- 用 SoftMax 来做为激活函数
- 用交叉熵来做损失函数
- 用梯度下降来做优化方式
神经网络:由很多个神经元组成,每个神经元接收很多个输入:[X1,X2….Xn],加权相加然后加上偏移量后,看是不是超过了某个阀值,超过了发出1,没超过发出0。
神经网络:由很多个神经元组成,每个神经元接收很多个输入:[X1,X2….Xn],加权相加然后加上偏移量后,看是不是超过了某个阀值,超过了发出1,没超过发出0。
想要成为激活函数,你得有两把刷子啊。这两把刷子是:一是你得处处可微,可微分才能求导,求极值。二是要非线性的,因为线性模型的表达能力不够。
目前主流的几个激活函数是:sigmoid,tanh,ReLU。
sigmoid:采用 S 形函数,取值范围[0,1] tanh:双切正切函数,取值范围[-1,1]
ReLU:简单而粗暴,大于0的留下,否则一律为0。
SoftMax:我们知道 max(A,B),是指 A 和 B 里哪个大就取哪个值,但我们有时候希望比较小的那个也有一定概率取到,怎么办呢?我们就按照两个值的大小,计算出概率,按照这个概率来取 A 或者 B。比如A=9,B=1,那取 A 的概率是90%,取B的概率是10%。
损失函数:损失函数是模型对数据拟合程度的反映,拟合得越好损失应该越小,拟合越差损失应该越大,然后我们根据损失函数的结果对模型进行调整。
交叉熵:这个概念要解释的简单,那就不准确,如果要准确,那可能一千字都打不住。这里说一个简单但不一定准确的解释吧。
比如,你想把乾坤大挪移练到第七层大圆满,你现在是第五层,那你还差两层,这个两层就是你和大圆满之间的距离。交叉熵通俗的讲就是现在的训练程度和圆满之间的距离,我们希望距离越小越好,所以交叉熵可以作为一个损失函数,来衡量和目标之间的距离。
梯度下降:这个概念可以这样理解,我们要解决的问题是一座山,答案在山底,我们从山顶到山底的过程就是解决问题的过程。
在山顶,想找到最快的下山的路。这个时候,我们的做法是什么呢?在每次选择道路的时候,选最陡的那条路。梯度是改变率或者斜度的另一个称呼,用数学的语言解释是导数。对于求损失函数最小值这样的问题,朝着梯度下降的方向走,就能找到最优值了。
四、代码实现
1,载入数据,并对数据进行处理
在写代码的过程中,数据的预处理是最大的一块工作,做一个项目,60%以上的代码在做数据预处理。 这个项目的预处理,分为5步:
- 把输入和结果分开
- 对输入进行处理:把一维的输入变成28*28的矩阵
- 对结果进行处理:把结果进行 One-Hot 编码
- 把训练数据划分训练集和验证集
- 对训练集进行分批