当前位置:   article > 正文

神经网络初识——MINIST手写数字识别(可视化输出结果)_mnist手写数字数据集模型训练可视化结果

mnist手写数字数据集模型训练可视化结果

手写数字识别是每个学习神经网络的人上手操作的必由之路,今天在前人肩膀上做了些小小的尝试。

话不多说,开始~

1.导入相关模块数据包(需提前配置tenseorflow模块)

在tenseorflow模块中内置了MNIST数据集,其中测试集包含60000条数据,验证集包含10000条数据。导入模块和数据集的操作如下(已经提前下载好数据集,并放在指定目录下):

  1. import tensorflow as tf
  2. import urllib
  3. from tensorflow.examples.tutorials.mnist import input_data
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. from PIL import Image, ImageFilter
  7. mnist = input_data.read_data_sets("MNIST_data/", one_hot = True)
  1. 输出结果:
  2. Extracting MNIST_data/train-images-idx3-ubyte.gz
  3. Extracting MNIST_data/train-labels-idx1-ubyte.gz
  4. Extracting MNIST_data/t10k-images-idx3-ubyte.gz
  5. Extracting MNIST_data/t10k-labels-idx1-ubyte.gz

2.模型的建立过程

  1. #建立BP神经网络模型
  2. num_classes = 10#数据类型0-9
  3. input_size = 784#28*28
  4. hidden_units_size = 30#层节点数
  5. batch_size = 100#
  6. training_iterations = 50000#迭代次数
  7. # 设置变量
  8. X = tf.placeholder (tf.float32, shape = [None, input_size])
  9. Y = tf.placeholder (tf.float32, shape = [None, num_classes])
  10. W1 = tf.Variable (tf.random_normal ([input_size, hidden_units_size],
  11. stddev = 0.1))#hidden_units_size = 30#正态分布随机数
  12. B1 = tf.Variable (tf.constant (0.1),
  13. [hidden_units_size])#常数为1,形状为(1,1)
  14. W2 = tf.Variable (tf.random_normal ([hidden_units_size,
  15. num_classes], stddev = 0.1))#正态分布随机数
  16. B2 = tf.Variable (tf.constant (0.1), [num_classes])
  17. # 搭建计算网络 使用 relu 函数作为激励函数 这个函数就是 y = max (0,x) 的一个类似线性函数 拟合程度还是不错的
  18. # 使用交叉熵损失函数 这是分类问题例如 : 神经网络 对率回归经常使用的一个损失函数
  19. #第1层神经网络
  20. hidden_opt = tf.matmul (X, W1) + B1#矩阵运算
  21. hidden_opt = tf.nn.relu (hidden_opt)#激活函数
  22. #第2层神经网络
  23. final_opt = tf.matmul (hidden_opt, W2) + B2#矩阵运算
  24. final_opt = tf.nn.relu (final_opt)#激活函数,最终的输出结果
  25. loss = tf.reduce_mean (
  26. tf.nn.softmax_cross_entropy_with_logits (labels = Y, logits = final_opt))#损失函数,交叉熵方法
  27. opt = tf.train.GradientDescentOptimizer (0.1).minimize (loss)
  28. init = tf.global_variables_initializer ()#全局变量初始化
  29. correct_prediction = tf.equal (tf.argmax (Y, 1), tf.argmax (final_opt, 1))
  30. accuracy = tf.reduce_mean (tf.cast (correct_prediction, 'float'))#将张量转化成float

3. 模型的训练以及预测结果

  1. # 进行计算 打印正确率
  2. sess = tf.Session ()#生成能进行TensorFlow计算的类
  3. sess.run (init)
  4. for i in range (training_iterations) :
  5. batch = mnist.train.next_batch (batch_size)#每次迭代选用的样本数100
  6. batch_input = batch[0]
  7. batch_labels = batch[1]
  8. training_loss = sess.run ([opt, loss], feed_dict = {X: batch_input, Y: batch_labels})
  9. if (i+1) % 10000 == 0 :
  10. train_accuracy = accuracy.eval (session = sess, feed_dict = {X: batch_input,Y: batch_labels})
  11. print ("step : %d, training accuracy = %g " % (i+1, train_accuracy))

输出结果为:

  1. step : 10000, training accuracy = 0.98
  2. step : 20000, training accuracy = 0.98
  3. step : 30000, training accuracy = 1
  4. step : 40000, training accuracy = 1
  5. step : 50000, training accuracy = 1

================================================================================================

下面开始搞事情~

4.预测结果的可视化展示:

  1. ###测试集输出结果可视化
  2. def res_Visual(n):
  3. #sess=tf.Session()
  4. #sess.run(tf.global_variables_initializer())
  5. final_opt_a=tf.argmax (final_opt, 1).eval(session=sess,feed_dict = {X: mnist.test.images,Y: mnist.test.labels})
  6. fig, ax = plt.subplots(nrows=int(n/5),ncols=5 )
  7. ax = ax.flatten()
  8. print('前{}张图片预测结果为:'.format(n))
  9. for i in range(n):
  10. print(final_opt_a[i],end=',')
  11. if int((i+1)%5) ==0:
  12. print('\t')
  13. #图片可视化展示
  14. img = mnist.test.images[i].reshape((28,28))#读取每行数据,格式为Ndarry
  15. ax[i].imshow(img, cmap='Greys', interpolation='nearest')#可视化
  16. print('测试集前{}张图片为:'.format(n))
  17. res_Visual(20)

输出结果:

  1. 前20张图片预测结果为:
  2. 7,2,1,0,4,
  3. 1,4,9,6,9,
  4. 0,6,9,0,1,
  5. 5,9,7,3,4,
  6. 测试集前20张图片为:

 我们可以看到,预测结果前20个结果和原本的标签符合的很好,说明模型训练的很好。那现在如果我想试一下自己手写的数字能不能被正确识别呢?于是我用写字板写了0~9共10个数字,让模型去识别,首先要将图片数值化。

5.手写数字的数值化操作

  1. #验证自己手写图片的识别效果
  2. #导入图片,二值化,并输出模型可识别的格式
  3. def image_to_number(n):
  4. from PIL import Image
  5. import numpy as np
  6. fig, ax = plt.subplots(nrows=int(n/5),ncols=5 )
  7. ax = ax.flatten()
  8. image_test = []
  9. label_test = np.zeros((n,10))#手写图片的lebel
  10. for i in range(n):
  11. label_test[i][i] =1#将(0,0)(1,1)等位置赋值为1
  12. line = []
  13. img = Image.open("{}.png".format(i)) # 打开一个图片,并返回图片对象
  14. img = img.convert('L') # 转换为灰度,img.show()可查看图片
  15. img = img.resize((28,28)) # 将图片重新以(w,h)尺寸存储
  16. for y in range(28):
  17. for x in range(28):
  18. line.append((255-img.getpixel((x,y)))/255)# getpixel 获取该位置的像素信息
  19. image_test.append(line)#存储像素点信息
  20. line = np.array(line)#转化为np.array
  21. ax[i].imshow(line.reshape(28,28), cmap='Greys', interpolation='nearest')
  22. #plt.imshow(line.reshape(28,28), cmap='Greys')#显示图片,imshow能够将数字转换为灰度显示出图像
  23. image_test = np.array(image_test)
  24. return image_test,label_test
  25. image_test,label_test = image_to_number(10)

输出结果:

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/751724
推荐阅读
相关标签
  

闽ICP备14008679号