-
摘要:本文主要介绍基于深度学习的物理层应用,并提出一种基于深度Q网络(DQN)的MIMO系统位置信息验证方案,接收者在多变未知的信道环境下利用深度Q网络不断更新。01引言随着移动流量呈现的爆发式增长、高可靠性和低时延的通信场景给当前网络带来了更大的复杂性和计算挑战。据IBM报道,移动数据量到2020年将超过40万亿Gbits,比2009年增加44倍,连接总设备量将达到500亿。为了满足这一需求,需要新的通信理论和创新技术来满足5G系统的需求。近些年深度学习范式的发展使引起了学术界和工业界对基于深度学习的无线通信技术的研究,研究结果证实了深度学习技术可以提高无线通信系统的性能,并有潜力应用在物理层进行干扰调整、信道估计和信号检测、信号处理等方面。02深度学习范式深度学习的概念源于人工神经网络(ANN)的研究,由Hinton等人于2006年提出。如图1所示,深度学习通过建立具有阶层结构的ANN,往往包含一个输入层、多个隐藏层和一个输出层。每个层之间采用不同的权重与邻层之间进行连接,通过对输入信息进行逐层提取和筛选,可以实现端到端的监督学习和非监督学习 。深度神经网络包括前馈神经网络(FNN)、循环神经网络(RNN)、卷积神经网络(CNN)、对抗生成网络(GAN)和深度信念网络等。其中基于门控的RNN,例如长短期记忆(LSTM)网络对于输入有一定的记忆功能,因此常被用于物理层信号处理和信道状态信息估计等。此外,深度学习也可参与构建强化学习(RL)系统,形成深度强化学习,例如深度Q网络(DQN)[1],可以用于对物理层信号处理策略制定的优化。1)长短期记忆网络作为RNN的一个变体,长短期记忆网络可以有效解决简单循环神经网络的梯度爆炸或消失问题。RNN通过隐状态来存储历史信息。在简单的RNN中,隐状态的每个时刻都会被重写,因此可以看作是一种短期记忆。而在LSTM网络中,记忆单元保存关键信息的时间要长于短期记忆。LSTM网络引入门机制来控制信息传递的路径。门机制取值在0到1之间,来控制信息通过的比例。LSTM网络主要包括了3个门,其中遗忘门控制上一个时刻的内部状态需要遗忘多少信息;输入门控制当前时刻的候选状态保存多少信息;输出门控制当前时刻的内部状态有多少信息需要输出给外部状态。2)深度Q网络DQN将CNN与Q学习结合起来,采用Q 学习的目标值函数来构造深度学习的目标函数,利用记忆回放机制来解决数据之间的关联性问题,并采用迭代更新解决系统稳定性问题。假设环境在时刻所处的状态为,代理根据一定的策略 来采取动作,并获得奖励。然后,环境在时刻转移到以转移概率转移到了下一个状态。在DQN中,代理通过一系列行动与环境进行交互,目的是最大化累积奖励。同时,采用基于卷积神经网络的经验回放来进行Q函数的不断近似。在经验回放中,代理每一步使用ξ-greedy来选择动作,并将每个时刻的学习经验保存在经验池中。在算法的参数更新循环里,对记忆池里的样本进行随机采样或批量随机采样,通过Q学习对模型进行参数更新。并通过CNN来根据之前的经验,不断近似最大的Q值。CNN的损失函数就是近似的Q值与真实Q值之间的偏差,通过梯度下降算法不断调整神经网络的权重,就可不断减少损失函数的值。03 基于深度学习的物理层信号处理应用近年来,学术界和工业界已经出现了一些深度学习应用于物理层的相关工作,研究结果发表深度学习可以提高物理层性能。本小节从物理层信号处理的角度,从信道状态信息(CSI)估计、信号编解码、干扰调整和信号检测四个方面对目前已有的相关工作进行举例和说明。1)基于深度学习的CSI估计精确的CSI获取对于保证无线通信系统的链路性能至关重要。无线网络根据信道估计状态来选择具体的信号控制方案,例如,当CSI较低时,物理层采用低阶调制方案来对抗恶劣的通信状态从而降低误码率。5G通信系统采用多输入多输出(MIMO)、毫米波和非正交多址接入(NOMA)等技术,使得通信双方拥有更多的传输信道,信道估计问题也变得更加复杂。传统的CSI估计方案需要执行具有高复杂度的矩阵运算,受到了计算资源和时延的限制。利用深度学习来得到CSI信息时空和上下行之间的关联性,已经被证实可以提高CSI估计的效率,并减少所需上下行参考信息的数据量[2]。如图2所示,论文[3]提出将历史CSI数据经过一个二维卷积神经网络提取频率特征矢量,再利用一个一维卷积神经网络来从频率特征矢量中提取状态特征矢量。最后,一个LSTM网络用来进行CSI状态预测。由于二维卷积神经网络最初是用来处理图片数据的,因此,作者将CSI原始数据分割成单元格,每个单元格对应一个图片像素。每个频带的CSI和辅助信息对应的像素组成一个频道。因此,N个频带的数据将被转换成N个频道的像素信息,并输入到学习框架中。2)基于深度学习的编解码深度学习在信源编码和信道编码方面的应用,也证明了其可以提高编码效率并降低网络的BER。基于深度学习框架的联合编码方案可以通过循环神经网络实现对本文的源编码(结构化),然后将结构化的信息输入双向的LSTM网络,并最终输出最终传输的二进制数据流。在接收端,LSTM用来进行解码处理。论文[4]提出了就有全连接深度神经网络的编码器,用来提高基于置信传播算法的HPDC解码效率。O’Shea等人在[5]中将整个物理层建模为一个包含了调制、信道编码和信号分类功能的自编码器,并利用卷积神经网络来对自编码器进行训练。如图3所示,在多密集层神经网络的学习框架中,输入信号被编码为独热编码(One-hot encoding),无线信道建模为一个噪声层。交叉熵损失函数和随机梯度下降算法用来训练模型,在输出端将最高概率的输出信号作为解码结果。3)基于深度学习的干扰调整MIMO系统中的干扰调整通过线性预编码技术来调整发射信号,使得接收端的干扰信号可以控制在一个降维子空间里,从而突破MIMO系统干扰问题带来的吞吐量限制。现有工作中已经有研究结果表明,利用深度学习可以提高干扰调整网络中的吞吐量,并取得优化结果。He等人在[6]中提出了采用DQN来获得干扰调整下最优的用户选择策略。在该机制中,中央调度器用来收集所有信道状态和每个用户的缓存状态,并将信道资源分配给每个用户。信道的时变过程用一个有限状态马尔科夫模型来进行建模,系统的状态定义为每个用户的信道状态和缓存状况。中央调度器用来为系统训练处最佳策略,对应的系统动作定义为是否为每个用户分配信道资源来进行数据的传输,来最大化干扰调整网络的吞吐量。DQN也可被用于认知无线电网络中次用户与主用户之间的干扰消除,次用户利用跳频和移动性来抵御干扰者[7]。4)基于深度学习的信号检测基于DL的检测算法可以显著提高通信系统的性能,尤其适当传统的处理模块需要联合优化或是信道无法用常见的分析模型来表征时。论文[8]提出了一个五层全连接的DNN框架嵌入到OFDM接收器中来进行联合信道估计和信号检测。将接收到的信号以及对应的传输数据和导频作为输入,DNN可以推断出信道信息,而且可以用来预测发送的数据。在MIMO中检测中,基于贝叶斯最优检测器的迭代方法已经被证实有较优的性能和中等的计算复杂度。但在很多更复杂的环境下,未知的信道分布条件将限制这种检测器的效果。利用深度学习算法,可以根据一定的输入数据来恢复模型参数,从而提高检测器的自适应能力。同时,在一些情况下,深度学习算法还可以利用一些语义信息,例如接收器的位置和周围车辆节点的信息,来进行波束预测,从而提高系统性能。04 基于DQN的信号检测机制在基于位置服务的场景中,车辆或者用户需要不断发送信标消息来报告自己的位置,从而提高位置服务和网络性能。但有些车辆或用户会选择发送虚假的位置来获取更多的资源,影响了网络服务的效用。在MIMO系统中,传输信号往往包含了丰富的信息(到达角、接收功率等)可以在接收端利用信号检测技术对信标消息进行位置验证。我们提出基于DQN的信号检测机制,可以用于MIMO系统中发送者的位置信息验证和对信息伪造者的检测。主要的思想为,接收端对接收的信号采用最大似然估计进行假设检验,当接收到的信号通过检测检验时,则认为发送信号来自于发送者上报的位置。否则,认为发送者上报了虚假的位置信息。为了提高在多变的信道状态下的检测性能,在接收端基于DQN来预测采用不同的检测阈值可以取得的收益,并选取最优的检测阈值。系统框架如图4所示。1)系统模型 假设检验中的零假设定为发送节点上报真实位置信息,备择假设为发送节点上报了虚假位置信息。在每个时刻,接收端收到发送端的信号都与发送端与接收端之间的真实位置、信道状态和信号到达角有关。在已知发送信息和发送功率的条件下,接收端可以利用最大似然检测来对接收到的信号进行假设检验。2)最大似然检测 接收端采用最大似然检测算法来验证接收到的信号,检测规则定义为:其中代表检测阈值,取值范围为。和代表检测结果分别为正常和虚假上报。和分别为观测信号在零假设和备择假设下的后验分布。根据[9]可得,假设检验的结果(误报率和丢失率)与发送者的实际位置、上报位置、信道状况和检测阈值有关。对于接收端来说,发送者的实际位置、上报位置以及信道状态属于未知或部分已知的环境变量,在与发送者之间不断的信息交互过程中,本文提出接收端可以基于DQN来不断优化检测阈值的选择,从而提高信号检测的准确率。3)基于DQN的检测阈值优化在本文提出的机制中,将接收端的状态空间分为两个维度,第一个维度是发送端到接收端的信道状态,第二个维度是信道检测的结果。信道状态空间包括量化后的一系列信道指标,并假设信道的状态转移符合马尔科夫过程,即信道在当前时刻的状态都只与上一个时刻的状态有关。结果状态空间包括四种:真实数据检测结果为真、真实数据检测结果为假;虚假数据检测结果为真以及虚假数据检测结果为假。在每次动作过程中,接收端的直接奖励与检测结果有关,当检测结果正确时获得正收益,当检测结果错误时获得负收益。接收端的动作定义为进行信号检测的阈值,动作空间包括一系列量化的检测阈值。在每个片刻,接收端的混合策略为选择不同检测阈值的概率。基于本文第二章介绍的DQN原理,接收端在每次经历后,将自己选择的检验阈值、对应的状态结果和收益存储到经验池,利用CNN对Q函数进行训练预测,不断优化对检测阈值的选择。05 总结与未来发展建议在本文中,我们通过现有工作和案例证明了深度学习在物理层通信中的巨大应用潜力。除了以上介绍的几种应用方向,深度学习在端到端通信系统中也得到了一定的应用。不过,目前还尚未有结论基于深度学习的端到端通信系统性能是否会最终超过传统通信系统性能。另外,基于深度学习的物理层应用需要数据驱动,为了提高深度学习模型的训练效率,可以将需要长时间训练的模块进行融合,并需要考虑在良好的性能和训练效率之间的权衡。深度学习应用的兴起主要归功于各种可用的数据集,但目前用于无线通信相关的数据集仍然较少。数据的安全和隐私问题进一步限制了在真实世界对通信数据的访问功能。但为了基于深度学习的通信应用,需要一些开放性电信数据集的发布和共享。最后,5G复杂多变的通信环境,包括MIMO、毫米波通信以及NOMA技术等,也为深度学习的应用带来了巨大的潜力。参考文献[1] Mnih, Volodymyr, et al. "Human-levelcontrol through deep reinforcement learning." Nature 518.7540(2015): 529. https://www.nature.com/articles/nature14236.[2] A. Mousavi and R. G. Baraniuk, “Learning toInvert: Signal Recovery via Deep Convolutional Networks,” Proc. IEEE Int’l.Conf. Acoustics Speech Signal Process. (ICASSP’17), New Orleans, LA, Mar. 2017,pp. 2272–76.[3] C. Luo, J. Ji, Q. Wang, X. Chen and P. Li,"Channel State Information Prediction for 5G Wireless Communications: ADeep Learning Approach," in IEEE Transactions on Network Science andEngineering, early access.[4] E. Nachmani, Y. Be’ery, and D. Burshtein,“Learning to decode linear codes using deep learning,” in Proc. Communication,Control, and Computing (Allerton), 2016, pp. 341–346.[5] T. O’Shea and J. Hoydis, "An Introduction to Deep Learning for thePhysical Layer," in IEEE Transactions on Cognitive Communications andNetworking, vol. 3, no. 4, pp. 563-575, Dec. 2017.[6] Y. He, C. Liang, F. R. Yu, N. Zhao, and H.Yin, “Optimization of cache-enabled opportunistic interference alignmentwireless networks: A big data deep reinforcement learning approach,” in Proc.IEEE Int. Conf. Commun. (ICC), May 2017, pp. 1–6.[7] G. Han, L. Xiao, and H. V. Poor,“Two-dimensional anti-jamming communication based on deep reinforcementlearning,” in Proc. IEEE Int. Conf. Acoust. Speech Signal Process. (ICASSP),New Orleans, USA, Mar. 2017, pp. 2087–2091.[8] H. Ye, G. Y. Li, and B.-H. F. Juang, “Power ofDeep Learning for Channel Estimation and Signal Detection in OFDM Systems,”IEEE Wireless Commun. Lett., vol. 7, no. 1, Feb. 2018, pp. 114–17.[9] Bai, Lin, Jinho Choi, and Quan Yu. “SignalProcessing at Receivers: Detection Theory.” Low Complexity MIMO Receivers,Springer, Cham, 2014. pp.5-28
-
摘要:K近邻(k-NearestNeighbor,K-NN)算法是一个有监督的机器学习算法,也被称为K-NN算法,由Cover和Hart于1968年提出,可以用于解决分类问题和回归问题。1. 为什么要学习k-近邻算法k-近邻算法,也叫KNN算法,是一个非常适合入门的算法拥有如下特性:● 思想极度简单● 应用数学知识少(近乎为零)● 对于各位开发者来说,很多不擅长数学,而KNN算法几乎用不到数学专业知识● 效果好○ 虽然算法简单,但效果出奇的好○ 缺点也是存在的,后面会进行讲解● 可以解释机器学习算法使用过程中的很多细节问题○我们会利用KNN算法打通机器学习算法使用过程,研究机器学习算法使用过程中的细节问题● 更完整的刻画机器学习应用的流程○ 对比经典算法的不同之处○ 利用pandas、numpy学习KNN算法2. 什么是K-近邻算法上图中的数据点是分布在一个特征空间中的,通常我们使用一个二维的空间演示横轴表示肿瘤大小,纵轴表示发现时间。恶性肿瘤用蓝色表示,良性肿瘤用红色表示。此时新来了一个病人如上图绿色的点,我们怎么判断新来的病人(即绿色点)是良性肿瘤还是恶性肿瘤呢?k-近邻算法的做法如下:取一个值k=3(此处的k值后面介绍,现在大家可以理解为机器学习的使用者根据经验取得了一个经验的最优值)。k近邻判断绿色点的依据就是在所有的点中找到距离绿色点最近的三个点,然后让最近的点所属的类别进行投票,我们发现,最近的三个点都是蓝色的,所以该病人对应的应该也是蓝色,即恶性肿瘤。本质:两个样本足够相似,那么他们两个就具有更高概率属于同一个类别。但如果只看一个,可能不准确,所以就需要看K个样本,如果K个样本中大多数属于同一个类别,则被预测的样本就很可能属于对应的类别。这里的相似性就依靠举例来衡量。这里我再举一个例子● 上图中和绿色的点距离最近的点包含两个红色和一个蓝色,此处红色点和蓝色点的数量比为2:1,则绿色点为红色的概率最大,最后判断结果为良性肿瘤。● 通过上述发现,K近邻算法善于解决监督学习中的分类问题
-
本文将详细介绍Yolov3的网络结构相关内容。Yolov3 网络结构本篇将详细介绍Yolov3的网络结构,内容比较简单。Yolov3网络结构图从图中可以看出,Yolov3主要有以下几部分组成:输入基础网络:基础网络是可以根据具体的需求选择,作者原文用的是自己设计的:Darknet-53YOLOv3网络的三个分支:Y1,Y2,Y3网络部件介绍DBL: 如图1左下角所示,也就是代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。对于v3来说,BN和leaky relu已经是和卷积层不可分离的部分了(最后一层卷积除外),共同构成了最小组件。resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。这是yolo_v3的大组件,yolo_v3开始借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深(从v2的darknet-19上升到v3的darknet-53,前者没有残差结构)。对于res_block的解释,可以在图1的右下角直观看到,其基本组件也是DBL。concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。YOLOv3网络的三个分支多尺度检测-Y1适用目标:大目标路径:绿色线标注输出维度:13×13×255输出维度具体解释:13×13:图片大小;255=(80+5)×3;80:识别物体种类数;5=x,y,w,h和c(置信度);3:每个点预测3个bounding box。多尺度检测-Y2适用目标:中目标路径:黄色线标注输出维度:26×26×255输出维度具体解释:26×26:图片大小;255=(80+5)×3;80:识别物体种类数;5=x,y,w,h和c(置信度);3:每个点预测3个bounding box。多尺度检测-Y3适用目标:小目标路径:紫色线标注输出维度:52×52×255输出维度具体解释:52×52:图片大小;255=(80+5)×3;80:识别物体种类数;5=x,y,w,h和c(置信度);3:每个点预测3个bounding box。转载自:华为开发者论坛
-
大家好,我是B站UP主麦叔,很开心入驻华为云 AI 社区! 文末有福利哦,千万不要错过!我在B站发布了“大话神经网络,10行代码不调包,听不懂你打我!”的视频后,因为简单易懂受到了很多小伙伴的喜欢!但也有小伙伴直呼不够过瘾,因为大话神经网络只有4个神经元。也有小伙伴问不写代码,是否可以做人工智能。应对这两个问题,我录制了新的视频,来实现一套基于CNN的图片分类的神经网络!华为云视频:https://bbs.huaweicloud.com/videos/102831在视频中,我们先是运行一套基于tensorflow的代码,让大家体验原汁原味从数据准备,训练,和使用模型的过程。相关的tensorflow代码,资源的下载都可以在我的github上获得:https://github.com/maishucode/tensorflow-image-detection然后我会详细讲解如何利用华为云ModelArts,零代码轻松实现一个图片分类网络,并且可以发布出去给你的朋友使用。看不了视频的也可以看下面的图文教程:在华为云的对象存储服务(OBS)中创建一个桶 选择区域,输入桶名称,其他选项按需调整,这里我们先都用默认值 2. 桶创建完后,我们在桶里新建几个文件夹目录结构如下,train用来放我们的训练数据,out用来放我们的训练结果maishu└── food-img ├── out └── train3. 我们把训练数据上传到train目录下,训练数据可以在上方的github链接里获取4. 回到ModelArts,选择创建数据集输入名称,数据集输入位置和数据集输出位置选我们刚刚在OBS中创建好的目录5. 数据集准备好之后,我们可以创建一个图片分类的项目输入项目名称,数据集选择“已有数据集”,选择刚才创建的数据集6. 项目创建好之后就可以开始训练了点击开始训练,训练设置我们用默认的参数就好,点击确定任务创建成功,稍微等待一会训练完成,点击部署默认1小时后自动停止7. 部署上线之后测试一下我们的模型可以上传一张图片点击预测,右侧会出现预测结果,可以看到模型成功预测了我们下面这张图片。同时我们也可以通过一个URL接口来调用我们的模型为了感谢大家对我的支持,特意为大家带来了三个福利,并且还有机会获得精美奖品哦(业界良心,全国包邮),欢迎大家参与:1、免费报名:万人组团学AI:2020年华为云AI实战营已正式开课了,无论是否有AI经验,都可以免费报名参加!这里涵盖了八大热门AI领域的介绍与实践,非常适合未来想从事AI的学生,或者想跳槽做AI的在职人员,欢迎访问 huaweicloud.ai 了解实战营详情~ 。报名截止9月,今年想找工作的大家千万别错过哦。2、超值福利:优惠资源享不停:通过免费算力实现视频中的案例,训练心得 + 截图成功页面在本帖回帖,即可获得3元抢购290元的云资源算力的机会,畅享 ModelArts 更多付费服务! 扫描二维码添加小助手回复关键词【麦叔】即可获取三元资源套餐 3、惊喜奖品:华为云手环带回家:按本帖中所有回复楼层随机抽奖,每满100人即送出一个华为手环!(使用第三方抽奖平台随机抽出对应人数的获奖楼层!)活动时间:2020.6.25日(周二) - 2020.7.25日(周四),20:00内回复有效!最后,谢谢大家!祝大家学习快乐!
-
“这是最好的时代,也是最坏的时代。” 从提出概念,AI其实已经走过了30年的历程,如今AI已经成为了这个时代的主流。AI技术在突飞猛进地发展,“落地”也成为AI领域企业齐头涌进的目标。 总所周知,人工智能技术的应用落地是需要数据、平台、场景等支撑,这也成为近年来AI应用落地没有想象那么顺利的原因。越来越多诸如场景碎片化、应用成本高、实验室场景到实际应用场景效果差距较大等问题被暴露出来,而这些也成为当前阶段AI落地应用过程中新的痛点。“究其原因,主要是AI开发者在开发过程中,缺少强有力的开发平台和开发工具。”余浩教授谈到。AI开发路上,苦难谁知? 当前做 AI 开发,最让开发者头疼的就是数据的采集和数据的处理。曾有开发者吐槽,光是数据准备就要占整体开发时间的 70%。作为较早接触AI技术领域的技术者华为云MVP余浩,07年获得美国加州大学洛杉矶分校博士学位,17年加入南方科技大学,担任深圳南方科技大学深港微电子学院创院副院长(长聘教授),南科大—ARM中国/中兴人工智能实验室负责人,在AI项目的开发过程中也是面对诸多难题。华为云MVP余浩讲到,首先,第一个问题是数据标注。这项工作的第一步,是要找到开源的数据集并进行标注,开源的数据集很容易找到,但数据标注就是一个大难题,需要耗费大量的人工时间。第二个问题是调参。在数据训练中,最主要的工作就是对训练的数据进行参数调整,在数据的训练中会有很多调参,由于不同的调参会影响最后模型的收敛速度及精度,所以调参是提高辨识率的关键步骤,而这一部分工作由于需要反复测试优化,通常会制造大量的工作量。第三个问题,就是训练时间过长。调参结束后,就需要进行大规模的分布式训练。而这种大规模的分布式训练,需要耗费很长的时间,这种漫长的时间消耗,对于开发者来说,是其AI应用开发效率无法提升的最主要原因。 最后,就是训练模型部署的问题了。通常情况下,模型部署非常复杂,需要编写代码集成到应用系统中,并需要随时进行维护和更新。如果没有一个简单方便的平台,完全依靠人工来操作的话,工作量也是非常大的。看到这里的时候,可以想象到华为云MVP余浩在当时做AI项目开发的难度之大了。而且,这绝不只是华为云MVP余浩会遇到的。大量有着AI梦,热血沸腾的年轻人,很可能会先被这些难题挡在AI应用开发的大门之外。 开发者的痛,Ta知道 面对这些困难和痛点,余浩教授并没有停止AI路上的前进的步伐。他多方探寻,了解到华为云发布了“普惠AI”策略,推出了华为全栈全场景AI解决方案。 “所谓全栈,从技术功能视角来说是指华为AI解决方案是包括算力高达256T FLOPS的高性能AI芯片、芯片使能、训练和推理框架和应用使能在内的全堆栈方案;所谓全场景,是指华为AI解决方案是业界唯一覆盖公有云、私有云、各种边缘计算、物联网行业终端以及消费类终端等高、中、低全场景,算力跨越几千万倍的全场景解决方案。”余浩教授谈到,可以看出不论是在教育和科学研究的各个方面,华为云带来的帮助都是巨大的。 了解到华为云AI全栈全场景AI解决方案的便利性,余浩教授带领着他的学生从2018年开始与华为云一起合作开展教育部产学合作协同育人-新工科建设项目。余浩教授讲到,该项目是利用华为云以及华为ascend 200DK进行人工智能芯片设计课程,课程设计分类三大部分:人工智能算法,深度学习硬件导论以及通过华为云和ascend200DK进行实验项目。 在这个项目中,余浩教授的两位学生以《基于华为物联网云平台的智慧农业》解决方案为基础,利用华为人工智能开发板的智能平台实现对农作物的生长环境的实时监控并采集数据,通过ModelArts AI云平台进行深度学习识别农作物疾病,并做出相应措施。以此来解决传统农业需有经验的农民每日下地查看才能发现农作物疾病的痛点。余浩教授解释到,该方案通过在大棚中安装摄像头来实时检测农作物生长情况,一旦出现某种病变可以通过深度学习来实现疾病识别,然后发送到物联网平台进行救治,例如下发命令给终端喷洒药剂,从而实现智慧农业。最终,本项目还荣获了2019华为ICT大赛创新赛全球总决赛三等奖。 今年的项目中,为解决机器人实时物体识别中低精度的痛点,学生们在华为云上进行了神经网络模型的训练和推理,通过将模型部署到华为云上与机器人进行通讯交互,提升了机器人采集的图片物体识别的精度。 机器人物体识别针对人证识别领域的识别速度这一核心问题,余浩教授带领同学们分析其中的主要延迟环节,在华为云上进行了神经网络的训练和推理,最终在华为云上利用AI加速芯片实现了人证识别毫秒级的响应时间。家庭智能安防领域中端侧在有限的硬件资源下的检测速度和精度一直是难以跨越的障碍,但是5G网络的超高传输速度为这一问题带来了新的解决思路:学生们经过与余浩教授的讨论后决定在华为云上训练和部署老人跌倒检测模型,得益于华为云丰富的硬件资源,部署后的模型大大提高了姿态识别的精度。人证识别 谈到华为云的应用感受时,他讲到,华为云提供便捷的在线训练、转换和部署等服务,还具有布置快速、扩展性强、价格更实惠的优点。在教学的过程中,华为云社区提供的课程都简单易懂,各种快速入门指南让操作也十分方便。学生在使用的过程中,可根据平台上的案例教程去学习实践,完全可以让一个零基础的用户低成本的轻松体验。 2018年华为云发布ModelArts,目前已经拥有开发者超过4万。一年之后,华为云重磅发布了一站式AI开发管理平台ModelArts 2.0,将“普惠AI”理念推至新的高度。通过降低开发者在AI开发过程中每一层的开发门槛,将复杂留给华为云,简单留给广大开发者,最终提升AI开发者的开发效率。余浩教授表示,通过华为云这个“不凡” 的理念,AI开发者必将“成就不凡”。【乘风破浪的开发者】专辑一、云享专家潘永斌:在人工智能时代追逐的“后浪”二、华为云MVP袁覃:ModelArts助力银行客户经理的变形记三、华为云MVP熊保松谈物联网开发,华为云IoT是首选,小熊派是神器四、华为云开发者华为云MVP朱有鹏:做IoT开发乐趣无穷,年轻开发者更要厚积薄发五、华为云MVP毛昌启:Developer 转型记:一个开发平台的“魔力”《华为云MVP&云享专家》官网华为云MVP:https://developer.huaweicloud.com/mvp华为云·云享专家:https://developer.huaweicloud.com/expert《华为云MVP&云享专家》推荐活动华为云MVP招募令:https://bbs.huaweicloud.com/forum/thread-53602-1-1.html云享专家征集令:https://bbs.huaweicloud.com/forum/thread-59104-1-1.html
-
在AI、5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间,也得乘风破浪跟上新技术的节奏。华为云MVP熊保松便是其中一员,他从2013年接触物联网,七年之痒,并没有让他和这个行业分道扬镳,反而是跟随技术的步伐迈入到一个全新的阶段。“我是一位痴迷技术的开发者”,这是华为云MVP熊保松给自己的定义,于他而言,真正万物互联的时代值得期待。 NB-IoT的商用,促成和华为云的缘分联网格局的演变正是应了那句古话,“天下大势,分久必合,合久必分”。华为云MVP熊保松最开始做的物联网项目大多是围绕着ZigBee、433等近距离、局域网类通信技术,由于应用层大多以私有云为主,每家公司也各有不同的物联网接入协议,很难形成真正意义上的互联互通。直到近两年,随着行业巨头的入局,逐步增强了物联网领域各个基础组件的发展,尤其是2018年NB-IoT通信技术的商用,让整个业界对物联网的认知提升到一定的高度。NB-IoT的优点很突出,它有很低的功耗,且信号覆盖广、连接数量多,最关键的是成本也足够低,如此“物美价廉”的通信技术成为各大物联网厂商的首选,而华为也一直极力推进NB标准的演进。在这样的技术趋势下,“传统的私有云也开始逐步向公有云迈进,华为云IoT也成为我们向公有云转型的首选平台。”华为云MVP熊保松表示,华为云IoT是一个非常强大的平台,它具备海量的设备接入、设备及云端的双向通信、OTA升级、设备规则等能力。而且华为云IoT平台可以让云端开发变的极其省心,根据客户的需求,开发者通过图形拖拽的形式即可完成模型的定义。端侧的开发也只需要和云端的模型关系映射起来,很容易建立整个通信管道。去年,华为云MVP熊保松和团队联合华为开发了基于STM32L431RCT6设计的高性能物联网开发板小熊派IoT,专用于提供给开发者评估及快速设计相关物联网的应用产品。 华为云+小熊派,强强联合,加速IoT产品研发作为在物联网行业深耕多年的老兵,华为云MVP熊保松感慨良多。“当前这个阶段,我们听到最多的声音就是传统企业向物联网企业转型难的问题。”他进一步解释道,开发物联网产品所涉及到的领域会比较宽,传统企业不仅需要具备产品端侧研发的能力,还需要涉及到通信、云端,以及应用的开发等技术。这对企业来说,不仅仅需要物联网领域的研发投入,还需要承担一定的时间风险,变的极为不可控。而且当前物联网行业非常注重一个“快”字,这个领域的产品竞争激烈,设备更新迭代周期短,如果不能在短时间内以较低成本的投入快速拿出成果,很难应对市场的变化。对此,华为云MVP熊保松认为,“研发投入是必然的,同样也需要尽可能的复用研发成果。”所以,他和团队在内部达成共识:开发一套稳定的行业解决方案框架,能快速对接各个行业。正是基于这样的思路,华为云MVP熊保松将整套方案推演出了一套开源版本,结合“小熊派IoT”开发套件向业界输送成果,已经受到不少公司的好评,并应用在实际案例中。据官方介绍,小熊派一站式开发工具可将传统至少需要90天的开发时间大大缩减为不足1天,为开发者的产品原型开发减小工作量及开发周期。当前,小熊派IoT和华为云已经合作建立了一套完整的应用案例Demo,可以让更多的企业及开发者快速实现IoT产品的模型验证开发。华为云社区也开辟了“小熊派IoT开发板系列教程”,课程包括单片机基础、LiteOS操作系统基础等,涵盖从基础到进阶的设计,可适应不同基础的IoT开发者。谈及和华为云的合作,华为云MVP熊保松也表示,“期待能和华为云IoT开展更深度的合作,共同打造更多的物联网应用案例。在小熊派的平台上进行开源开放,服务于更多的用户及开发者。”最后华为云MVP熊保松强调,“长江后浪推前浪,技术领域亦是如此。年轻的开发者除了掌握基础知识以外,也需要多了解一些行业新技术的发展。随着技术的不断推演,传统的框架结构也会逐步被新技术取代。”不进则退,万物互联的时代即将到来,年轻开发者的机会很多,就看谁能把握住,创造下一个独角兽。 【乘风破浪的开发者】专辑一、云享专家潘永斌:在人工智能时代追逐的“后浪”二、华为云MVP袁覃:ModelArts助力银行客户经理的变形记三、华为云MVP余浩:AI开发:将简单留给开发者,复杂留给华为云四、华为云开发者华为云MVP朱有鹏:做IoT开发乐趣无穷,年轻开发者更要厚积薄发五、华为云MVP毛昌启:Developer 转型记:一个开发平台的“魔力”《华为云MVP&云享专家》官网华为云MVP:https://developer.huaweicloud.com/mvp华为云·云享专家:https://developer.huaweicloud.com/expert《华为云MVP&云享专家》推荐活动华为云MVP招募令:https://bbs.huaweicloud.com/forum/thread-53602-1-1.html云享专家征集令:https://bbs.huaweicloud.com/forum/thread-59104-1-1.html
-
【Python算法】分类与预测——人工神经网络1.人工神经网络概述 人工神经网络(Artificial Neural Networks,ANN),是一种模范动物神经网络行为特征, 进行分布式并行信息处理的算法数学模型。它以对大脑的生理研究成果为基础,依靠系统的 复杂程度,通过调整内部大量节点之间相互连接的关系,模拟大脑的某些机理与机制,从而 达到处理信息,实现一些特定的功能的目的。2.人工神经网络具有四个基本特征 (1) 非线性:非线性关系是自然界的普遍特性,大脑的智慧就是一种非线性现象。人工 神经元处于激活或抑制两种不同的状态,这种行为在数学上表现为一种非线性关系。 具有阈值的神经元构成的网络具有更好的性能,可以提高容错性和存储容量; (2) 非局限性:一个神经网络通常由多个神经元广泛连接而成。一个系统的整体行为不 仅取决于单个神经元的特征,而且可能主要由单元之间的相互作用、相互连接所决 定。通过单元之间的大量连接模拟大脑的非局限性。联想记忆就是非局限性的典型 例子; (3) 非常定性:人工神经网络具有自适应、自组织、自学习能力。神经网络不但处理的 信息可以有各种变化,而且在处理信息的同时,非线性动力系统本身也在不断变化。 经常采用迭代过程描写动力系统; (4) 非凸性:一个系统的演化方向,在一定条件下将取决于某个特定的状态函数。例如 能量函数,它的极值相应用于系统比较稳定的状态。非凸性是指这种函数有多个极 值,故系统具有多个较稳定的平衡态,这将导致系统演化的多样性。3.神经元(节点)组成神经网络图例 一个神经元由输入值,激活函数,输出值,权重组成,输入值经过激活函数变为输出值,再与权重相乘变为下一个神经元的输入值。由这样的单位组成的网络就是神经网络, 在实际生活中我们给更多的使用BP神经网络,即反向传播神经网络。4.BP神经网络的建模步骤 在反向传播算法中我们涉及到了求梯度的问题,但是求导运算对于计算机来说计算机太过复杂,于是诞生了牛顿法、拟牛顿法、梯度下降法等方式来帮助电脑计算梯度,在实际生活中我们常用5.梯度下降法 梯度类似于微分,微分是针对单变量,而梯度是针对向量。 因为直接获得最优解的计算量过大,所以通过均方误差的分析,采用迭代的方式来一步一步获得局部最优解,这就是梯度下降法。 梯度下降法通过电脑擅长的方式——迭代,极大的减少了求梯度的计算量,但是对于一些较为复杂的函数而言,梯度下降法获得的更多是局部最优解而不是全局最优解。其中α是学习率,由右图我们可以看出,蓝方获得了更优的解,而红方停在了局部最优解。 由此可见,使局部最优解接近全局最优解的方式便是调节学习率。 红点和蓝点实际上就代表了反向传播算法,下山的路径其实就代表着算法中一直在寻找的参数最优解,山上当前点的最陡峭的方向实际上就是代价函数在这一点的梯度方向,场景中观测最陡峭方向所用的工具就是微分。在下一步要走多长就是由我们算法中的学习率α所定义。 梯度下降法本身具有弹性,可以容忍不完善的数据,如果我们不能完美地描述函数,或者我们意外的走错了一步,都不至于前功尽弃。 其中误差计算通常为均方误差,即(目标值 – 实际值)的平方,多采用均方误差的原因有以下几点: 1. 使用误差的平方,我们可以很容易使用代数计算出梯度下降的斜率。 2. 误差函数平滑且连续,这使梯度下降法很好的发挥了作用——没有发生间断,也没有发生跳跃。 3. 越接近最小值,梯度就越小,这意味着,如果我们使用这个函数调节步长,超调的风险就会变得较小。 从结构上讲,BP网络具有输入层、隐藏层和输出层;从本质上讲,BP算法就是以均方误差为目标函数、采用梯度下降法来计算目标函数的最小值。 设第i层和第j层之间的权重为w(i,j),对当前层权重反向传播修正权重的公式为:Δw(i,j) = α ····· 误差 · output(j) · (1 - output(j)) · output(i) 通过反向传播修正链上的权重来改善输出情况。6.操作系统 操作机:Linux_Ubuntu 操作机默认用户:root7.实验工具 7.1.python Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。Python已经成为最受欢迎的程序设计语言之一。自从2004年以后,python的使用率呈线性增长。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。 由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。 众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。 7.2.NumPy NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。 7.3.SciPy SciPy是一款方便、易于使用、专为科学和工程设计的Python工具包.它包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等等.8.导入numpy,scipy.special 实验中将使用人工神经网络对含有110个手写识别数据的数据集进行识别。#导入库 import numpy #numpy是高级的数学计算库 import scipy.special #在这里用到scipy的expit()函数作为sigmod()函数 import matplotlib.pyplot9.学习人工神经网络类的框架人工神经网络类的整体框架如下:class neuralNetwork: def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): pass def train(self, inputs_list, targets_list): pass def query(self, inputs_list):在_init_中。参数说明如下:self.inodes表示输入节点self.hnodes表示隐层节点self.onodes表示输出节点self.wih表示输入层到隐层的权重self.who表示隐层到输出层的权重self.lr表示学习率self.activation表示激活函数编写_init_函数,完整代码如下:class neuralNetwork: def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): self.inodes = inputnodes #输入节点 self.hnodes = hiddennodes #隐层节点 self.onodes = outputnodes #输出节点 #权重链接 self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes)) self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes)) # 学习率 self.lr = learningrate # 激活函数直接调用self.activation_function self.activation_function = lambda x: scipy.special.expit(x) pass10.train函数实现整个神经网络的训练过程 首先实现正向传播,隐层节点的输入值等于输入层的输入值乘以wih权重,代码如下: hidden_inputs = numpy.dot(self.wih, inputs) hidden_outputs = self.activation_function(hidden_inputs) 输出层的输入值等于隐层输出值乘以who权重 。代码如下: final_inputs = numpy.dot(self.who, hidden_outputs) final_outputs = self.activation_function(final_inputs) 正向传播结束后,使用反向传播算法调节链上权重。output_errors = targets - final_outputs hidden_errors = numpy.dot(self.who.T, output_errors) self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs)) self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs)) train函数完整代码如下: def train(self, inputs_list, targets_list): # 将输入和目标值转换为矩阵(numpy的数组) inputs = numpy.array(inputs_list, ndmin=2).T targets = numpy.array(targets_list, ndmin=2).T hidden_inputs = numpy.dot(self.wih, inputs) hidden_outputs = self.activation_function(hidden_inputs) final_inputs = numpy.dot(self.who, hidden_outputs) final_outputs = self.activation_function(final_inputs) output_errors = targets - final_outputs hidden_errors = numpy.dot(self.who.T, output_errors) self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs)) self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs)) pass11.query函数 实现输入测试数据,对得到的结果进行评估。将输入值经过正向传播算法得到结果即可 代码如下: def query(self, inputs_list): #将输入转换为矩阵 inputs = numpy.array(inputs_list, ndmin=2).T hidden_inputs = numpy.dot(self.wih, inputs) hidden_outputs = self.activation_function(hidden_inputs) final_inputs = numpy.dot(self.who, hidden_outputs) final_outputs = self.activation_function(final_inputs) return final_outputs 注意:将以上函数都写入在框架内。12.设定参数 Mnist手写数据图片为28x28的分辨率,所以输入层采用784(28*28)个节点,隐层采用200(可自行调整)个节点,输出层采用10(0~9)个节点,学习率为0.1 代码如下:# 输入层节点 隐层节点 输出层节点 input_nodes = 784 hidden_nodes = 200 output_nodes = 10 #学习率设定为0.1 learning_rate = 0.1 #创建出训练的神经网络 n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)13.读取训练数据集 代码如下:# 打开mnist_CSV训练文件 training_data_file = open("/mnt/dataset_54/mnist_train_100_bcdb280d7666ea5865e56b56d47167ec.csv", 'r') training_data_list = training_data_file.readlines() training_data_file.close()14.用训练数据集对神经网络进行训练 代码如下:#训练网络 # epochs表示训练世代 epochs = 5 for e in range(epochs): for record in training_data_list: # 去掉, all_values = record.split(',') # inputs进行转换 inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01 # 把所有0转换为0.01 targets = numpy.zeros(output_nodes) + 0.01 # 把所有1转换为0.99 targets[int(all_values[0])] = 0.99 n.train(inputs, targets) pass pass15.读取测试数据集 代码如下:# 打开mnist_CSV测试文件 test_data_file = open("/mnt/dataset_54/mnist_test_10_de377bdbad1fe5920e467c5dee8cb718.csv", 'r') test_data_list = test_data_file.readlines() test_data_file.close()16.将测试数据集读入训练好的神经网络中并输出结果 代码如下:# 测试神经网络 # 用scorecaed统计正确的数目 scorecard = [] for record in test_data_list: # 去除测试数据中的逗号 all_values = record.split(',') # 正确的答案放在第零位标签 correct_label = int(all_values[0]) print(correct_label,"correct answer") # 处理测试数据 inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01 outputs = n.query(inputs) #获得输出的概率的最大值所对应的标签 label = numpy.argmax(outputs) print(outputs) print(label,"network's answer") print("\n") #计量正确识别数 if (label == correct_label): #正确的就在scorecard加个1 scorecard.append(1) else: # 错误的就在scorecard加个0 scorecard.append(0) pass pass 这是其中三组输出结果,correct answer是图片的标签即正确答案,network's answer是神经网络识别的结果即测试结果。中间的矩阵是神经网络的十个输出节点输出的值,自上而下分别代表着0~9的概率,概率高者即为神经网络得到的答案。完整代码如下:#导入库 import numpy #numpy是高级的数学计算库 import scipy.special #在这里用到scipy的expit()函数作为sigmod()函数 import matplotlib.pyplot class neuralNetwork: def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): self.inodes = inputnodes #输入节点 self.hnodes = hiddennodes #隐层节点 self.onodes = outputnodes #输出节点 #权重链接 self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes)) self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes)) # 学习率 self.lr = learningrate # 激活函数直接调用self.activation_function self.activation_function = lambda x: scipy.special.expit(x) pass def train(self, inputs_list, targets_list): # 将输入和目标值转换为矩阵(numpy的数组) inputs = numpy.array(inputs_list, ndmin=2).T targets = numpy.array(targets_list, ndmin=2).T hidden_inputs = numpy.dot(self.wih, inputs) hidden_outputs = self.activation_function(hidden_inputs) final_inputs = numpy.dot(self.who, hidden_outputs) final_outputs = self.activation_function(final_inputs) output_errors = targets - final_outputs hidden_errors = numpy.dot(self.who.T, output_errors) self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs)) self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs)) pass def query(self, inputs_list): #将输入转换为矩阵 inputs = numpy.array(inputs_list, ndmin=2).T hidden_inputs = numpy.dot(self.wih, inputs) hidden_outputs = self.activation_function(hidden_inputs) final_inputs = numpy.dot(self.who, hidden_outputs) final_outputs = self.activation_function(final_inputs) return final_outputs # 输入层节点 隐层节点 输出层节点 input_nodes = 784 hidden_nodes = 200 output_nodes = 10 #学习率设定为0.1 learning_rate = 0.1 #创建出训练的神经网络 n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate) # 打开mnist_CSV训练文件 training_data_file = open("/mnt/dataset_54/mnist_train_100_bcdb280d7666ea5865e56b56d47167ec.csv", 'r') training_data_list = training_data_file.readlines() training_data_file.close() #训练网络 # epochs表示训练世代 epochs = 5 for e in range(epochs): for record in training_data_list: # 去掉, all_values = record.split(',') # inputs进行转换 inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01 # 把所有0转换为0.01 targets = numpy.zeros(output_nodes) + 0.01 # 把所有1转换为0.99 targets[int(all_values[0])] = 0.99 n.train(inputs, targets) pass pass # 打开mnist_CSV测试文件 test_data_file = open("/mnt/dataset_54/mnist_test_10_de377bdbad1fe5920e467c5dee8cb718.csv", 'r') test_data_list = test_data_file.readlines() test_data_file.close() # 测试神经网络 # 用scorecaed统计正确的数目 scorecard = [] for record in test_data_list: # 去除测试数据中的逗号 all_values = record.split(',') # 正确的答案放在第零位标签 correct_label = int(all_values[0]) print(correct_label,"correct answer") # 处理测试数据 inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01 outputs = n.query(inputs) #获得输出的概率的最大值所对应的标签 label = numpy.argmax(outputs) print(outputs) print(label,"network's answer") #计量正确识别数 if (label == correct_label): #正确的就在scorecard加个1 scorecard.append(1) else: # 错误的就在scorecard加个0 scorecard.append(0) pass pass # 计算正确率 scorecard_array = numpy.asarray(scorecard) print ("performance = ", scorecard_array.sum() / scorecard_array.size)
-
Tensorflow 2.0实现卷积神经网络CNN对MNIST数字分类本教程演示了如何训练简单的卷积神经网络(CNN)来对MNIST数字进行分类。这个简单的网络将在MNIST测试集上实现99%以上的准确率。因为本教程使用Keras Sequential API,所以创建和训练我们的模型只需几行代码。注意:CNN使用GPU训练更快。1. 导入TensorFlowfrom __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf try: import tensorflow.keras as keras except: import tensorflow.python.keras as keras2. 下载预处理MNIST数据集#下载预处理MNIST数据集 (train_images, train_labels), (test_images, test_labels) = keras.datasets.mnist.load_data() train_images = train_images.reshape((60000, 28, 28, 1)) test_images = test_images.reshape((10000, 28, 28, 1)) # 特征缩放[0, 1]区间 train_images, test_images = train_images / 255.0, test_images / 255.03. 创建卷积基数下面6行代码使用常见模式定义卷积基数: Conv2D 和MaxPooling2D层的堆栈。作为输入,CNN采用形状的张量(image_height, image_width, color_channels),忽略批量大小。MNIST有一个颜色通道(因为图像是灰度的),而彩**像有三个颜色通道(R,G,B)。在此示例中,我们将配置CNN以处理形状(28,28,1)的输入,这是MNIST图像的格式,我们通过将参数input_shape传递给第一层来完成此操作。#创建卷积基数 model = keras.models.Sequential() model.add(keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(keras.layers.MaxPooling2D((2, 2))) model.add(keras.layers.Conv2D(64, (3, 3), activation='relu')) model.add(keras.layers.MaxPooling2D((2, 2))) model.add(keras.layers.Conv2D(64, (3, 3), activation='relu')) print(model.summary()) Model: "sequential"_________________________________________________________________Layer (type) Output Shape Param #=================================================================conv2d (Conv2D) (None, 26, 26, 32) 320_________________________________________________________________max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0_________________________________________________________________conv2d_1 (Conv2D) (None, 11, 11, 64) 18496_________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0_________________________________________________________________conv2d_2 (Conv2D) (None, 3, 3, 64) 36928=================================================================...在上面,你可以看到每个Conv2D和MaxPooling2D层的输出都是3D张量的形状(高度,宽度,通道),随着我们在网络中更深入,宽度和高度大小趋于缩小,每个Conv2D层的输出通道的数由第一个参数(例如,32或64)控制。通常,随着宽度和高度的缩小,我们可以(计算地)在每个Conv2D层中添加更多输出通道4. 在顶部添加密集层为了完成我们的模型,我们将最后的输出张量从卷积基(形状(3,3,64))馈送到一个或多个密集层中以执行分类。密集层将矢量作为输入(1D),而当前输出是3D张量。首先,我们将3D输出展平(或展开)为1D,然后在顶部添加一个或多个Dense层。MINST有10个输出类,因此我们使用具有10输出和softmax激活的最终Dense层。model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(64, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax')) print(model.summary()) # 显示模型的架构 Model: "sequential"_________________________________________________________________Layer (type) Output Shape Param #=================================================================conv2d (Conv2D) (None, 26, 26, 32) 320_________________________________________________________________max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0_________________________________________________________________conv2d_1 (Conv2D) (None, 11, 11, 64) 18496_________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0_________________________________________________________________conv2d_2 (Conv2D) (None, 3, 3, 64) 36928_________________________________________________________________flatten (Flatten) (None, 576) 0_________________________________________________________________dense (Dense) (None, 64) 36928_________________________________________________________________dense_1 (Dense) (None, 10) 650=================================================================...从上面可以看出,在通过两个密集层之前,我们的(3,3,64)输出被展平为矢量(576)。5. 编译和训练模型model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(train_images, train_labels, epochs=5)...Epoch 5/560000/60000 [==============================] - 15s 258us/sample - loss: 0.0190 - accuracy: 0.99416. 评估模型#评估模型 test_loss, test_acc = model.evaluate(test_images, test_labels) print(test_acc) 10000/10000 [==============================] - 1s 92us/sample - loss: 0.0272 - accuracy: 0.99210.9921 如你所见,我们简单的CNN已经达到了超过99%的测试精度,这几行代码还不错。另一种编写CNN的方式here(使用Keras Subclassing API和GradientTape)。 本实验利用网上已有的北京房价数据集预测了北京的房价,实现了TensorFlow的线性回归应用。更多的技术内容,请访问腾科公司网站 www.togogo.net
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签