TensorFlow手写数字识别(二)

  • 根据上一篇文章实现的代码的基础上,这篇文章将继续学习TensorFlow手写数字识别,这篇文章的目的是:把手写数字预测错误的图片输出,文件名“<序号>-<原本数字>-predict<预测数字>”
import tensorflow as tf
import input_data
import numpy as np
import cv2
#读取数据
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的矩阵,这只是理论上而已,但是实际运行时已经变成1*m的向量了
#并且corr_prediction是一个[True,False,True,.....]
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))



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

#下面对测试数据集进行预测,得到的result是一个1*m的张量,得到的predict是一个m*10的张量,下面的x是一个m*784的张量
result,predict = sess.run((correct_prediction,y), feed_dict = {x:mnist.test.images, y_:mnist.test.labels})

#对该张量进行遍历,由于result是一个张量,所以用shape来获取其形状,应为(m,)再取其[0]得到该张量的个数
for i in range(result.shape[0]):
	if(result[i]==False):
		img = mnist.test.images[i].reshape((28,28))
		#输入样本是灰度图像,范围是0~1,现在变成0~255的uint8类型才能正常显示,用255-是为了反色
		img = 255-img*255
		img = img.astype(np.uint8)
		cv2.imwrite("incorrect_image/%d-%d-predict%d.png" %(i, np.argmax(mnist.test.labels[i]), np.argmax(predict[i])),img)
  • 下面是输出结果图片

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值