TensorFlow手写数字识别(一)

数据集下载链接

数据集下载好之后解压,得到4个压缩包,在工作文件夹中新建文件:MNIST_data,将上面得到的4个压缩包直接放在MNIST_data文件夹中即可。

  • 数据集安装和导入代码如下(input_data.py):
"""Functions for downloading and reading MNIST data."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

# pylint: disable=unused-import
import gzip
import os
import tempfile

import numpy
from six.moves import urllib
from six.moves import xrange  # pylint: disable=redefined-builtin
import tensorflow as tf
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
# pylint: enable=unused-import

  • 模型训练和预测代码(test.py
import tensorflow as tf
import input_data
#读取数据
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)
#创建可交互的操作单元
x = tf.placeholder("float",[None,784])
w = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

#实现回归模型,其中y是预测值,并且y是一个m*10的矩阵
y = tf.nn.softmax(tf.matmul(x,w) + b)

##训练模型
#为了计算交叉熵,首先添加一个新的占位符用于输入正确值,并且y_是一个m*10的矩阵
y_ = tf.placeholder("float",[None,10])

#使用公式  -Σy'log(y)  计算交叉熵
cross_entropy = -tf.reduce_sum(y_*tf.log(y))

#梯度下降
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

#上面已经把模型设置好了,在运行计算之前,下面先初始化创建的变量
init = tf.initialize_all_variables()

#现在我们可以在一个session里面启动模型,并且初始化向量
sess = tf.Session()
sess.run(init)

#下面开始训练模型,这里我们让模型循环1000次
#在循环的每个步骤中,都会随机抓取训练数据中的100个批处理数据点作为参数替换之前的占位符来运行train_step
for i in range(1000):
   #batch_xs是样本图片,batch_ys是样本的标签
   batch_xs, batch_ys = mnist.train.next_batch(100)
   sess.run(train_step, feed_dict = {x: batch_xs, y_: batch_ys})

#模型评估
#argmax(y,1)得到的是每个预测值所表示的one-hot向量中最大的数的下标
#首先找出预测正确的标签,argmax(y,1)是一个m*1的矩阵,argmax(y_,1)也是m*1的矩阵
#得到的correct_prediction也是一个m*1的矩阵
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

#为了确定正确预测项的比例,将上面得到的一组布尔值转换成浮点数,然后取平均值。
#例如:[True,False,True,True]会变成[1,0,1,1],取平均值后得到0.75
accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))

#print(sess.run(correct_prediction, feed_dict = {x:mnist.test.images, y_:mnist.test.labels}))

#最后计算所学习到的模型在测试数据集上的正确率
print (sess.run(accuracy, feed_dict = {x:mnist.test.images, y_:mnist.test.labels}))

  • 画出输入样本图片和其标签(draw.py)
import input_data
import cv2
import numpy as np
#读取数据
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)
NUM = 100
#batch_xs是样本图片,batch_ys是样本图片的标签
batch_xs, batch_ys = mnist.train.next_batch(NUM)
print(batch_xs.shape)
print(batch_xs.dtype)

#打印NUM个样本
for i in range(NUM):
	#输入样本是一个一维向量,现在变成二维28*28
	img = batch_xs[i].reshape((28,28))
	#输入样本是灰度图像,范围是0~1,现在变成0~255的uint8类型才能正常显示,用255-是为了反色
	img = 255-img*255
	img = img.astype(np.uint8)
	#print(img.dtype)
	#cv2.imshow("0",img)
	#cv2.waitKey(0)
	#保存输入图片在image文件夹中
	cv2.imwrite("image/%d-%s-%d.png" %(i,str(batch_ys[i]),np.argmax(batch_ys[i])),img)
  • 手写数字识别模型数据流图
    在这里插入图片描述
  • 持续更新中 (o.o)
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值