本文为数盟原创译文,转载请注明出处为“数盟社区”。
这篇文章介绍了使用TensorFlow创建自己的手写识别引擎的简单方法。在这里作为示例示出的项目。
完整的源代码可以登录GitHub https://github.com/niektemme/tensorflow-mnist-predict/
介绍
我正在进行一篇机器学习的文章的写作。现在写这个话题就难以忽视TensorFlow,一个由谷歌开源的深度学习引擎。深度学习是机器学习的一个分支,它使用人脑的概念中的神经网络的形式去解决各种问题,例如图象和语音识别(图像1)。这是一个很难用“传统”计算机解决的问题:用一台计算机作为一个大的计算器。
–Image 1: Deep Neural Network (source: Google)
TensorFlow是由谷歌创建的这个事实给了它很大的牵引力,尤其在我使用的网站技术中。为了了解更多关于TensorFlow的内容,我参加了阿姆斯特丹当地的“咖啡与编码”聚会,他们主持了“亲身参与TensorFlow”的活动。
在聚会中我们尝试从TensorFlow网站的教程来开展体验。该教程本身是明确的,写得很好。在我看来,似乎这些例子主要集中在构建和验证模型,但使用创建的模型并不是一个优先事项。一个例外是“图像识别”的例子。但是,更复杂的例子之一是,如果你不是一个机器学习专家那就会更难去使用。
通过搜索互联网,可能甚至要从创建TensorFlow的同一公司中使用某种AI,我发现更多的人试图寻找如何将所创建的模型应用到解决实际问题中去。
所以,我把目标设定在如何通过使用培训模型,在手写识别上使用TensorFlow MNIST教程更加便捷。
目标
该项目的目标是让我的电脑通过使用MNIST数据集的训练模型,来识别我自己手写的数字之一。该MNIST数据集包含了大量的手写数字和相应的标签(正确的数字)。
这就给出以下任务:
l用MNIST数据集训练一个模型。
l保存步骤1中的模型到文件。
l装载通过不同的python脚本保存的模型。
l准备和装载本人亲笔手写体的图像。
l正确地预测我所写的数字。
1.用MNIST数据集训练一个模型
在前两个教程的生成一个tensorflow.org网站中,已经对如何训练一个模型做了清楚的解释。我没有修改这些例子中的任何东西。
正如预期的那样,第二个(专家)教程中创建的模型在正确预测我的手写数字上取得了较好的效果。
2.保存模型
保存模型实际上是很容易的。在TensorFlow保存和恢复变量的文档中已经做了详细的描述。
它归结为为在TensorFlow教程中解释的python脚本加入两行代码。
初始化TensorFlow(TF)变量之前添加:
并在脚本的底部列出以下行:
该文档对如何做到这一点给出了很好的解释。我创建了两个Python脚本,已经包含了这些行去创建一个model.ckpt文件。
– create_model_1.py使用初学者MNIST 教程
– create_model_2.py使用专家MNIST教程
3.用不同的python脚本加载保存的模型
加载模型回到一个不同的Python脚本也在TensorFlow文档中的同一页上做了明确的描述。
首先,你必须初始化你常用于创建模型文件的TensorFlow变量。然后你再使用TensorFlow的修复功能进行恢复。
4.准备并加载本人亲笔书写的图像
我手写数字的图像必须采用与一般图像进入MNIST数据库相同的方式进行格式化。如果图像不匹配,它会试图预测别的东西。
该MNIST网站提供以下信息:
– 图像标准化,可安装在20×20像素的框内,同时保留其长宽比。
– 图片都集中在一个28×28的图像中。
– 像素以列为主进行排序。像素值0到255,0表示背景(白色),255表示前景(黑色)。
对于图像处理我用Python图像库(PIL)。简易的安装方式:
或者看看PILLOW文档的其他安装选项。
获取图像的像素值我执行以下步骤。imageprepare()函数的代码片段显示了所有步骤的代码。
(1)载入我的手写数字的图像。
(2)将图像转换为黑白(模式“L”)
(3)确定原始图像的尺寸是最大的
(4)调整图像的大小,使得最大尺寸(醚的高度及宽度)为20像素,并且以相同的比例最小化尺寸刻度。
(5)锐化图像。这会极大地强化结果。
(6)把图像粘贴在28×28像素的白色画布上。在最大的尺寸上从顶部或侧面居中图像4个像素。最大尺寸始终是20个像素和4 + 20 + 4 = 28,最小尺寸被定位在28和缩放的图像的新的大小之间差的一半。
(7)获取新的图像(画布+居中的图像)的像素值。
(8)归一化像素值到0和1之间的一个值(这也在TensorFlow MNIST教程中完成)。其中0是白色的,1是纯黑色。从步骤7得到的像素值是与之相反的,其中255是白色的,0黑色,所以数值必须反转。下述公式包括反转和规格化(255-X)* 1.0 / 255.0
我作了一下弊,因为我手动裁剪图像。我还没有适应自动裁剪功能。您也可以只使用一个基于矢量的工具来创建手写图像。
argv变量通过文件路径传递给imageprepare()函数。
5.预测手写数字
使用预测功能预测数字现在是比较简单的。就像Pannus在TensorFlow Github讨论会上就97号问题的预测。
继恢复变量的文件,加载模型并利用该模型准备图像的像素值来预测整数代码执行下列操作之一:
新手教程MNIST(教程1):
专家MNIST教程(教程2):
教程1和2之间的差别在于,在专家教程的模型预测中(模型2)采用变量y_conv作为预测标签,而不是模型1中的y来标记,使用模型2的prediction.eval函数需要另一种说法keep_prob:1.0
下方代码段显示了完整的predictint()函数来预测正确的整数,和将其结合在一起的主要功能(专家模式)。所述predictint()函数是从imageprepare()函数所得的像素值作为输入。
这些完整的脚本也可以被使用。
– predict_1.py使用模型形成第一MNIST教程
– predict_2.py使用模型形成第二MNIST专家教程
结果
这里有一些我使用来自专家教程神经网络(模型2)测试的数字。其结果是相当不错的。有趣的是,它会犯人类会有的错误(可能除了误以为7是3)。我想它还需要一些微调。
正确的
正确预测为1
正确预测为3
正确预测为4
正确预测为6
正确预测为7
不正确的
预测为0
预测为2
预测为3
原文链接:
https://niektemme.com/2016/02/21/tensorflow-handwriting/