AI手写计算器:卷积神经网络在Ai8051U上的实现与应用
《AI 手写计算器:卷积神经网络在Ai8051U上的实现与应用》效果演示:Ai8051U 运行 LeNet 卷积神经网络,实现手写计算器功能 ! 8051U, AI 开山之作
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11901
在过去几年中,机器学习技术,尤其是神经网络在图像识别、自然语言处理等领域取得了显著成果。
本文将简要介绍AI手写计算器所用的卷积神经网络,
如何在电脑运行搭建,训练,部署到 Ai8051U上。
下面谈谈我对这些专有名词的理解,仅代表个人意见,并不保证准确。
[*]人工智能(AI): 泛指能产生类似人类思考、判断结果的人为程序、算法。其中最常见的应用包含电脑视觉(CV)、自然语言处理及理解(NLP)及数据分析/挖矿几大领域。
[*]机器学习(ML):机器学习是一种人工智能技术,它使计算机能够从数据中学习并改进其在特定任务上的表现,而无需进行显式编程。机器学习使用多种算法和技术,其中包括但不限于神经网络。
[*]神经网络(NN):神经网络是一种计算模型,其设计灵感来源于生物神经网络。这种模型由大量的节点(或称为“神经元”)组成,这些节点之间通过连接相互作用,能够对输入的信息进行非线性转换,进而完成如分类、回归等任务。根据网络结构的不同,神经网络可以分为前馈神经网络、循环神经网络(RNN)、卷积神经网络(CNN)等类型。
[*]卷积神经网络(CNN):卷积神经网络是一种特殊的神经网络结构,特别适用于处理具有网格状结构的数据,比如图像。CNN通过局部感受野、权重共享以及池化等机制,有效地减少了模型参数量,并能自动地从原始图像数据中提取出有用的特征。这些特性使得CNN在图像识别、视频分析、医学影像分析等多个领域取得了显著的成功。
[*]LeNet:LeNet是卷积神经网络的一个早期实例,由Yann LeCun等人在1990年代开发,最初用于手写数字识别任务,即MNIST数据集上的应用。LeNet的设计引入了多个创新点,例如多层卷积层与子采样层的结合,这为后来更复杂的神经网络架构的发展提供了重要的参考和启示。
[*]TinyML:TinyML是将机器学习模型部署到资源受限的设备上的技术。通过优化和压缩模型,TinyML可以在低功耗、低存储的设备上运行,使得图像识别等复杂任务无需依赖云计算即可在设备本地完成。
总之,神经网络是实现机器学习的重要工具之一,而卷积神经网络则是处理图像数据时最常用的神经网络类型。LeNet是早期成功的卷积神经网络模型,它的结构适用于手写识别任务。TinyML则是在边缘计算和物联网时代背景下,将机器学习技术推向更广泛应用场景的关键技术,借助TinyML技术,可以把模型部署在边缘设备。
我对工智能的理解仅限皮毛,能使用它解决一些实际问题,但对其背后的原理也是一知半解。
这篇文章主要描述的是实操,对立理论学习建议看别人的视频。
在学习的过程中,我找到了《动手学深度学习》这本书,Apache 2.0 协议开源,由业界大牛使用中文撰写,这里进行推荐,这本书的主要作者 李沐 在b站有相关视频,另外可以在其官网 https://zh.d2l.ai/ ,或者本帖附件下载完整pdf。
本帖最后由 Legend 于 2024-11-25 23:38 编辑
沙发 本帖最后由 Legend 于 2024-11-30 19:25 编辑
怎么在自己的电脑上完成训练过程?
电脑配置需求
模型很小,可以不用用显卡
windows 10 以上是必须的,内存大于8G即可,cpu越快越好。
C盘空间10G
下载项目源码
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=11901
准备python环境
推荐使用 Miniconda 管理python虚拟环境,这样切换 python 版本会非常方便
https://mirrors.tuna.tsinghua.ed ... -Windows-x86_64.exe
切换到国内镜像
避免从默认的国外服务器下载软件包
pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/simple
conda config --set show_channel_urls yes
conda clean -i
notepad %USERPROFILE%\.condarc
编辑 `%USERPROFILE%\.condarc` 输入以下内容
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
创建python虚拟环境
创建一个python虚拟环境,激活新创建的虚拟环境,安装依赖
conda create --name ai8051u python=3.9
conda activate ai8051u
pip install -r requirements.txt
配置vscode
安装 python c/c++ jupyter 插件
构建模型
数字识别使用了一种称为LeNet的网络结构,它包含多层结构,每一层都有其特定的功能和作用。
需要注意的是,综合考虑单片机的运行速度和识别难度,这里的网络是对论文中LeNet的简化。
输入层:
[*]首先,模型接收图像数据作为输入。对于手写数字识别任务,它是28x28像素的灰度图像。
卷积层:
[*]卷积层用于从图像中提取低级特征,如边缘或简单形状。这一层通常包含多个卷积核,每个核负责检测不同的特征。
[*]卷积层可以有多个,再第一个卷积层的基础上进一步提取更复杂的特征,每一层都会基于前一层的特征来构建更加高级的模式。
池化层:
[*]池化层进行下采样,减少特征图的尺寸,同时保留重要特征。
全连接层:
[*]首先将多维的特征图转换成一维向量,以便于接下来的全连接层处理。这是模型中进行决策的地方,它根据前面提取的所有特征来进行分类。
Softmax 层:
[*]将输出转换为概率分布,用于分类。
最终实现输入一个28*28的数组,分别输出它是每种数字的概率。
收集数据集
模型在初始时的参数就像刚出生的婴儿,大脑虽然聪明,但却还没有经历过任何学习和经验的积累。在这个状态下,它的行为几乎是完全随机的,几乎没有办法做出正确的判断。
我们需要为他准备大量的图像数据,给它学习,它才能从海量的数据中学会识别数字。
mnist是机器学习中的经典数据集,它包含6万张手写数字的图片。每张图片内有一个数字,28x28大小,其为黑底白字,8位灰度图,数字居中放置。
这里使用的是数据集包括qmnist,它是mnist的超集,他与mnist结构相同,但数据量从6万张扩充到了12万张。
原始的mnist保存再bin文件中,虽然读取速度快,但不利于后续处理,这里使用能把这些图片导出为jpg格式文件。
除此之外,加减乘除四种图片,从Github上的开源项目项目里下载,原作者收集了5000张加减乘除的图片,使用将其黑白翻转,并入数据集。
上述提到的这些py脚本,都能再script内找到。
合并这两个数据集,我们就拥有十万多张可以用于训练。
最终打包这些图片,可以从 https://file.liux.pro/d/public/ai-arithmetic/mnist14.tar.gz 下载
训练
为了让模型能够“学习”和“成长”,我们需要通过训练来调整它的参数。具体来说,这个过程可以分为几个关键的步骤:
随机初始化参数:模型开始时的所有参数(例如卷积层的滤波器、全连接层的权重等)是随机的。就像婴儿一样,什么都不知道,但可以通过学习变得聪明。
前向传播:输入数据(例如手写数字图像)通过模型进行前向传播,经过一系列的卷积、激活、池化等层后,得到一个输出(即模型的预测)。
计算损失:模型输出的结果与真实标签之间会产生一个差距,称为损失。例如,在手写数字识别中,损失函数会计算模型预测的数字与实际数字之间的差异。
反向传播:通过损失函数,我们可以知道模型输出有多远离正确答案。反向传播算法通过计算损失函数对每个参数的梯度,告知模型每个参数需要如何调整,以使得输出更接近真实标签。
更新参数:利用反向传播计算出的梯度,优化器(如 Adam 或 SGD)会根据一定的学习率来更新参数,就像婴儿通过不断地学习、吸收经验逐渐变得聪明一样。每次更新后,模型的预测能力会变得更加精准。
迭代学习:这个过程会不断重复:每次输入数据,计算损失,进行反向传播,更新参数,直到损失足够小,模型的表现达到理想的水平。
所以,尽管模型的初始参数完全是随机的,经过多次训练和调整,它就像一个婴儿在不断成长,最终变得越来越聪明,能够做出准确的判断和预测。
些步骤不需要我们进行一一进行,我们只需要对其主要参数进行调整,Tensorflow能替我们完成这些操作
本帖最后由 Legend 于 2024-11-30 16:30 编辑
微调
QMNIST收集的是外国人手写,他们对数字的写法,与我们不同,此外,触摸屏与铅笔笔迹也不同。
外国写法 触摸屏收集,国内写法
我们还需要收集一些数据对模型进行微调,优化最终的识别效果。
我们用手写笔再触摸屏上写一些数字,单片机读取后通过串口发送到电脑,使用python解析发过来的数据,保存为图片。
可以打开宏 COLLECT_MODE ,并且在电脑上 collect.py 即可从单片机接收图片并保存到电脑上。
我手写了1000个数字,可从 https://file.liux.pro/d/public/ai-arithmetic/mymnist14.tar.gz
在收集好用于微调的图片数据集后,我们可以开始对已有的模型进行微调。微调的过程是基于原先已经训练好的模型,通过在新数据上的进一步训练,调整模型的参数,使其适应新的数据分布。
量化
量化是将模型中的浮点数(比如32位)转换为低精度的整数(比如8位),显然,模型参数的大小减少了75%,并且将浮点运算转为整数运算,这样可以极大提高推理速度,尤其适合在计算能力有限的设备上运行,比如嵌入式设备或手机。
虽然量化会减少模型的精度,造成预测结果准确率降低,但综合考虑后,尤其是在TinyML场景,量化带来的负面影响是可被接受的。 部署
接下来我们需要让训练好的模型跑在单片机上,单片机支持c语言,TinyMaix 是一个c语言写的开源项目,
专为为单片机设计的推理引擎,用它可以运行上边训练好的模型。
TinyMaix 可以提供了把电脑上用tensorflow训练的模型自动量化,并转为c语言头文件的脚本。
这个头文件,包含了模型的结构和参数,TinyMaix 能够读取这些数据,执行推理。
这样,只需要给项目加上 TinyMaix 的核心代码,再包含这个头文件,单片机就能跑神经网络了!
本帖最后由 Legend 于 2024-11-21 23:48 编辑
备用