走进Tensorflow(一):从Mnist数据集开始

Tensorflow 是 Google 的一个开源机器学习学习框架,基于 数据流图 进行计算,里面包含了一些封装好的算法,例如 SGD(随机梯度下降)、CNNRNN 等,用起来还是很方便的。走进Tensorflow系列文章计划从Mnist数据集开始,逐步入门 Tensorflow 。由于我也是刚刚接触 Tensorflow,文章里有什么不正确的地方,希望大家能多多指正。

Mnist 数据集

Mnist 是一个手写数字图片的数据库,里面包含了 60000 张训练数据集10000 张测试数据集,数据集里有图片和对应的 label(标签),并且所有手写数字图片都是 28x28 尺寸的灰度图,Mnist 包含下面四部分:

train-images-idx3-ubyte.gz : training set images (9912422 bytes)
train-labels-idx1-ubyte.gz : training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

手写字体长这个样子


mnist.png

点击Mnist数据集下载就可以进入Mnist数据集网站下载,如果下载有困难的话可以私信我。
但是你下载下来的这四个压缩包并不是这种图片,而是描述图像的二进制数据,有关 Mnist 数据集的解析,这里不做重点,下面会用 Tensorflow 提供的函数进行解析。


Tensorflow 解析 Mnist 数据集

Tensorflow 的安装就不多说了,这个是官方的安装教程。
安装完成后,导入 Tensorflow 的 「python」包(当然,官方还提供了其他编程语言的API),像下面这样:

导入tensorflow.png

就说明 Tensorflow 安装成功了,下面开始解析 Mnist 数据集

from tensorflow.examples.tutorials.mnist import input_data
file = "/data_public/mnist/" #你存放 Mnist 数据集的路径
mnist = input_data.read_data_sets(file, one_hot=True)

解析后分为两部分, mnist.trainmnist.test,分别代表训练集测试集

利用 Tensorflow 识别 Mnist 中的手写字

首先用比较简单的训练模型 Softmax 回归,关于 Softmax 回归的知识,以后会单独拿出来细讲,这里只做简单说明。一张手写字图片代表的数字有 0~9 十种可能性,Softmax 回归可以推测出该手写字图片分别为 0~9 的可能性,即一张为 6 的手写字图片,经 Softmax 推测后后,得到改图片中数字为 6 的概率为 80% ,为 5 的概率为10%,为其他数字的概率为更小的值。
Tensorflow中提供了 Softmax 回归的函数,下面开始构建 Tensorflow 的计算图。
首先导入 Tensorflow 模块。

import tensorflow as tf

然后设置一个 占位符 用来输入图像 x .

x = tf.placeholder(tf.float32,shape=[None,784],name='x')

这里输入数据的 shape 为什么是[None,784],None 代表数据的第一维,即列所在维度可以是任意长度,784 代表一张 28x28 的图片铺展为一行,去除了维度方面的信息。
同理,还需要设置一个 占位符 用来输入图像的标签(label).

y_  = tf.placeholder(tf.float32,shape=[None,10],name='y_')

前面说过,每张手写体图片的代表的数字有 10 种可能性,所以 y_ 的 shape 为[None,10]
除了这些输入数据,还需要设置模型的权重 w 和偏置 b 。对于这两个可变的参数,就不用占位符来设置了,而是用 tf.Variable 来表示它们。

w = tf.Variable(tf.zeros[784,10])
b = tf.Variable(tf.zeros[10])

可能有人会问,为什么 w 的 shape 是[784,10] ,因为每张手写体图片的代表的数字有 10 种可能性,每张 28x28 的图片被铺展为一行 784 个像素,将 w 的shape设置为 [784,10] ,目的是计算出每张图片在每种可能性上表现出来的证据值。
下面直接使用 Softmax 函数。

y = tf.nn.softmax(tf.matmul(w,x) + b)

tf.matmul(w,x) 代表的是 w 和 x 做矩阵乘。
这样,我们就定义好了我们的模型,但是还缺一个损失函数,模型训练就是通过最小化损失函数来求模型的权重 w 和偏置 b 的。这里用的是交叉熵(cross-entropy)损失函数,函数形式如下。

cross-entropy.png

yi 是预测的概率分布, y' 是实际的概率分布。

cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

为了最小化损失函数,需要用到反向传播 思想,这里用的是 SGD (随机梯度下降)算法来最小化损失函数。

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

这里的 0.01 指的是学习率。
这样,我们的计算图就构建好了,下面开始运行我们的计算图。首先初始化一下变量。

init = tf.initialize_all_variables()

然后在一个 Session 里运行。

sess = tf.Session()
sess.run(init)

接着往计算图里送数据。

for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

mini_batch 为 100 ,即每次往里送 100 张图片,一共送 1000 次结束。
为了评估我们的模型,需要计算出模型的准确率。

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print (sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

tf.argmax(y,1) 是返回第二维(行方向)上最大值的索引,tf.equal() 是比较两个值是否相等,返回一个 bool 值(True or False),tf.cast() 是将bool 值转换为 1.0 or 0.0 的浮点类型,tf.reduce_mean() 是计算平均值。
到此为止,实现了一个简单的 Tensorflow 识别手写字模型的训练。下一节,用 CNN 实现手写字的识别。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容