人工智能入门:基于Linux与Python的神经网络

作者|Walter Trojan

译者|透镜

本文将讨论人工智能在深度学习中的工作方式。如果您想认真学习AI,Linux和Python是必不可少的工具。只有选择合适的开发工具,才能事半功倍。我学习过一些相关书籍和教程,并且进行了大量的编程测试。目前,我仍然有很多困惑,不过,至少可以给您一个概述,例如专用智能的神经网络(NN)用到了哪些结构和方法。

01

神经网络结构

神经网络(NN)由几层组成,每层都有若干节点。在图1中,同一层中的节点垂直排列。理论上讲,网络内可以有任意数量的层,每层可以有任意数量的节点。该体系结构由对应的任务确定,大小取决于计算机平台所拥有的资源。例如,如果神经网络(NN)要按图片对接收到的对象进行分类,则第一层接管数据以完成任务,并提供相应数量的输入节点进行采集。假如低分辨率图像为28×28像素,那么显示对应的灰度值需要784个节点。要获取彩色图像,节点数量将增加三倍。在图像采集期间,每个输入节点都会接收对应像素的灰度值。 

图1 神经网络结构

扫描二维码关注公众号,回复: 12667341 查看本文章

图像分析的结果显示,在输出层中每个输出结果都有一个单独的节点。如果神经网络(NN)要识别1000个对象,则该层需要有相同数量的输出节点。每个节点保存0到1.0之间的概率来指示结果中的可靠性。例如,当采样家猫图像时,关联节点的值为0.85,“老虎”节点的值为0.1,其他节点的概率更低,这样结果将是显而易见的。

在深度学习期间,实际的分析工作由隐藏层完成。根据任务的不同,可以使用任意数量的隐藏层,一般会有100到200个隐藏层在使用。除了上面显示的架构外,还有反馈或中间滤波器等更复杂的结构用于提高精度。每个隐藏层的节点数也是任意的。在上述用于对象检测的示例中,带有200个节点的3个隐藏层已经可以提供令人满意的结果。

假如在人脑中通过突触连接神经元来实现智力,那么神经网络(NN)中的节点也是彼此联系的。每个节点都与后续层的所有节点连接。每个连接(如图2中箭头所示)都包含一个权重,层之间的权重存储在矩阵中。因此,在深度学习领域,选择擅长矩阵操作的编程语言,可以轻松快速地完成任务。

 

图2 节点内的计算(https://commons.wikimedia.org/wiki/Artificial_neural_network)

神经网络(NN)如何达到预期的结果呢?每个节点都从前面图层的所有节点接收输入信号,在图2中标记为x。这些值乘以权重值w并相加,得到净输入值:

net=x1*w1+x2*w2+x3*w3…

净输入值与激活函数相乘,然后发送到输出(发送到下一层的所有节点)。同时节点的阈值还确定此节点是否“触发”。图3中所示的激活函数分配给各层,确保输出值保持在所需范围内。例如,Relu函数抑制所有负值,并且限制Sigmoid在0到1之间。这些预防措施可确保NN在一个清晰的数值范围内运行,不会“失控”。

 

图3 常用的激活函数

02

训 练

在记录了输入数据后,神经网络(NN)多次迭代进行大量计算,并将结果输出,此过程称为“推理”。如何得到预期的智能? 这就像教一个小孩,需要通过教育和培训来完成。对于未经训练的神经网络(NN),权重通常为-1到+1的随机数,因此只能得到随机结果。因此需要训练,将数据和已知的目标输出值馈送到网络。用这些值进行计算后,将结果与设定值进行比较,并通过损失函数记录差异,这些学习过程也称为“反向传播”。从最后一层开始,逐步调整权重以最大程度地减少损失。在使用不同的输入数据进行多次(通常数百万次)训练后,所有的任务都匹配了适合权重,而且神经网络(NN)也可以分析未训练过的新数据。

卷积神经网络是一种特别适用于图像和音频处理的体系结构,Maixduino也能支持。在卷积神经网络中,神经元(至少在某些层中)是二维排列的,适合二维输入数据(例如图像)。与图1所示的网络(其中神经元的活动取决于上一层的所有神经元(通过不同的加权因子))相比,在卷积神经网络情况下,依赖关系得到简化,并且受到局部限制。神经元的活动仅取决于3×3(举例)个神经元的值,这些值位于神经元之前的层中,并且加权因子相同。利用这样的网络可以很好地检测出如直线、曲线、点和其他图案的小规模结构。在随后的图层中,可以检测到更复杂的细节并最终检测出整个面部。

就编程而言,神经网络(NN)类似于电子表格,预定义计算指令的单元格排列,在执行过程中使用权重访问多维矩阵。对新的输入数据进行分类时,会经过从输入到输出的所有层,并且输出对应节点上结果的相应概率。训练有素的神经网络(NN)可以达到0.9左右的值。在训练过程中,干扰会反向传播,从输入重新进行权重调整。乍一看很复杂,在实现过程中,有大量的工具和库可以使用。

03

Linux与Python

在处理AI问题时,必须做好学习准备。最简单的方法莫过于使用Linux平台,因为Linux上大多数工具都是免费的,并且质量很高。此外,Linux提供了与Windows相同的体验,只是软件打包方式不同(通常更好)。我更喜欢Ubuntu,它具有LTS版本(长期支持),至少技术支持4年。Linux还具有其他发行版本(如Debian、Mint等),可以根据个人喜好进行选取。Linux可以安装在Windows以外的虚拟机中,因此不需要额外的计算机。

为什么选择Python? 有些人会说,Python是一种解释性编程语言,运行很慢。但这种劣势被众多优势所抵消:Python代码里消除了括号和分号,通过缩进来进行代码块构建;具有强大的数据结构,例如列表、元组、集合和字典;Python完全集成了矩阵计算功能,具有大量高度模块化的AI框架和库,可以完全或部分集成这些功能(这些模块主要用C ++编写,因此性能优异);通过简单的说明文档,就可以轻松地安装使用。选择您喜欢的Linux发行版,以及安装pip3和Python 3吧!

04

Maixduino运行MicroPython

在内存较少的系统上,可以选择MicroPython的轻便Python版本。它可以安装在Maixduino、ESP32等平台上。MicroPython包含基本的命令库和55个其他模块,可用于数学和系统开发。如果要添加新版本或AI模型,需要使用Kflash工具刷新程序。

Linux下安装Kflash:

① 从网站链接[2]下载1.5.3或更高版本的kflash_gui_v1.5.3_linux.tar.xz;

② 解压缩到指定文件夹tar xvf kflash_gui_ v1.5.3_linux.tar.xz;

③ 进入文件夹/kflash_gui_v1.5.2_linux/kflash_gui;

④ 启动/kflash_gui。

启动Kflash的图形界面如图4所示,可以将固件或AI模型加载到Maixduino中。

图4 Kflash

05

Maixduino 安装固件

虽然Maixduino在交付时已经配备了MicroPython,但仍推荐下载最新版本。编写这部分代码时,相应的固件名为v0.5.0,可以通过网站链接[3]下载。选择maixpy_v0.5.0_8_g9c3b97f或更高版本,然后在下一页中选择maixpy_v0.5.0_8_g9c3b97f_minimum_with_ ide_support.bin或更高版本,此文件约为700 KB,包含对MaixPyIDE的支持。

使用Kflash快速安装新固件。点击“打开文件”按钮选择文件,然后设置开发板、端口、波特率和速度模式等,如图5所示。点击“下载”可以看到加载进度条。完成之后,可以通过端口/dev/ttyUSB0在Maixduino执行带有终端模拟器的Python 命令 (如Putty)。下面是一组命令:

>>> # Python Prompt

>>> import array as arr # ImportArray Module

>>> a = arr.array('i',[1,2,3]) # Createarray a with integers

>>> b = arr.array('i',[1,1,1]) # Createarray b with integers

>>> c = sum(a + b) # Create sum ofall array values

>>> print(a,b,c) # and output it

array('i', [1, 2, 3]) array('i',[1, 1, 1]) 9 # output>>>

可以使用numpy(在Linux下)或umatlib库,乃至更多的库。

 

图5 MaixPy IDE的用户界面

06

安装MaixPy IDE

使用MaixPy IDE开发环境,开发和调试软件会很方便。可以在Maixduino上进行开发与调试,以及加载和执行Python程序。此外,如图5所示,还提供了用于图像分析的工具。安装过程如下:从网站链接[4]下载maixpyide linux x86_64 0.2.4installer-archive.7z或更高版本,复制到您选择的文件夹;通过命令tar maixpy idelinux x86_64 0.2.4 installer archive.7z解压缩,转到新文件夹maixpy ide linux x86_64 0.2.4 installerarchive,进入并执行以下命令:

./setup.sh

./bin/maixpyide.sh

IDE随即启动,所有用于实现AI模型的工具随之启动。接下来,就可以测试面部识别程序。

07

面部识别

经过训练的AI模型用于面部识别,该AI模型已经分析了数千张面部的特征,所使用的神经网络(NN)权重也进行了相应的调整。可以在网站链接[5]下载该模型,名称为face_model_at_0x30 0000.kfpkg。这里使用AI框架Yolo2进行开发,它将图像对象划分为几个区域,分别进行分析,获得较高的识别率。AI模型以kfpkg格式打包,必须下载到Maixduino的地址0x30 0000。可以用Kflash烧写。找到对应的文件,使用图4中的参数将其烧写到板卡上。MaixPy IDE用于编辑Python脚本。在此IDE下,可以开发和调试程序,并下载到Maixduino。

图5中包括3个窗口:编辑器,通过语法高亮显示程序输入;终端,显示程序输出;图像分析,进行图像显示以及将光谱分为红色、绿色和蓝色显示。左下方有两个重要按钮:“回形针”用于通过端口“ttyUSB0”建立(绿色)或断开(红色)与Maixduino的连接。下面的绿色三角形用于启动脚本,启动后该按钮将变为带有“x”的红点,用于停止程序。

为了进行测试,笔者打印了两个著名人物(阿尔伯特·爱因斯坦和鲁迪·沃勒)的脸,然后固定在墙上。这个选择纯属巧合,据说两张脸有些相似。拍摄这些照片时,会立即识别出这些脸并用框标记。要确保图像以如图6所示的横向拍摄,否则识别率会明显下降。

 

图6 用于面部识别的测试设置

程序Face detect.py可以在Elektor网站[6]上下载。它的简洁再次证明该库的性能。首先,集成并初始化摄像机、LCD和KPU 所需的库。然后,将神经网络(NN)从地址0x30 0000开始加载到KPU 中。通过命令kpu.init_yolo2初始化AI模型,传输其他常量设置精度和优化选项。图像分类在while大循环中进行,获取图像并馈送到神经网络(NN)。如果检测到面部,则变量i记录每个面部标记框的坐标和大小,然后将其绘制到图像上。最后,输出图像(在LCD面板上)和标记数据(在串行端口上)。有关KPU 命令的更多详细信息,请参见网站链接[7]。

在MaixPy IDE中,图片显示在右上角,相应的色谱图则显示在下方。如果不需要此信息,可以取消激活按钮关闭右侧的图像窗口。为了更好地处理,将Maixduino和LCD安装在小板上,并将摄像机对准前部(参见图6)。这样可以轻松捕获和分析真实的面孔、打印图像或屏幕内容。可以在图7的LCD面板上看到显示内容,人员的相似之处没有显示出来。

图7 Maixduino LCD 上的显示内容

Yolo2模型的背后是如何实现的? 神经网络具有24个卷积层和2个完全连接的输出层(见图8)。在它们之间有一些maxpool层作为过滤器,以消除复杂性并减少“记忆”。值得注意的是,3×3的窗口主要用于细节识别。确切地说,这是由KPU 硬件支持的,可以让Maixduino最大限度地支持此类任务。其他已知的神经网络(NN)结构甚至具有数百层,具有反馈路径或其他附加功能。这个领域的创造力没有上限,这在很大程度上也取决于计算机的计算能力。

08

继续前进!

强大的硬件环境与软件环境表明Maixduino非常适合人工智能。由于低功耗,也非常适合在已经训练好的神经网络移动设备中使用。后续我将向您展示如何开发、训练和执行自己的神经网络。与开发人员的接口是AI框架Keras,也称为“乐高构建工具包”。您还将学会如何在ESP32开发板上编程,例如模拟量采集。保持好奇心,继续前进!

 

图8 面部识别的网络架构(来源:https://bit.ly/3cK3DUR)

相关链接

[1]AI for Beginners,Elektor May&June 2020: www.elektormagazine.com/200023 02

[2]Kflash:https://github.com/sipeed/kflash_gui/releases

[3]Maixduino Firmware:http://dl.sipeed.com/MAIX/MaixPy/release/master/

[4]MaixPy IDE:http://dl.sipeed.com/MAIX/MaixPy/ide/_/v0.2.4/maixpy-ide-linux-x86_640.2.4-installer-archive.7z

[5]AI models:http://dl.sipeed.com/MAIX/MaixPy/model

[6]Project software:www.elektormagazine.com/200023B 04

[7]KPU Commands:https://maixpy.sipeed.com/en/libs/Maix/kpu.html

本文授权来自本刊的合作伙伴Elektor媒体集团,如果希望免费订阅Elektor 的英文在线内容,请访问https://www.elektormagazine.com/。

1.据说很多搞软件的羡慕硬件工程师

2.单片机常用的几种通信接口,I2C、SPI、UART等

3.编程语言1月排行榜结果出炉,我们有五个重要发现

4.5元变70,哎,芯片又缺货了

5.RISC-V处理器是如何设计指令集的?有何特别之处

6.嵌入式工程师常用的宏定义

猜你喜欢

转载自blog.csdn.net/DP29syM41zyGndVF/article/details/114255113