我是靠谱客的博主 时尚跳跳糖,最近开发中收集的这篇文章主要介绍神经网络优化(四) - 全连接网络实战(输入手写数字输出识别结果)1 真实图片输入-输出逻辑关系2 真实图片输入-输出代码示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

a)如何输入真实图片,输出预测结果

b)制作数据集,实现特定应用

1 真实图片输入-输出逻辑关系

首先我们需要了解输入-输出的过程 

 

注:

1)每个像素点的值是 [0,1] 之间的浮点数。越接近 0 越黑,越接近 1 越白。

2)输出值中最大元素对应的索引号就是预测的结果。

将两个任务分为两个函数解决,先将数字图片 testPic 做预处理,当图片符合神经网络输入要求后,再将其喂给复现的神经网络模型,最后输出预测值 preValue。

def application():
testNum = input("input the number of test pictures:")
for i in range(testNum):
testPic = raw_input("the path of test picture:")
# 对手写数字图片testPic做预处理 
testPicArr = pre_pic(testPic)
# 将符合神经网络输入要求的图片喂给复现的神经网络模型,输出预测值 
preValue = restore_model(testPicArr)
print("The prediction number is:", preValue)

真实图片输入-输出代码示例

该段代码中增加了应用程序 mnist_app.py,其他代码与 神经网络优化(三) - 全连接网络基础 相同

  • 前向传播 mnist_forward.py
  • 反向传播 mnist_backward.py
  • 测试程序 mnist_test.py
  • 应用程序 mnist_app.py

2.1 mnist_app.py 文件

其中 mnist_app.py 文件内容如下

# coding:utf-8
import tensorflow as tf
import numpy as np
from PIL import Image
import mnist_backward
import mnist_forward
def restore_model(testPicArr):
# with 语句重现计算图

with tf.Graph().as_default() as tg:
# x 占位
x = tf.placeholder(tf.float32, [None, mnist_forward.INPUT_NODE])
# 计算求得输出y
y = mnist_forward.forward(x, None)
# y的最大值对应的索引号就是预测结果preValue
preValue = tf.argmax(y, 1)
# 实例化具有滑动平均值的 saver
variable_averages = tf.train.ExponentialMovingAverage(mnist_backward.MOVING_AVERAGE_DECAY)
variables_to_restore = variable_averages.variables_to_restore()
saver = tf.train.Saver(variables_to_restore)
# 创建会话

with tf.Session() as sess:
# 加载ckpt
ckpt = tf.train.get_checkpoint_state(mnist_backward.MODEL_SAVE_PATH)
# 如果ckpt存在,则恢复ckpt中w、b等参数信息到当前会话
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
# 将刚准备好的testPicArr待识别图片喂入网络
# 执行预测操作
preValue = sess.run(preValue, feed_dict={x: testPicArr})
return preValue
else:
# 若无ckpt,则给出提示
print("No checkpoint file found")
return -1
def pre_pic(picName):
# 打开 pic,形成 img 资源句柄
img = Image.open(picName)
# ANTIALIAS是消除锯齿的方法进行 resize
reIm = img.resize((28,28), Image.ANTIALIAS)
# 为符合模型对颜色的要求,用 convert函数将其变为灰度图
# 最后用array将其转为矩阵
im_arr = np.array(reIm.convert('L'))
# 纯白色/纯黑色界限值,可以适当调整
threshold = 50
# 由于模型要求的是黑底白字,而图片是白底黑字,故将图片像素值反转
# for 循环语句双层循环,逐一像素反转
for i in range(28):
for j in range(28):
im_arr[i][j] = 255 - im_arr[i][j]
if (im_arr[i][j] < threshold):
# 对像素点进行二值化处理,使得图片只有纯白色点和纯黑色点
# 过滤点图片中的噪点,留下图片的主要特征
# 小于threshold赋为纯黑色0
im_arr[i][j] = 0
# 大于threshold赋为纯白色255
else: im_arr[i][j] = 255
# 将im_arr整理形状--> 1 行 784 列
nm_arr = im_arr.reshape([1, 784])
# 由于模型要求像素点值为0-1之间的浮点数,故将其变为浮点型
nm_arr = nm_arr.astype(np.float32)
# 将图片的0-255之间的数变为0-1之间的数
# 经过以上操作,图片的格式就满足模型要求了
img_ready = np.multiply(nm_arr, 1.0/255.0)
# 返回整理好的图片值img_ready
return img_ready
def application():
# input函数实现从控制台输入图片的数量
testNum = input("input the number of test pictures:")
for i in range(testNum):
# raw_input函数可以实现从控制台读入图片路径字符串,如pic/01.png
testPic = raw_input("the path of test picture:")
# 由于是使用的已有模型,所以对输入图片要求较为严格,先对图片进行预处理
testPicArr = pre_pic(testPic)
# 将整理好的图片喂入模型中
preValue = restore_model(testPicArr)
# 打印预测结果
print("The prediction number is:", preValue)
def main():
application()
if __name__ == '__main__':
main()

注意

1)main 函数中的 application 函数:输入要识别的几张图片(注意要给出待识别图片的路径名称)。

2)代码处理过程:

  • 模型的要求是黑底白字,但输入的图是白底黑字,所以需要对每个像素点的值改为 255 减去原值以得到互补的反色。
  • 对图片做二值化处理(这样以滤掉噪声,另外调试中可适当调节阈值)。

3)把图片形状拉成 1 行 784 列,并把值变为浮点型(因为要求像素点是 0-1之间的浮点数)。

4)接着让现有的 RGB 图从 0-255 之间的数变为 0-1 之间的浮点数。

5)运行完成后返回到 main 函数。

6)计算求得输出 y,y 的最大值所对应的列表索引号就是预测结果。

 2.2 运行

 

最后

以上就是时尚跳跳糖为你收集整理的神经网络优化(四) - 全连接网络实战(输入手写数字输出识别结果)1 真实图片输入-输出逻辑关系2 真实图片输入-输出代码示例的全部内容,希望文章能够帮你解决神经网络优化(四) - 全连接网络实战(输入手写数字输出识别结果)1 真实图片输入-输出逻辑关系2 真实图片输入-输出代码示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部