赞
踩
前言
这篇文档非常长所以我们会分成5篇来连载,因为机器学习并不是纯软件开发,简单地调用库函数 API,需要有一定的理论支撑,如果完全不介绍理论部分,可能就不知道为什么模型要这样设计,模型出了问题应该怎样改善。不过文档如果写太长大家可能很难有耐心看完,特别是理论部分会有很多公式,但是机器学习确实又对 理论基础 和 编程能力 都有一些要求,相信坚持看下去还是会有很多收获的,我也尽可能把理论和应用都介绍清楚。
前两篇的连载会以机器学习理论为主,之后的文档就基本是纯实际应用了,不会有太多理论内容了:[ Darknet 训练目标检测模型 ]、[ RT-Thread 连接 ROS 小车控制 ]。
这篇文章假定大家都已经会用 RT-Thread 的 env 工具下载软件包,并且生成项目上传固件到 stm32 上,因为这几天的两篇连载文章重点在于加载 onnx 通用机器学习模型,关于 RT-Thread 的教程大家可以在官网文档中心:https://www.rt-thread.org/document/site/上找一找。
首先,简单介绍一下上面提到的各个话题的范围 (Domain),人工智能 (Artifitial Intelligence) 是最大的话题,如果用一张图来说明的话:
监督学习 (Supervised Learning): 这应当是应用最多的领域了,例如人脸识别,我提前先给你大量的图片,然后告诉你当中哪些包含了人脸,哪些不包含,你从我给的照片中总结出人脸的特征,这就是训练过程。最后我再提供一些从来没有见过的图片,如果算法训练得好的话,就能很好的区分一张图片中是否包含人脸。所以监督学习最大的特点就是有训练集,告诉模型什么是对的,什么是错的。
非监督学习 (Unsupervised Learning): 例如网上购物的推荐系统,模型会对我的浏览记录进行分类,然后自动向我推荐相关的商品。非监督学习最大的特点就是没有一个标准答案,比如水杯既可以分类为日用品,也可以分类为礼品,都没有问题。
强化学习 (Reinforcement Learnong): 强化学习应当是机器学习当中最吸引人的一个部分了,例如 Gym 上就有很多训练电脑自己玩游戏最后拿高分的例子。强化学习主要就是通过试错 (Action),找到能让自己收益最大的方法,这也是为什么很多都例子都是电脑玩游戏。
分类 (Classification): 例如手写体识别,这类问题的特点在于最后的结果是离散的,最后分类的数字只能是 0, 1, 2, 3 而不会是 1.414, 1.732 这样的小数。
回归 (Regression): 例如经典的房价预测,这类问题得到的结果是连续的,例如房价是会连续变化的,有无限多种可能,不像手写体识别那样只有 0-9 这 10 种类别。
人工神经网络 (Artifitial Neural Network):这是个比较通用的方法,可以应用在各个领域做数据拟合,但是像图像和语音也有各自更适合的算法。
卷积神经网络 (Convolutional Neural Network):主要应用在图像领域,后面也会详细介绍。
循环神经网络 (Recurrent Neural Network):比较适用于像声音这样的序列输入,因此在语言识别领域应用比较多。
最后总结一下,这篇文档介绍的是人工智能下面发展比较快的机器学习分支,然后解决的是机器学习监督学习下面的分类问题,用的是神经网络里的卷积神经网络 (CNN) 方法。
1 神经网络相关理论
为了让上面的模型能够很好的拟合这些散点,我们的目标就是改变模型参数 θ0 和 θ1,也就是这条直线的斜率和截距,让它能很好的反应散点的趋势,下面的动画就很直观的反应了训练过程。
这种训练方法就是很有名的 梯度下降法(Gradient Descent),当然现在也有很多改进的训练方法例如 Adam,其实原理都差不多,这里就不做过多的介绍了。
我们回到手写体识别的例子,上面介绍的线性回归最后得到的是一个连续的数值,但是手写体识别最后的目标是得到一个离散的数值,也就是 0-9,那么这要怎么做到呢?
如果我们不那么快得到计算结果,而是在中间再插入一层呢?就得到了有一层隐藏层的神经网络了。
图片来源网络表情包
这样我们就得到一个深度神经网络了:
接下来就对这些算子逐一介绍。
这里说明一下为什么要引入卷积运算,尽管前面的矩阵乘法其实已经可以解决很多问题了,但是一旦到了图像领域,对一个 1920*1080 的图像做乘法,就是一个 [1, 2,073,600] 的矩阵了,这个运算量已经不算小了,而用卷积操作,计算量就会大大缩减;另一方面,如果把一个二维的图像压缩成一个一维的向量,其实就丢失了像素点在上下左右方向相互关联的信息,例如一个像素点和周围的颜色通常比较相近,这些信息很多时候是很重要的图像信息。
介绍完了卷积操作的优势,那么到底什么是卷积运算呢?其实卷积就是简单的加减乘除,我们需要一幅图像,然后是一个卷积核 (Kernel):
上面动画用到的卷积核是一个 3x3 的矩阵:
这里说明一下,上面的计算都是针对一个卷积核而言的,实际上一层卷积层可能有多个卷积核,而且实际上很多 CNN 模型也是卷积核随着层数往后,越来越多的。
之前没有提到模型过拟合的问题,因为神经网络模型在训练过程中,很有可能出现模型对自己提供的训练集拟合非常好,但是一旦碰到没有见过的数据,就完全预测不出正确的结果了,这种时候就是出现了过拟合。
Flatten 就是像字面意思那样,把一个2维的矩阵压平,比如这样一个矩阵:
到这里第一部分卷积神经网络相关的算子就终于介绍完了,第二部分部分就会介绍实际如何用 Keras (Tensorflow) 机器学框架训练一个手写体识别模型,最后第三部分就是介绍如何利用把生成的模型导入到 stm32 上面运行。
斯坦福经典机器学习入门视频
链接:https://www.coursera.org/learn/machine-learning
线性回归
链接:
https://towardsdatascience.com/introduction-to-linear-regression-and-polynomial-regression-f8adc96f31cb
END
RT-Thread线上活动
1、【RT-Thread能力认证考试12月——RCEA】经过第一次考试的验证,
能力认证官网链接:https://www.rt-thread.org/page/rac.html(在外部浏览器打开)
立即报名
#题外话# 喜欢RT-Thread不要忘了在GitHub上留下你的STAR哦,你的star对我们来说非常重要!链接地址:https://github.com/RT-Thread/rt-thread
你可以添加微信18917005679为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群
RT-Thread
长按二维码,关注我们
点击阅读原文进入Github
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。