Tensorflow #1 祖传例子 MNIST 手写识别

本文介绍了如何使用Tensorflow进行MNIST手写数字识别的入门教程,包括Tensorflow的安装、MNIST数据集的获取及Softmax回归的概念。通过Softmax回归模型,对每个输入计算其属于0-9各个数字的概率并选择最大概率的数字作为预测结果,期望识别准确率在92%左右。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 前语

最近想学习DL,但是发现没有什么好的入门的东西,最近方向一直比较迷茫,东做做西做做,现在又来这里做Tensorflow了。

关于Tensorflow 1.0是如何安装的,可以直接参照他的官方文档,我是装在了Ubuntu 14.04 64bit上的,之前在12的版本上死活装不上,这点留给大家参考,万一你的也装不上。14.04则可以完全按照官方的说明安装。

Tensorflow目前不能直接在Windows上跑,所以先找个对应的系统吧。
安装首先安装依赖:

# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev

# Mac OS X
$ sudo easy_install pip
$ sudo easy_install --upgrade six

然后从下面的版本中选择一个安装,只用选择一个就可以,比如我选择的是第一个,只用CPU,Python2.7,看自己情况了

# Ubuntu/Linux 64-bit, CPU only, Python 2.7
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp27-none-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7
# Requires CUDA toolkit 7.5 and CuDNN v5. For other versions, see "Install from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0-cp27-none-linux_x86_64.whl

# Mac OS X, CPU only, Python 2.7:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py2-none-any.whl

# Mac OS X, GPU enabled, Python 2.7:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow-0.10.0-py2-none-any.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.4
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.4
# Requires CUDA toolkit 7.5 and CuDNN v5. For other versions, see "Install from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.5
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp35-cp35m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 7.5 and CuDNN v5. For other versions, see "Install from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0-cp35-cp35m-linux_x86_64.whl

# Mac OS X, CPU only, Python 3.4 or 3.5:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py3-none-any.whl

# Mac OS X, GPU enabled, Python 3.4 or 3.5:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow-0.10.0-py3

选好版本后,根据你选择的Python版本,使用对应的PIP进行安装,这个可能要翻墙,或者改HOST,请自己动手解决,或者微博私信我给你HOST,这样就可以直接下载

# Python 2
$ sudo pip install --upgrade $TF_BINARY_URL

# Python 3
$ sudo pip3 install --upgrade $TF_BINARY_URL

这样基本就安装完了,没什么问题就打开python,试下导入可以

import tensorflow

要是有问题就去看他的官方文档吧

任务描述

这里写图片描述
MNIST这个Demo感觉已经是遍地都是了,在这里也是,就是最简单的手写数字识别,输入理论上是一个写了数字的图像作为测试数据,这里测试数据转化成的文本矩阵了(28*28=784 维),我们可以通过在python环境中运行如下代码自动获取数据,代码执行完会在对应的文件夹保存好数据,如果需要可以自定义地址:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

MNIST的数据集,共有三部分:
55,000 points 训练集 (mnist.train), 10,000 points 测试集 (mnist.test), 5,000 验证集 (mnist.validation).

与之同时,由于其是一个有监督的学习任务,所以还有对应的标签(也就是图像对应的真实数字),这部分位于(mnist.train.labels),标签也是以one-hot的方式表示,即这个向量共有10维,第I个位1就是证明这个Label是I

好了,那么我们任务很清楚了,就是尽可能的准确识别出正确的数字。

Softmax 回归

如果大家之前看过机器学习实战那本书,会发现那里的手写数字识别直接使用了KNN去做的,那边对于一个数字对应的向量,并没有考虑其权重,都是直接聚类的。

而在Softmax回归当中,他首先并不是聚类的,而是计算概率后选择概率最大的那个输出。即假设我们有0-9的输出,那么softmax在模型学习后,对于每一个输入,都会给出其是0-9中每一个数字的概率,且这个概率之和为0.

而我们要做的,就是从这里面找一个概率最大的作为结果输出。

这里写图片描述

其中Softmax首先会构建一个“证据”,如上图,即参考权重,即对应的位置下,相同Label取到1的情况,如果在某个位置,某个Label很容易是1(即有书写的),那么他的权重就是一个正值,如果是基本不会出现笔画的那么就是一个负值。
其实看上面的图就很清楚了,红色的对应负值,蓝色的代表正值。

这里写图片描述
假设用i代表第i个Label(数字),那么上面的公式既可以表示为,根据输入(x)而得到的第I个数字的证据是多大的。其中Wi是第I个Label的权重,j则表示对应维度的索引(如这里一共784),而bi则是对应的偏置。
这里写图片描述
而对应的输出y,我们使用softmax方程来表示,而softmax的具体信息如下
这里写图片描述
等效于
这里写图片描述

Action

我已经把需要做什么东西,为什么这么做放到了代码注释里了,大家对着看就可以了,理论上结果应该是92%附近。

# -*- coding:utf-8 -*-  
# Noted by: @MebiuW sina weibo
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#加载数据,如果不存在他会首先自动下载数据到指定的目录
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# X是一个Placeholder ,这个值后续再放入让TF计算,这里是一个784维,但是训练数量不确定的(用None表示)的浮点值
x = tf.placeholder(tf.float32, [None, 784])
# 设置对应的权值和偏置的表示,Variable代表一个变量,会随着程序的生命周期做一个改变
# 需要给一个初始的值,这里都全部表示为0
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
# 这里根据我们上面描述的,构件我们的模型,y是模型的输出,matmul是矩阵乘法,公式请参见之前的
y = tf.nn.softmax(tf.matmul(x, W) + b)
# 这里是保存真是的Label,同样是Placeholder,原理同X
y_ = tf.placeholder(tf.float32, [None, 10])
# 在机器学习的模型中,我们需要定义一个衡量模型好坏的方式,称为代价函数(Cost Loss),这里使用了交叉熵去衡量 reduce_sum 累加
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
#训练的步骤,告诉tf,用梯度下降法去优化,学习率是0.5,目的是最小化交叉熵
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
# 到目前为止,我们已经定义完了所有的步骤,下面就需要初始化这个训练步骤了,首先初始化所有变量(之前定义的变量)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
#运行步骤1000次
for i in range(1000):
  #载入数据
  batch_xs, batch_ys = mnist.train.next_batch(100)
  #执行步骤,但是需要填入placeholder的值
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
#进行模型的的衡量
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
#理论上应该是92%附近
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

参考

1、 官方安装文档(需要改HOST或翻墙):https://www.tensorflow.org/versions/r0.10/get_started/os_setup.html#download-and-setup

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值