零基础用TensorFlow玩转Kaggle的“手写识别”

Posted 爱数据原统计网

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了零基础用TensorFlow玩转Kaggle的“手写识别”相关的知识,希望对你有一定的参考价值。

 这是一个TensorFlow的系列文章,本文是第二篇,在这个系列中,你讲了解到机器学习的一些基本概念、TensorFlow的使用,并能实际完成手写数字识别、图像分类、风格迁移等实战项目。


文章将尽量用平实的语言描述、少用公式、多用代码截图,总之这将是一份很赞的入门指南。欢迎分享/关注。


今天将用TensorFlow实现一个手写数字识别功能,来展示TensorFlow如何用神经网络实现对图片的识别。google也为入门者提供了一个这样的例子,也就是TensorFlow里的“hello world”,这个例子的名字叫“MNIST”。


官方已经有了相应的文档,这里不是简单的翻译,而是以更通俗的语言来解释,为了让没有基础的同学也能看得懂,特别用简单的表述解释了一些专业名词,希望能有更多的人能接触到深度学习这个领域。


如果想看中文版本:MNIST机器学习入门,可以点下面的链接进行查看

http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html


如果是简单重复这个例子,就没什么意思了。正好“手写识别”在Kaggle上也有竞赛,我们使用Kaggle的数据进行识别和测试,这样和Google官方的例子虽然差不多,但又有不同。


手写图片识别的实现,分为三步:

一、数据的准备

二、模型的设计

三、代码实现


一、数据的准备    




Kaggle的数据都是表格形式的,和MNIST给的图片不一样。但实际上只是对图片的信息进行了处理,把一个28*28的图片信息,变成了28*28=784的一行数据。


为了便于理解,我们先来看MNIST的图片信息:

它每份的图片都是被规范处理过的,是一张被放在中间部位的灰度图。


零基础用TensorFlow玩转Kaggle的“手写识别”

MNIST的图片集


类似这样的,每一个图片均为28×28像素,我们可以将其理解为一个二维数组的结构:


零基础用TensorFlow玩转Kaggle的“手写识别”

MNIST的图片解释


28*28 = 784,也就是说,这个二维数组可以转为一个784个数字组成的一维数组。


扁平化会丢失图片的二维结构信息,好的图形结构算法都会利用二维结构信息,但是为了简化过程便于理解,这里先使用这种一维结构来进行分析。


这样,上面的训练数据和测试数据,都可以分别转化为[42000,769]和[28000,768]的数组。


为什么训练数据会多一列呢?因为有一列存的是这个图片的结果。好我们继续来看图片:


零基础用TensorFlow玩转Kaggle的“手写识别”

Kaggle训练集的截图


这个图片上我们可以看出来,第一列是存的结果,后面784列存的是图片的像素信息,到这里,数据就准备好了。


下面我们进行模型的设计。


二、模型的设计    


不想看理论的可以跳过这一步,直接进入代码环节


这个模型,组成是这样的:


1)使用一个最简单的单层的神经网络进行学习

2)用SoftMax来做为激活函数

3)用交叉熵来做损失函数

4)用梯度下降来做优化方式


这里有几个新的名词,神经网络、激活函数、SoftMax、损失函数、交叉熵、梯度下降,我们挨个解释一下。


神经网络:由很多个神经元组成,每个神经元接收很多个输入:[X1,X2....Xn],加权相加然后加上偏移量后,看是不是超过了某个阀值,超过了发出1,没超过发出0。


零基础用TensorFlow玩转Kaggle的“手写识别”

单个神经元


由很多个神经元互相连接,形成了神经网络。


零基础用TensorFlow玩转Kaggle的“手写识别”

神经网络


激活函数:每个神经元,在通过一系列计算后,得到了一个数值,怎么来判断应该输出什么呢?激活函数就是解决这个问题,你把值给我,我来判断怎么输出。所以一个神经网络,激活函数是非常重要的。


想要成为激活函数,你得有两把刷子啊。这两把刷子是:一是你得处处可微,可微分才能求导,求极值。二是要非线性的,因为线性模型的表达能力不够。


线性的模型是这样的:

零基础用TensorFlow玩转Kaggle的“手写识别”

非线性的模型是这样的:

零基础用TensorFlow玩转Kaggle的“手写识别”

目前主流的几个激活函数是: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%。


这个看起来比max(A,B)这样粗暴的方式柔和一些,所以叫SoftMax(名字解释纯属个人瞎掰

以上是关于零基础用TensorFlow玩转Kaggle的“手写识别”的主要内容,如果未能解决你的问题,请参考以下文章

掌握这10款可视化图表,零基础也能玩转数据分析

《Python机器学习及实践:从零开始通往Kaggle竞赛之路》

零基础玩转 Serverless

Python机器学习及实践+从零开始通往Kaggle竞赛之路

PYTHON机器学习及实践 从零开始通往KAGGLE竞赛之路pdf

不会做报表?零基础零代码带你玩转高质量报表