打印
[资源共享]

C51实现8051上运行的神经网络

[复制链接]
3619|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 芯圣电子官方QQ 于 2023-7-20 10:37 编辑

这个例子程序通过在HC0541上的几分钟的训练, 可以把7段LED的段码显示翻译成相应的数字。88秒训练可以达到90%左右的识别率。代码8KB左右,RAM 1KB。



假设7段LED的采样换成7通道A/D, 就可以解决相对复杂的任务了。



当然训练过程可以在PC上完成,把训练好的网络用51来做识别任务的话,速度还要快几十倍。预估可以用在很多智能传感器等测量、控制领域。


使用特权

评论回复
评论
家有两宝呀 2022-6-28 22:37 回复TA
C51实现8051上运行的神经网络 原文作者:Ralph Heymsfeld是Sully Station Solutions的创始人和负责人。他的兴趣包括人工智能,机器学习,机器人技术和嵌入式系统。他关于其他主题的著作定期出现在这里和整个互联网上。 原文链接:http://robotics.hobbizine.com/arduinoann.html 本文译者修改成支持芯圣电子HC0541 系列8051内核的C51代码,并测试通过,修改后的代码在本文结尾,最新的代码在这里下载: https://github.com/392625227/C51-NN-network ———————————————— 版权声明:本文为CSDN博主「定基·任」的原  
沙发
家有两宝呀|  楼主 | 2022-6-28 22:44 | 只看该作者
依赖:

    Keil C + C51支持
    芯圣电子HC0541 SDK http://www.holychip.cn/development.php?class_id=102104101



如果在PC上仿真运行,无需硬件

使用特权

评论回复
板凳
家有两宝呀|  楼主 | 2022-6-28 22:44 | 只看该作者
原文翻译:

本文介绍了为Arduino Uno微控制器板开发的人工神经网络。这里描述的网络是前馈反向传播网络,可能是最常见的类型。它被认为是用于有监督或无监督学习的良好通用网络。该项目的代码以Arduino草图的形式提供。它是即插即用的-您可以将其上传到Uno并运行它,并且有一部分配置信息可用于快速构建和训练自定义网络。这里提供的文章概述了人工神经网络,草图的详细信息,并介绍了前馈网络和反向传播算法中使用的一些基本概念。

使用特权

评论回复
地板
家有两宝呀|  楼主 | 2022-6-28 22:45 | 只看该作者
可通过单击以下位置下载该草图:ArduinoANN.zip。

自1980年代中期以来,一直在使用反向传播神经网络。反向传播的基本概念非常简单,尽管算法本身包含一些高阶数学,但不必完全理解如何导出等式以应用它们。在非常小的系统上实现网络存在一些挑战,而在较早的廉价微控制器和业余爱好者主板上,这些挑战是巨大的。但是,Arduinos和今天的许多开发板一样,实际上使这项工作非常短。它的2K SRAM足以用于具有7个输入和4个输出的示例网络,并具有针对多维数组和浮点数**算的Arduino GCC语言支持,

使用特权

评论回复
5
家有两宝呀|  楼主 | 2022-6-28 22:46 | 只看该作者
那有什么用呢?神经网络以身作则。它们已用于从自动驾驶汽车控制到游戏,面部识别到股票市场分析的各种应用中。大多数应用程序将涉及某种类型的模式匹配,在这种情况下,系统的确切输入将是未知的,并且可能缺少或多余的信息。考虑识别手写字符的问题。字母表的一般形状可以提前知道,但是实际输入将始终变化。当然,在ATmega328上构建的小网络并不能完全满足面部识别的任务,但是可以掌握很多在机器人控制和机器学习中进行的实验。

使用特权

评论回复
6
家有两宝呀|  楼主 | 2022-6-28 22:46 | 只看该作者
顾名思义,人工神经网络(通常缩写为ANN)是受自然启发的计算模型。这是在某种程度上模仿大脑存储信息并对各种输入做出反应的方式的尝试。在自然界中,神经系统的基本组成部分是一种特殊类型的细胞,称为神经元。

使用特权

评论回复
7
家有两宝呀|  楼主 | 2022-6-28 22:47 | 只看该作者
将神经元可视为一个微小的电化学开关可能会很方便,它在受刺激时会打开。神经元在广阔的网络中相互连接。当神经元被刺激激发并变得活跃时,它会沿着该网络发送少量电荷,进而使网络中的其他神经元变得活跃。一个神经元将有多个神经元馈入其中,并且这些连接的强度会有所不同。如果输入有很强的联系,它将提供很多刺激。较弱的连接将提供较少的连接。在非常真实的意义上,神经元可以被认为是将所有这些具有不同强度的输入相加并基于总和产生输出。

使用特权

评论回复
8
家有两宝呀|  楼主 | 2022-6-28 22:48 | 只看该作者
在基于软件的人工神经网络中,神经元及其连接被构造为数学关系。当软件具有输入模式时,它将通过网络馈入该模式,系统地将输入添加到每个神经元,计算该神经元的输出,并使用该输出将适当的输入馈送到网络中的其他神经元。

使用特权

评论回复
9
家有两宝呀|  楼主 | 2022-6-28 22:48 | 只看该作者
确定神经元之间的连接强度(也称为权重)成为神经网络应用程序中的首要任务。在反向传播算法中,最初使用随机权重初始化网络。然后为网络提供输入和输出的训练集。当输入通过系统馈送时,会将实际输出与所需输出进行比较,并计算误差。然后,该错误会通过网络反馈,并且权重会根据学习算法进行增量调整。在许多周期(通常是数千个周期)中,最终将训练网络,并在出现输入时给出正确的输出。

使用特权

评论回复
10
家有两宝呀|  楼主 | 2022-6-28 22:49 | 只看该作者
在我们在此处构建的前馈网络中,神经元分为三层,分别称为输入层,隐藏层和输出层。一层中的所有神经元都连接到下一层中的所有神经元。下面是这种关系的经典图形表示。

使用特权

评论回复
11
家有两宝呀|  楼主 | 2022-6-28 22:55 | 只看该作者
隐藏层在前馈网络中起着至关重要的作用。在早期的神经网络模型中,输入神经元直接连接到输出神经元,并且网络可以实现的解决方案范围极为有限。两层模型无法解决的一个问题是异或逻辑-通常表示为XOR。在布尔逻辑中,当两个输入中的任何一个为true时,XOR关系将为true,但是当两个输入均为true时,则为false。XOR的真值表如下图所示。

使用特权

评论回复
12
家有两宝呀|  楼主 | 2022-6-28 22:55 | 只看该作者

使用特权

评论回复
13
家有两宝呀|  楼主 | 2022-6-28 22:56 | 只看该作者
通过在输入和输出之间添加一个层,网络可以解决XOR等问题。一些理论认为,在优化网络的其他条件的情况下,三层网络将能够解决任何真值表。解决XOR是对新网络的良好测试。您会在示例中看到它经常使用,并且它通常被称为神经网络的“ Hello World”程序。

使用特权

评论回复
14
家有两宝呀|  楼主 | 2022-6-28 22:59 | 只看该作者
该程序的结构使得通过简单地在草图开始时更改配置部分中的值就可以非常快速地组装网络和训练集。通过这种设置,可以在不必完全了解所有潜在细微差别的情况下进行网络实验。

使用特权

评论回复
15
家有两宝呀|  楼主 | 2022-6-28 23:00 | 只看该作者
配置部分包括两个数据数组Input和Target,它们共同构成训练集的真值表。就其价值而言,草图中设置的训练是一个真值表,该真值表将led数字显示屏(0-9)的七个段映射为二进制数(0000-1001)。您可能会认为这是光学字符识别问题的基本表示。如果研究数组,您会发现它们在输入和输出的映射中提供了丰富的组合,并为网络可以学习解决相当困难的问题提供了很好的概念证明。

使用特权

评论回复
16
家有两宝呀|  楼主 | 2022-6-28 23:18 | 只看该作者
要将网络修改为新的训练集,必须在Input和Target数组中输入适当的真值表值,并且还必须在配置部分中调整相应的参数以匹配新的真值表:

    PatternCount:真值表中训练项目或行的数量。
    InputNodes:输入神经元的数量。
    OutputNodes:输出神经元的数量。

使用特权

评论回复
17
家有两宝呀|  楼主 | 2022-6-28 23:19 | 只看该作者
您可以在本节中配置一些其他项目进行实验。

    HiddenNodes:隐藏神经元的数量。
    LearningRate:调整实际向后传播该错误的数量。
    动量:调整前一次迭代的结果对当前迭代的影响。
    InitialWeightMax:设置重量的最大起始值。
    成功:网络将解决训练集的错误阈值。

使用特权

评论回复
18
家有两宝呀|  楼主 | 2022-6-28 23:19 | 只看该作者
作为一个一般概念,HiddenNodes,LearningRate,Momentum和InitialWeightMax一起工作以优化网络以提高学习效率和速度,同时最大程度地减少神经网络设计中遇到的陷阱。

较低的LearningRate值会导致训练过程变慢,但会降低网络陷入振荡的可能性,在这种情况下,网络会持续过度解决训练问题的解决方案,并且永远不会达到成功阈值。在我们的演示中,LearningRate设置为3.。对于大型,非常复杂的网络(比我们在Arduino Uno上构建的网络大得多),该值通常设置得非常低-约为0.01。

动量通过将先前反向传播的一部分注入当前反向传播来平滑训练过程。动量有助于防止网络收敛于一个好的但不是最好的解决方案的现象,也称为收敛于局部最小值。动量值必须在0到1之间。

隐藏神经元的数量会影响网络训练的速度,网络可以解决的问题的复杂性,并有助于防止收敛于局部最小值。您将需要至少具有与输出神经元一样多的隐藏神经元,并且可能需要更多。大量隐藏神经元的缺点是需要存储大量权重。

初始随机权重应该相对较小。草图随附的配置中的InitialWeightMax值为.5。这会将所有初始权重设置为-0.5至.5之间,这是一个很好的起点.

使用特权

评论回复
19
家有两宝呀|  楼主 | 2022-6-28 23:20 | 只看该作者
这些参数的理想值根据训练数据的不同而有很大差异,实际上,没有简单的最佳选择方法。经验与反复试验相结合似乎是方法。

配置部分中的最终值“成功”将在系统认为学习训练集时设置系统中错误的阈值级别。这是一个非常小的数字,大于零。这种类型的网络的本质是,系统中的总误差将接近零,但从未真正达到零。

请注意,具有7个输入,8个隐藏的神经元和4个输出的示例网络大约可以在Arduino Uno的2K SRAM上运行。不幸的是,如果您没有在Arduino上用完内存,则不会发出警告,草图的行为只会变得不稳定。好消息是,SRAM分配大于2K的Arduino和Arduino兼容系统的列表一直在增长。如果您成为一名成熟的神经网络实验者,您将有很多选择。

使用特权

评论回复
20
家有两宝呀|  楼主 | 2022-6-28 23:20 | 只看该作者
至此,我们已经为您提供了足够的基础,可以将示例网络的代码复制到您自己的计算机上,将其上传到Arduino,并尝试各种设置。

在配置部分之外,我们现在转到草图本身。将神经网络实现为C程序的基本策略是建立数据数组框架,以保持权重并跟踪通过信号前馈和错误后馈累加的累加总数。嵌套的FOR循环序列迭代这些数组,从而在执行反向传播算法时进行所需的各种计算。数组,其他变量和常量的名称与网络中的函数相对应;随着其余说明的进行,这些名称将变得更加清晰。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

583

帖子

0

粉丝