Kaggle学习之路(三) —— Digit Recognizer之构建Tensorflow图

来源:互联网 发布:即时通讯软件源码 编辑:程序博客网 时间:2024/05/20 19:48
  • 阅读本篇的先决条件:前面有一步问题分析,这是第二步。第一步请看:http://blog.csdn.net/memoryjdch/article/details/75220498
  • 如果你不懂Tensorflow,请浏览本篇,你会知道大概的概念。
    如果你想深入了解Tensorflow,移步官方github库:
    https://github.com/tensorflow/tensorflow
    或者移步Tensorflow官方中文文档:
    http://wiki.jikexueyuan.com/project/tensorflow-zh/

-本篇主要说明Digit Recognizer的分析,代码我已经写了详细的注释,如果你感兴趣,请移步:https://github.com/Skyamz/Data_Recognizer


一、一些先验问题

什么是Tensorflow?

  Tensorflow可以理解为一个数据流的系统。前端构造一个Tensorflow图,后端在session中执行这个图的计算。图中不保存数据,这些数据都是流动的,可以任意传输的,Tensorflow只负责构建一个计算的框架,接收数据之后,计算结果并输出。这里的数据就可以理解为张量(Tensor)。即在Tensorflow中特有的数据。

为什么要选Tensorflow?

  我们的数据量很大,Tensorflow是分布式的,处理起来很快。Tensorflow根据前面通俗的原来来总结一句话,就是来寻找一种图的库(这种图就是判断某种关系),尤其在寻找图像特征的关系,非常准确。

Tensorflow具体怎么工作的?

  放一张官网上面一直挂着的图。这图里面没有卷积层和pooling层,所以只能叫做回归模型(卷积层和pooling层会在后面说明)。先来看看这个gif:


这里写图片描述

  每个节点就是一个操作,流动的黑色线条是传输的数据,即张量。我们可以大体总结一下工作的过程:

  • 首先从 input 开始, 一层一层的向上进行 Forward 计算。
  • 数据经过Relu层(这个Relu相当于一个激活函数,主要功能是排除负数)
  • 数据经过回归层
  • 当算到最后的cross entroy的时候, 开始进行梯度的计算。计算梯度时我们要构造权重矩阵W和偏移矢量bias。

  这里牵扯到一个Tensorflow的架构问题,由于和本次项目没有什么关系,这里不再赘述,如果你感兴趣,请移步:http://www.jianshu.com/p/a5574ebcdeab

数据到底怎么读取的?又怎么判断数据出了这个图,要开始计算了?

  这里要先引入一个名词:epochs。什么意思呢?我现在有40000行数据,我每把这些数据放到Tensorflow图里面完整地跑一遍,epochs就+1。也就是说它表示我把数据集完整计算的次数。
  我们这里把构造图和计算数据分开成了两个步骤,可以理解为这是两个线程。一般我们在进行数据计算时,先把数据读入内存队列里,负责计算的线程从内存队列里面取数据就ok。而现在引入了epochs,我们想把数据整体计算很多遍怎么办呢?


这里写图片描述

  tensorflow使用文件名队列+内存队列双队列的形式读入文件,很方便地管理了epochs。我们现在将100行数据放入文件名队列,50行为一个epochs,在第100行最后设置一个end(结束符)。内存队列从文件名队列中读入数据,每读50行,epochs+1,读到end时结束。

二、搭建CNN解决数字手写体识别问题

我们先来预览一下解决过程框架,然后再逐一解释每一步的含义:


这里写图片描述

卷积

卷积操作过程:
用3*3的卷积核去卷积6*6的矩阵流程:
这里写图片描述
这里我们用的是SAME方式。

池化

池化操作过程:
用3*3的矩阵去池化6*6的矩阵流程,选择9个数中最大的,这个操作称为max pooling:
这里写图片描述

建立紧密连接层

  经过第一二层的处理,图片大小由原来的28*28变成了7*7,且有64个特征值。这一步我们添加一个有1024个神经元的紧密连接层,每个神经元都连接到上一层的输出。

Dropout

  使用Dropout技术,主要是为了防止过拟合。dropout主要是减少有效参数的数量.Dropout在每个训练阶段从网络中删除一些节点。 每个节点或者以keep_prob概率保持在网络中,或者以概率1 - keep_prob丢弃。 在训练阶段结束之后,节点以其原始权重返回给NN。dropout一些通俗的解释请看:http://blog.csdn.net/stdcoutzyx/article/details/49022443

Softmax层

  添加softmax层。softmax模型可以用来给不同的对象分配概率。比如我们判断一张图片是9的概率为80%,判断为8的概率为5%,这个概率就是softmax分配的。

                          memoryjdch编辑于2017-07-20
原创粉丝点击