3.1 自己的手写数字
在整本书中,我们一直使用来自MNIST数据集的数字图片。为什么不使用自己的笔迹呢?
在这个实验中,我们将使用自己的笔迹创建测试数据集。我们也将尝试使用不同的书写风格,使用嘈杂或抖动的图片,来观察神经网络的应对能力如何。
你可以使用任何喜欢的图像编辑或绘画软件来创建图片。不必使用昂贵的Photoshop,GIMP是免费开源的替代软件,适用于Windows、Mac和Linux等系统。甚至可以用一支笔将数字写在纸上,并用智能手机、相机或任何合适的扫描仪,将手写数字变成图片格式。唯一的要求是图片为正方形(宽度等于长度),并且将其保存为PNG格式。在喜欢的图像编辑器中,保存格式选项的菜单通常为“File→Save As”或“File→Export”。
下面是我制作的一些图片。
数字5就是我的笔迹。数字4是用粉笔而不是马克笔写的。数字3是我的笔迹并有意切成一段一段的。数字2是传统的报纸或书籍字体,但是进行了模糊处理。数字6有意做成抖动的样子,好像是在水中的倒影。最后一张图片与前面的数字相同,但是添加了噪声,来看看我们是否可以增加神经网络的工作难度。
虽然这很有趣,但是这里蕴含了很严肃的一点。人类大脑在遭受损害后,其能力依然能够得到良好发挥,科学家对此深感震惊。这暗示着,神经网络将它们所学到的知识分布在几条链接权重上,也就是说,如果若干链接权重遭受了一定损害,神经网络也可以表现得相当好。这同时意味着,如果输入图像被损坏或不完整,神经网络也可以表现得相当好。这是一种很强大的功能,这就是我们希望用上图中断断续续的3进行测试的能力。
我们需要创建较小的PNG图片,将它们调整到28个像素乘以28个像素,这样就可以匹配曾经用过的来自MNIST数据集的图片。你可以使用图像编辑器做到这一点。
Python库再次帮助了我们,它从常见的图像文件格式中(包括PNG格式)读取和解码数据。看看下面这段简单的代码:
import scipy.misc img_array = scipy . misc . imread ( image_file_name , flatten = True ) img_data = 255.0 - img_array . reshape( 784 ) img_data = (img_data / 255.0 * 0.99 ) + 0.01
scipy.misc.imread()函数帮助我们从图像文件,如PNG或JPG文件中,读取数据。必须导入scipy.misc库来使用这个函数。参数“flatten=True”将图像变成简单的浮点数数组,如果图像是彩色的,那么颜色值将被转换为所需要的灰度。
下一行代码重塑数组,将其从28×28的方块数组变成很长的一串数值,这是我们需要馈送给神经网络的数据。此前,我们已经多次进行这样的操作了。但是,这里比较新鲜的一点是将数组的值减去了255.0。这样做的原因是,常规而言,0指的是黑色,255指的是白色,但是,MNIST数据集使用相反的方式表示,因此不得不将值逆转过来以匹配MNIST数据。
最后一行代码是我们很熟悉的,它将数据值进行缩放,使得它们的范围变成0.01到1.0。演示读取PNG文件的示例代码可以在GitHub上找到:
我们需要创建基本的神经网络,这个神经网络使用MNIST训练数据集进行训练,然后,不使用MNIST测试集对网络进行测试,而是使用自己创建的图像数据对网络进行测试。
在GitHub上,可通过如下链接获得新程序:
这样做成功了吗?当然成功了。下图总结使用我们自己制作的图像查询的结果。
可以看到,神经网络能够识别我们创建的所有图像,包括有意损坏的数字“3”。只有在识别添加了噪声的数字“6”时失败了。
使用你自己的图像,尤其是手写的图像试试看,证明你的神经网络确实能够工作。
并且,仔细观察,要将图像损坏或变形到什么程度,神经网络才会失败。神经网络的弹性将会给你留下深刻的印象。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论