从知其然到知其所以然
2019-06-25丁伟孙凯
丁伟 孙凯
神经网络学习是人工智能教学中的算法层面的重要组成部分,而手写数字识别可以作为神经网络学习的入门课,即通过让计算机辨认大量标定好的手写数字对它进行训练,就可以识别0~9的手写数字,是一种典型的有监督学习。那么,在中小学如何进行这种入门教学,并在以体验为主的前提下,让学生在现有知识基础上能够了解神经网络学习的基本原理呢?笔者在教学过程中利用虚谷号控制硬件引导学生通过学习基于MNIST训练集的手写数字识别,初步建立对神经网络的基本认识。
用虚谷号进行Python和人工智能的教学,则可以结合硬件制作出包含人工智能元素的作品。本实例用Python语言,首先编写一个三层神经网络,用MNIST训练集完成模型训练,并用画图软件kolourpaint完成手写数字,实现手写数字识别,最后用虚谷号控制的LED灯闪烁次数来呈现对应的数字。
● 配置环境
要让虚谷号实现手写数字的识别,就需要安装一些必要的库和绘图软件,虚谷号已经预装了Python3.5和部分库,下面只要补充、升级相关库即可,如图1所示。
● 了解神经网络
一个完整的人工神经网络至少由输入层、输出层和隐藏层三部分构成。神经网络的每一层都可以用若干个节点来表示某个元素的特征属性(如图2)。
● 手写数字的csv格式
當在28×28的区域写下一个数字时,这个区域中就会留下颜色深浅不一的笔迹,接着将这28×28=784个像素点的颜色转换成0~255之间对应的灰度值并以csv文件格式存储到一个数据表中(如下页图3)。同样我们可以从网上(网址:https://pjreddie.com/projects/mnist-in-csv/)下载到这个有60000条数据的这个数据集。打开表格就会发现里面确实有60000行数据,而且每行数据有785列,其中第一列是这个数字的标签即我们标定的数字,后面的784列就是28×28个像素点对应的灰度值。
学生有了以上的知识做基础,对后面的代码理解就相对要容易一些了,当然并不要求学生对每句代码都理解,因为在教学中是要以模块化的代码来讲解手写数字识别这个案例的,即让学生理解程序中每个模块的作用,并通过修改模块中的关键参数知道对程序执行效率和结果的影响,进而了解人工神经网络的基本原理。下面是笔者在教学中对这个实例的解析。
①神经网络类的建立。神经网络的搭建是一个复杂的过程也不需要初学者掌握,可以将其放到一个类里面,使用的时候直接用from语句导入即可。
②训练数据的导入。图4中的第一行代码括号内的内容为MNIST手写数据集的路径位置,这里使用了数据集中的前100条数据对模型进行了训练。学生在实操过程中可以通过修改训练数据集的数据多少来分析其对准确率的影响。
③设定参数搭建实例。模块中输入层的节点数为784,对应的是28×28像素的图片的784个灰度值;隐藏层节点为200个;输出层的10个节点即0~9这10个手写数字(如图5)。
④设定训练次数(如图6)。依次判断输入数字是0~9的概率,选择概率最大的那一个为输出结果。
⑤使用手写数字检查训练结果(如图7)。使用img_arry =imageio.imread(‘****,as_gray=Ture)语句导入手写的数字图片,其中****的内容为图片在计算机中的保存路径。
⑥运行实例。使用IDLE3打开上面保存的实例,运行实例,使用不同的训练集运行时间不同。运行结束后,结果中列出了手写数字是0~9这10个数字的概率,而计算机会把概率最高的那一项认为是笔者所写的数字,这里计算机输出的结果是4,这个结果对不对呢?打开路径中那张图片看一下就知道了(如图8)。
为了解除学生的疑惑笔者让学生通过修改图8中的数字后再次运行实例,查看结果。
经过反复修改程序中的参数学生得出了以下几个结论:第一,训练集中的数据量越多准确率越高;第二,手写数字是否规范对准确率影响很大;第三,训练集中的数据量越大程序运行时间越长。
该实例也可以在PC机上运行,但是通过虚谷号可以控制硬件,进而让学生更加直观地了解人工智能的广泛应用,创作出有质感的智能作品。虚谷号只要导入虚谷库就能实现Python环境下软硬件的互通。另外,还可以利用上面手写数字的判断结果来制作一个识字闪灯的游戏,让虚谷根据识别到的数字控制LED灯闪烁对应的次数,代码如图9所示。
代码中首先导入了虚谷库和时间库,然后使用循环,将识别结果(label)作为循环次数实现闪灯的效果。此外也可以引导学生使用舵机、马达、蜂鸣器等设计出独具特色的智能产品。
利用虚谷号的代码程序更加贴近程序开发的原始环境,适合有一定程序基础的高年级学生学习,同时高年级的学生,具有一定的项目策划和动手能力,能够利用虚谷号软硬兼容的特点创作出一些技术与艺术完美融合的作品。