欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TensorFlow手写数字识别(一)

程序员文章站 2024-01-22 11:15:46
...

数据集下载链接

数据集下载好之后解压,得到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)
  • 手写数字识别模型数据流图
    TensorFlow手写数字识别(一)
  • 持续更新中 (o.o)