版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_34233802/article/details/69388510
主要是为了讨论图像验证,利用最简单的训练代码。官方示例对验证过程只有简单的准确率输出,不直观。
为此,对单一图片进行验证
训练代码:
"""
Created on Tue Mar 28 11:42:38 2017
https://www.tensorflow.org/get_started/mnist/beginners
@author: chuc
"""
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
x = tf.placeholder(tf.float32, [None, 784]) #占位符
W = tf.Variable(tf.zeros([784, 10])) #生成784*10位数组
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
for _ in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
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))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
#其他博客有详细的解释说明
spyder运行上述代码后(运行环境anaconda2.4.1-py3.5.1)
验证数据
batch_x, batch_y = mnist.test.next_batch(1) #取一组训练数据
#batch_x 为(1,784)数组(保存图像信息) batch_y 为(1,10)(保存图像标签,第几位数是1,就表示几)
print(sess.run(accuracy, feed_dict={x: batch_x, y_: batch_y})) #验证训练数据的准确性
im = np.reshape(batch_x,(28,28)) #将一维数组转化为28*28的图像数组 float32 (0-1)
#此时通过观察数组中数字部分,能大致的看出图像表示的数字
#为了直观的看到,可以将数组转化为图像
from PIL import Image
imag=Image.fromarray(np.uint8(im*255)) #这里读入的数组是 float32 型的,范围是 0-1,而 PIL.Image 数据是 uinit8 型的,范围是0-255,要进行转换
imag.show()
imag.save('E:/phto/7.png')
运行结果如图:
保存的为黑底白字,数据集说明为白底黑字,测试自己的图片时看着改改。
如果想测试自己的图片,可以:
imm =np.array(Image.open("E:/phto/t7.png").convert('L')) #打开图片,转化为灰度并转化为数组size(n,m) 值0-255
imm = imm/255 #将值转化为0-1
imm_3 = Image.fromarray(imm) #转化为图像
imm_4 = imm_3.resize([28,28]) #压缩
im_array = np.array(imm_4) #转化为数组
fs = im_array.reshape((1,784)) #转化为符合验证一维的数组
print(sess.run(tf.argmax(y,1), feed_dict={x: fs, y_: batch_y})) #输出模型的识别值
#或者
imm =np.array(Image.open("E:/phto/t7.png").convert('L').resize([28,28]))
imm = 255-imm #imm、255 反向处理
imm = imm/255
#imm = -imm+1 #自己测试图片效果太差,示例的数组无字处为0(黑底白字)。可以通过自定义函数转化自己的数组,这里利用的是最简单的 函数
imm = imm.reshape((1,784))
print(sess.run(tf.argmax(y,1), feed_dict={x: imm})) #tf.argmax 算出模型值