• [技术干货] 深度神经网络--反向传播
    第1章中介绍了梯度下降算法训练回归模型,神经网络模型也一样需要使用梯度下降算法来更新参数。然而一个神经网络通常会有上百万的参数,那么如何高效地计算这百万级别的参数是需要重点考虑的问题。神经网络中使用反向传播(Backward Propagation)算法,使得计算梯度更加有效率。在介绍反向传播之前,先来介绍一下链式法则。假设有两个函数y=g(x)和z=h(y),那么z对x的求导过程如下:假设有三个函数x=g(s)、y=h(s)和z=k(x,y),z对s的求导过程如下:神经网络的梯度计算,就是依赖链式法则一层层反向传播的。如图3.4所示的前向神经网络,输入层有n个属性x1,x2,…,xn,中间隐藏层有p个神经元,第j个神经元为hj,j∈(0,p-1)。输出层为q维。对隐藏层的每一个神经元hj,先经过一个线性变换,公式如下:式中,wj0——偏置值;wj1,wj2,…,wjn——作用在属性x1,x2,…,xn上的权重。[插图]输入给神经元后,经过激活函数的作用得到[插图]。第二层同理有神经元输入:输出。以上为前向神经网络的前向传播(ForwardPropagation)过程。对单个数据样本(x,y),假设损失函数为均方差,则对第k个输出项的损失为:通过链式法则,损失函数对权重vkj的梯度为:式中,第一项第三项而对于第二项,假设激活函数为sigmoid函数,则梯度有一个很好的性质,即:三项相乘可以得到:由于真实标签yk由数据给定,而输出值[插图]与hj均由前向传播算法计算得到,则可以轻易地计算得到每个中间层权重vkj,并且该计算过程可以并行进行。类似地,可以得到损失值在隐藏单元hj上的累积梯度为同理,可以通过链式法则,得到损失函数对第一层权重wji的梯度为(假设隐藏层激活函数为ReLU函数):在上一步计算得到后,也可以高效并行地计算出。在上述过程中,假设了损失函数是均方差,激活函数为sigmoid和ReLU,其实这样的计算法则对任意可微的损失函数和激活函数都是有效的。从计算过程来看,在前向传播得到隐藏层与输出层数值后,先从损失函数算起,接着从顶层逐渐计算梯度,将梯度逐层往输入层传播。这与前向传播的顺序是相反的,也是该算法为什么被称为反向传播的原因。反向传播(见图3.5)得到所有参数的梯度之后,可以利用梯度下降算法对参数进行更新迭代,从而达到训练神经网络的目的。神经网络训练过程如算法3.1所示。输入:数据集,步长为α,小批量训练样本的大小为b,迭代次数为T输出:训练完成的神经网络(1) 初始化网络参数w0(2) for t∈{1,2,…,T}(3) 从m个样本中均匀随机无放回选取b个样本mb(4) 前向传播逐层计算隐藏层的参数值,得到样本输出(5) 根据损失函数计算误差,得到输出层梯度(6) 反向逐层计算隐藏层梯度(7) 计算连接参数梯度并更新参数                                                                                                                                本文转载自华为云社区 作者:HWCloudAI
  • [技术干货] 深度神经网络--前向网络
    本章介绍了深度神经网络的几个相关概念,并给出了用MindSpore实现简单神经网络的样例。深度学习(Deep Learning)与传统机器学习最大的不同在于其利用神经网络对数据进行高级抽象。而最基础的神经网络结构为前向神经网络(Feed forwardNeural Network,FNN),又称多层感知机(Multi-Layer Perceptron,MLP)。在介绍多层感知机之前,先来认识一下神经网络的基础单元——感知机。如图3.1所示,x1,x2,…,xn为输入,w1,w2,…,wn为与之对应的权重,w0为偏置。感知机对这些输入进行加权求和,再加上偏置值w0,最后通过激活函数f(·)得到神经元的输出。在分类问题中提到的逻辑函数为一种常用的激活函数(Activation Function),目的是将一个在较大范围变化的值挤压到(0,1)的输出值范围内,或者输出0/1对应的概率值。此外,双余弦函数以及修正线性单元(Rectified Linear Unit,ReLU)函数ReLU(x)=max(x,0)也经常作为神经元的激活函数。这些激活函数的目的都是为神经元带来非线性运算。相比线性函数而言,非线性函数的表达能力更强,图3.2展示了这三种激活函数的形状。尽管非线性激活函数的单个神经元带来了非线性特征,但它只拥有一层神经元,学习能力非常有限,仍然只能处理线性可分的问题。为了解决更复杂的非线性可分问题,多层感知机(MLP)被提出。图3.3为一个简单的三层前向神经网络模型,包括输入层、隐藏层和输出层。数据x作为输入提供给输入层,经过线性映射和非线性激活函数,得到隐藏层。隐藏层再经过一层运算得到输出层。其中输入层的节点数由数据本身的属性数量决定,输出层的节点数可以是类别个数、抽象特征个数等。隐藏层的层数人为指定,并且层数可以是一层或多层,每个隐藏层上都可设置一类非线性激活函数。经过线性组合与非线性变换,这个由多层神经元组成的函数模型,具有更强大的学习能力。                                                                                                                                本文转载自华为云社区 作者:HWCloudAI
  • [其他] 【转载】推荐几个出论文的好方向!-挺思考的几个方向
    几年前如果熟练使用TensorFlow,同时掌握基本的AI算法就可以很容易找到一份高薪的工作,但现在不一样了,AI岗位的要求越来越高,对知识的深度也提出了更高的要求。如果现在一个面试官让你从零推导SVM的Dual、从零实现CRF、推导LDA、设计一个QP问题、从零编写XLNet、编写GCN/GNN、改造SkipGram模型、用一天时间复现一篇顶级会议.... 这些要求一点都不过分。相反,连这些基本内容都有些吃力,就需要重新审视一下自己的核心技术壁垒了。 为了迎合时代的需求,我们去年推出了《机器学习高端训练营》班。这个训练营的目的很简单:想培养更多高端的人才,帮助那些即将或者目前从事科研的朋友,同时帮助已从事AI行业的提高技术深度。 在本期训练营(第四期)中我们对内容做了大幅度的更新,一方面新增了对前沿主题的讲解如图神经网络(GCN,GAT等),另外一方面对核心部分(如凸优化、强化学习)加大了对理论层面上的深度。除此之外,也会包含科研方法论、元学习、解释性、Fair learning等系列主题。目前在全网上应该找不到类似体系化的课程。课程仍然采用全程直播授课模式。那什么样的人适合来参加高阶班呢?从事AI行业多年,但技术上总感觉不够深入,感觉在技术上遇到了瓶颈; 停留在使用模型/工具上,很难基于业务场景来提出新的模型; 对于机器学习背后的优化理论、前沿的技术不够深入;计划从事尖端的科研、研究工作、申请AI领域研究生、博士生; 打算进入最顶尖的AI公司比如Google,Facebook,Amazon, 阿里,头条等;读ICML,IJCAI等会议文章比较吃力,似懂非懂感觉,无法把每个细节理解透;01 课程大纲第一部分:凸优化与机器学习第一周:凸优化介绍从优化角度理解机器学习优化技术的重要性常见的凸优化问题线性规划以及Simplex MethodTwo-Stage LP案例:运输问题讲解  第二周:凸函数讲解凸集的判断First-Order ConvexitySecond-order ConvexityOperations Preserve Convexity二次规划问题(QP)案例:最小二乘问题项目作业:股票投资组合优化 第三周:凸优化问题常见的凸优化问题类别半定规划问题几何规划问题非凸函数的优化松弛化(Relaxation)整数规划(Integer Programming)案例:打车中的匹配问题 第四周:对偶(Duality)拉格朗日对偶函数对偶的几何意义Weak and Strong DualityKKT条件LP, QP, SDP的对偶问题案例:经典模型的对偶推导及实现对偶的其他应用第五周:优化技术一阶与二阶优化技术Gradient DescentSubgradient MethodProximal Gradient DescentProjected Gradient DescentSGD与收敛Newton's MethodQuasi-Newton's Method第二部分 图神经网络第六周: 数学基础向量空间和图论基础Inner Product, Hilbert SpaceEigenfunctions, Eigenvalue傅里叶变化卷积操作Time Domain, Spectral DomainLaplacian, Graph Laplacian 第七周:谱域的图神经网络卷积神经网络回归卷积操作的数学意义Graph ConvolutionGraph FilterChebNetCayleyNetGCNGraph Pooling案例:基于GCN的推荐 第八周:空间域的图神经网络Spatial ConvolutionMixture Model Network (MoNet)注意力机制Graph Attention Network(GAT)Edge Convolution空间域与谱域的比较项目作业:基于图神经网络的链路预测 第九周:图神经网络改进与应用拓展1:   Relative Position与图神经网络拓展2:融入Edge特征:Edge GCN拓展3:图神经网络与知识图谱: Knowledge GCN拓展4:姿势识别:ST-GCN案例:基于图的文本分类案例:基于图的阅读理解第三部分 强化学习第十周:强化学习基础Markov Decision ProcessBellman Equation三种方法:Value,Policy,Model-BasedValue-Based Approach: Q-learningPolicy-Based Approach: SARSA第十一周:Multi-Armed BanditsMulti-Armed banditsEpsilon-GreedyUpper Confidence Bound (UCB)Contextual UCBLinUCB & Kernel UCB案例:Bandits在推荐系统的应用案例 第十二周:路径规划Monte-Carlo Tree SearchN-step learningApproximationReward Shaping结合深度学习:Deep RL项目作业:强化学习在游戏中的应用案例 第十三周: 自然语言处理中的RLSeq2seq模型的问题结合Evaluation Metric的自定义loss结合aspect的自定义loss不同RL模型与seq2seq模型的结合案例:基于RL的文本生成第四部分 贝叶斯方法第十四周:贝叶斯方法论简介贝叶斯定理从MLE, MAP到贝叶斯估计集成模型与贝叶斯方法比较计算上的IntractiblityMCMC与变分法简介贝叶斯线性回归贝叶斯神经网络案例:基于Bayesian-LSTM的命名实体识别  第十五周:主题模型生成模型与判别模型隐变量模型贝叶斯中Prior的重要性狄利克雷分布、多项式分布LDA的生成过程LDA中的参数与隐变量Supervised LDADynamic LDALDA的其他变种项目作业:LDA的基础上修改并搭建无监督情感分析模型  第十六周:MCMC方法Detailed Balance对于LDA的吉布斯采样对于LDA的Collapsed吉布斯采样Metropolis HastingImportance SamplingRejection Sampling大规模分布式MCMC大数据与SGLD案例:基于分布式的LDA训练  第十七周:变分法(Variational Method)变分法核心思想KL散度与ELBo的推导Mean-Field变分法EM算法LDA的变分法推导大数据与SVI变分法与MCMC的比较Variational AutoencoderProbabilistic Programming案例:使用概率编程工具来训练贝叶斯模型第十八周:其他前沿主题模型的可解释性解释CNN模型解释序列模型Meta LearingFair Learning技术前瞻来自: https://mp.weixin.qq.com/s?__biz=MzIxNDgzNDg3NQ==&mid=2247490807&idx=1&sn=ca6d96436ca36db381c81c127c84aea4&chksm=97a0d723a0d75e3519ae00b843ddddec2d8b34d0ca05da8321c0132cff3e5a2db6f06cc21669&mpshare=1&scene=1&srcid=1223p35BnTrXvk9mkdz47D9j&sharer_sharetime=1608681739202&sharer_shareid=0db9e33f08e688d75280372a49229077&key=6e20debea4cb3acf6c34c2e50862c68d4f1009eda9020515215ffd4289929e2578329aa29ad24a41099c3b79c2449701d4b402b37dc8a475f649d99d4a7d80b09d5449a97a446cc03594c65fd2483fe5fa045a244258255f6a9abb3927ee381b8746cfbbe2eb74eb1877747701775492424f21adff8c5997d026c17198047c8f&ascene=1&uin=MjA1NDcyNjA0MQ%3D%3D&devicetype=Windows+10+x64&version=63000039&lang=zh_CN&exportkey=AxUs7jEVt156XTGi0LoXB4s%3D&pass_ticket=q9aERC0rpXZsUgDX4SmP6o8YwypQi0eBFdz2tNNKmLgR%2F7I%2FTUIA9c7nqmSWPkx1&wx_header=0  
  • [其他] 图神经网络GraphSage:远亲不如近邻
    作为近来大火的图神经网络领域内的里程碑,GraphSage改变了Spectral-based GCN通过卷积训练每一个节点的embedding来表示该节点的方法,采用了通过对该节点紧邻节点进行sample&aggregate的方式表达该节点。解决了传统GCN无法对新节点预估以及必须对整个网络进行训练的两个问题,本质上实现了从transductive到inductive的进化。算法算法整体上看上去比GCN那坨负责的傅立叶变换清爽了很多,几乎不需要数学基础,很符合深度学习发展“傻大快强”的趋势。整个算法的思路就是通过一个aggregate方法学习到节点近邻的信息的综合,与自身上一步骤的信息concat变换后得到该节点新的信息。对于aggregator来讲,由于graph是无序的,因此aggregator需要可以处理无序的输入,这一点和大部分pooling的诉求是相同的。最简单的aggragator就mean pooling这种,这种方案最大的弊病是aggregator不是trainable的,效果比较一般。复杂一些的可以使用lstm,但是lstm处理数据是有序的,为了改造成无序,在训练时直接输入random的node近邻,这个该找方案也是够简单粗暴的,我有一点confuse的在于node近邻本身就是random的为何还要random输入。最后作者提到了一种trainable and symetric的aggregator,node近邻各节点独立输入到网络中后进行elementwise的max-pooling。简单的来说就是mlp外边套了一个max,mlp的作用在于学习到近邻中各个节点的信息,max的作用在于能够学习到近邻节点综合起来的信息,作者提到这个地方用mean和max的效果基本是一致的。对于minibatch的训练,我们只需要先将所需要的近邻节点(up to depth k)sample出来参与计算,而不需要将图中的全部节点都参与计算,作者提到这里的sample采取的是最简单的uniform fixed-sized方法,在每一步都会重新进行sample。损失函数采用的是graph-based loss function,看上去和word2vec的那一套还是很像的,通过random walk进行正样本采样,negative sample进行负样本采样。对比传统GCN提升的应用场景对于工业界使用来说,比如在广告这个场景,我们通过用户行为进行组图,ad作为图中的节点,通过图网络pretrain得到每个ad的embedding加入ranking模型或者在召回阶段进行向量召回,线上预估时一定会有很多新广告是不曾出现在训练数据中的,对于传统的GCN模型来讲就只能用一个默认的embedding来表达从而大大的削弱了信息量。但是对于GraphSage来讲,我们可以通过与新ad有关联的附近ad的embedding来推算出该ad的embedding。还有一种情况是cross graph,即在一个graph上训练embedding,但是在另外一个graph去实际应用生成embedding。整体看下来,GraphSage的结构不是很复杂,并且很适合于工业界使用,即可以端到端的学习item embedding做向量检索,也可以对大规模数据pretrain获得item embedding concate到主模型中做二阶段训练。我个人更倾向于将这种建模思想融入到主模型中做end2end的训练,也许会有些出人意料的收获。
  • [行业动态] 【12月22日 AI 快讯】AI种草莓,比最强人类多两倍:首次农业人机大战结束了
    产业分析美的、便利蜂、贝壳等企业案例后,杨国安对数字化转型有这三个洞察数字化的威力不是加法,而是乘法2020/12/21 17:15原文链接怎样才算人工智能教育?这家机器人公司「以赛带学」输出AI教育教学成果“所谓人工智能教育是,用创客的思维,STEAM的理念培养面向未来AI智能时代的未来制造者。”2020/12/21 16:59原文链接人工智能让遥感数据释放巨大潜能:人口普查中的「人工」或将被取代该研究证实了卷积神经网络(CNN)针对卫星图像数据深入分析的潜能。2020/12/21 15:53原文链接AI种草莓,比最强人类多两倍:首次农业人机大战结束了云南昆明开启的「多多农研科技大赛」在12月16日落下了帷幕。2020/12/21 15:44原文链接教育公司如何借助AI技术,更快提升课程顾问的水平跨越从“知道”到“做到”的鸿沟2020/12/21 15:36原文链接入门速度数百倍之差,有人断言KNN面临淘汰,更快更强的ANN将取而代之这也许是真的。2020/12/21 15:49原文链接清华大学发布首个自动图机器学习工具包AutoGL,开源易用可扩展,支持自定义模型清华大学发布全球首个开源自动图学习工具包 AutoGL。2020/12/21 15:37原文链接其他 谷歌传奇Jeff Dean获2021年IEEE冯诺依曼奖,8页本科论文被大学图书馆保存至今以表彰对大规模分布式计算机系统和人工智能系统科学与工程的贡献”。2020-12-21 14:06:10原文链接彭博社:微软正为其数据中心自研芯片彭博社评论称,此举可能对英特尔数据中心芯片业务构成威胁。2020-12-21 10:14:55原文链接快讯美国民权组织开始阻止在美国机场扩大人脸识别使用由美国公民自由联盟领导的民权组织联盟对拟议扩大陆路和海港海关和边境保护局(CBP)的面部识别提出了反对意见。国家移民法律中心,为未来而战和电子前沿基金会也与其他十二个国家一起参加了议案。CBP 于 11 月提交的拟议规则将扩大生物识别出口系统,并授权从进入该国的任何非公民收集面部图像。但是,在评论期最后一天星期一的文件中,该联盟认为这些措施太极端了。(The Verge)2020-12-22 08:45原文链接付费平台 Bolt 获 7500 万美元 A 轮融资付费平台 Bolt 近日宣布,该公司最近完成了 7500 万美元的融资。一年之后,Bolt 处理了超过 10 亿美元的零售交易,其购物者网络的规模增长了 10 倍,每月增加了 25 万购物者。据了解,总部位于旧金山的 Bolt 由 Eric Feldman 和 Ryan Breslow 于 2014 年创立,提供了旨在简化网络交易的多种工具。(Venture Beat)2020-12-22 08:45原文链接Elon Musk:特斯拉将于 2021 年推出全自驾车订阅服务特斯拉价值 10,000 美元的全自驾车附件是很多人不一定能负担得起的奢侈品,即使是那些有足够钱买一台特斯拉的人也是如此。特斯拉首席执行官 Elon Musk 表示,明年可能会有更简单的购买功能的方法。一位说要租赁特斯拉的人在推特上告诉 Musk,他在租赁特斯拉汽车时存在的购买全自动驾驶的问题。Musk 表示,全自动驾驶订阅将于 2021 年初开始提供。(ZDNet)2020-12-22 08:31原文链接Google Cloud 扩展了其全球云区域Google Cloud 表示,随着其在全球范围内的扩张,它将在智利,德国和沙特阿拉伯启动新的云区域。对于超大规模云提供商而言,随着国家/地区推出要求客户数据保留在国家/地区中的数据主权法律,添加区域变得至关重要。Google Cloud 一直在 2020 年构建其混合,行业和垂直游戏。随着 Google Cloud 的扩展,出现了三个新的云区域。2020 年,Google Cloud 在雅加达,印度尼西亚,拉斯维加斯,盐湖城和首尔启动了新区域。多哈,卡塔尔,马德里,米兰和巴黎也都在附近。(ZDNet)2020-12-22 08:31原文链接英国国家医疗服务体系与有争议的人工智能公司 Palantir 签署价值 2300 万英镑合同在没有经过仔细审查的情况下,英国国家医疗服务体系(NHS)已经与 Palantir 签署了一项价值 2300 万英镑的为期两年的合同。尽管这家备受争议的 AI 公司与英国的卫生服务合作原本应该是临时的紧急措施,以帮助应对 COVID-19 大流行。据悉,这项已于 12 月 18 日发布的协议正在为 NHS 提供数据平台,以帮助纷发 COVID-19 疫苗。(The Register)2020-12-22 08:24原文链接梅赛德斯即将推出 AI 驱动的 MBUX 信息娱乐系统明年新款梅赛德斯 EQS 轿车问世时,该款轿车将配备 MBUX 信息娱乐系统的新改进版,即 MBUX Hyperscreen,作为可选升级。该公司表示,超宽屏幕覆盖了即将推出的 EV 的整个前仪表板,并添加了 AI 以使使用该系统更加直观。据了解,这家汽车制造商将在即将于 1 月 11 日美国东部时间上午 11 点举行的 CES 新闻发布会上详细介绍信息娱乐系统。(Engadget)2020-12-22 08:23原文链接人工智能解决了量子化学中的 Schrödinger 方程柏林自由大学的一组科学家开发了一种人工智能方法,用于计算量子化学中 Schrödinger 方程的基态。据了解,量子化学的目标是仅根据原子在空间中的排列来预测分子的化学和物理性质,而无需进行资源密集和耗时的实验室实验。原则上,这可以通过求解 Schrödinger 方程来实现,但实际上这是极其困难的。点击下方链接了解更多信息。(PHYS ORG)2020-12-22 08:16原文链接人工智能机器人利用受损腿部继续行走人工智能通常依赖于所谓的神经网络,即受人脑启发的算法。但是与我们不同的是,一旦经过训练和部署,人工智能大脑通常就不会学习新事物。他们一直怀着与生俱来的想法。在一项新研究中,研究人员使用「Hebbian 规则」(一种允许人工智能大脑继续学习的数学公式)创建了神经网络。这些网络不是静态的,而是根据经验变化的,而不是突触的权重(该值指示活动如何从一个神经元传播到另一个神经元)。之后,团队部分移开了两个机器人的左前腿,迫使它们试图弥补伤害。研究人员在本月的神经信息处理系统会议上报告说,两个机器人起初都在挣扎,但 Hebbian 机器人却能行走近七倍。(Science)2020-12-22 08:16原文链接人工智能通过眼球运动来衡量癌症患者的心理健康科学家已经开发出深度学习算法的组合,这些算法使用眼动追踪来评估手术后癌症患者的心理健康。理想情况下,这将有助于发现人们无法进行初步的心理评估时可能患有焦虑症或抑郁症的患者。据了解,该系统结合了卷积神经网络和长短期记忆算法,以研究戴着跟踪眼镜的患者在考虑图稿时的眼球运动。人工智能使用这些眼镜的注视和瞳孔位置数据来确定某人对他们将在以后填写的既定希望,焦虑和心理健康调查表上提出疑虑的可能性。(Engadget)2020-12-22 08:12原文链接
  • [其他] 机器学习算法介绍—SVM
           支持向量机算法是诞生于统计学习界,同时在机器学习界大放光彩的经典算法。  支持向量机算法从某种意义上来说是逻辑回归算法的强化:通过给予逻辑回归算法更严格的优化条件,支持向量机算法可以获得比逻辑回归更好的分类界线。但是如果没有某类函数技术,则支持向量机算法最多算是一种更好的线性分类技术。  但是,通过跟高斯“核”的结合,支持向量机可以表达出非常复杂的分类界线,从而达成很好的的分类效果。“核”事实上就是一种特殊的函数,最典型的特征就是可以将低维的空间映射到高维的空间。       我们如何在二维平面划分出一个圆形的分类界线?在二维平面可能会很困难,但是通过“核”可以将二维空间映射到三维空间,然后使用一个线性平面就可以达成类似效果。也就是说,二维平面划分出的非线性分类界线可以等价于三维平面的线性分类界线。于是,我们可以通过在三维空间中进行简单的线性划分就可以达到在二维平面中的非线性划分效果。       支持向量机是一种数学成分很浓的机器学习算法(相对的,神经网络则有生物科学成分)。在算法的核心步骤中,有一步证明,即将数据从低维映射到高维不会带来最后计算复杂性的提升。于是,通过支持向量机算法,既可以保持计算效率,又可以获得非常好的分类效果。因此支持向量机在90年代后期一直占据着机器学习中最核心的地位,基本取代了神经网络算法。直到现在神经网络借着深度学习重新兴起,两者之间才又发生了微妙的平衡转变。
  • [其他] 机器学习算法介绍—神经网络
           神经网络(也称之为人工神经网络,ANN)算法是80年代机器学习界非常流行的算法,不过在90年代中途衰落。现在,携着“深度学习”之势,神经网络重装归来,重新成为最强大的机器学习算法之一。  神经网络的诞生起源于对大脑工作机理的研究。早期生物界学者们使用神经网络来模拟大脑。机器学习的学者们使用神经网络进行机器学习的实验,发现在视觉与语音的识别上效果都相当好。在BP算法(加速神经网络训练过程的数值算法)诞生以后,神经网络的发展进入了一个热潮。  具体说来,神经网络的学习机理是什么?简单来说,就是分解与整合。       比方说,一个正方形,分解为四个折线进入视觉处理的下一层中。四个神经元分别处理一个折线。每个折线再继续被分解为两条直线,每条直线再被分解为黑白两个面。于是,一个复杂的图像变成了大量的细节进入神经元,神经元处理以后再进行整合,最后得出了看到的是正方形的结论。这就是大脑视觉识别的机理,也是神经网络工作的机理。  让我们看一个简单的神经网络的逻辑架构。在这个网络中,分成输入层,隐藏层,和输出层。输入层负责接收信号,隐藏层负责对数据的分解与处理,最后的结果被整合到输出层。每层中的一个圆代表一个处理单元,可以认为是模拟了一个神经元,若干个处理单元组成了一个层,若干个层再组成了一个网络,也就是"神经网络"。       在神经网络中,每个处理单元事实上就是一个逻辑回归模型,逻辑回归模型接收上层的输入,把模型的预测结果作为输出传输到下一个层次。通过这样的过程,神经网络可以完成非常复杂的非线性分类。
  • [其他] 图神经网络与深度学习在智能交通中的应用:综述Survey
    论文地址:https://arxiv.org/abs/2005.11691关键词:图神经网络(GNNs),图卷积神经网络(GCN),深度学习,智能交通深度学习在计算机视觉和自然语言处理上的成功激发了学者将深度学习应用于交通领域的研究热情。传统上,很多工作将交通网络建模为网格或者分段,但很多交通网络本质上是图的结构,非图结构建模会导致某些有用的空间信息的丢失。最近,将深度学习扩展到图结构上的工作越来越多,这些技术被统称为图神经网络 graph neural networks (GNNs)。在这背景下,交通领域中,构建基于图视角的深度学习框架也越来越多。本论文旨在对这些框架进行总结,提供一个全面、深入、细致、实用性强的综述。本论文的贡献如下: (1)系统且扼要地描述了现有的traffic problems和相应的research directions, challenges。 (2)总结了针对时空预测类交通问题的一般性problem formulation,同时给出了从四种交通数据集(sensors datasets, GPS datasets, rail-hailing datasets, transaction datasets) 中构建图的具体指导。还进一步对图的关键元素-adjacency matrix的定义进行讨论。(3)将已有的图深度学习框架分解,总结其中常见的深度学习技术,包括 GNNs (SGCN/GGCN), RNNs (RNN/GRU/LSTM), TCN, Seq2Seq, GAN, gated/attention/residual mechanism。分析这些技术的理论,优缺点,在交通场景中的具体变种和应用。(4)具体阐述了交通场景中的共同挑战(时间依赖,空间依赖,时空联动,外部因素),并针对每种挑战,总结了多种基于深度学习的解决方案。 (5)收集了一些公开的数据集,还有公开的代码,提出了未来的研究方向。
  • [模型训练] 【转载】基于MindSpore的LSTM-IMDB情感分类分享体验(一)
    实验介绍本实验主要介绍使用MindSpore在CPU/GPU环境下训练LSTM模型,本实验使用基于LSTM构建的SentimentNet网络进行自然语言处理,并参考MindSpore开源仓库中的nlp_to_mindrecord模型案例。LSTM介绍长期短期记忆网络——通常被称为“LSTM”——是一种特殊的RNN,能学习长期依赖性。主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题,适合于处理和预测时间序列中间隔和延迟非常长的重要事件。它最早由Hochreiter&Schmidhuber于1997年提出,后经众多专家学者提炼和推广,现在因性能出色已经被广泛使用。LSTM的设计目的非常明确:解决长期依赖性问题。对LSTM来说,长时间“记住”信息是一种默认的行为,而不是难以学习的东西。RNN是一个包含大量重复神经网络模块的链式形式,在标准RNN里,这些重复的神经网络结构往往也非常简单,比如只包含单个tanh层:LSTM也有与之相似的链式结构,但不同的是它的重复模块结构不同,是4个以特殊方式进行交互的神经网络。这里我们先来看看图中的这些符号:在示意图中,从某个节点的输出到其他节点的输入,每条线都传递一个完整的向量。粉色圆圈表示pointwise操作,如节点求和,而黄色框则表示用于学习的神经网络层。合并的两条线表示连接,分开的两条线表示信息被复制成两个副本,并将传递到不同的位置。LSTMs背后的核心理念LSTMs的关键是cell的状态,即贯穿示意图顶部的水平线。cell状态有点像传送带,它只用一些次要的线**互就能贯穿整个链式结构,这其实也就是信息记忆的地方,因此信息能很容易地以不变的形式从中流过。为了增加/删除cell中的信息,LSTM中有一些控制门(gate)。它们决定了信息通过的方式,包含一个sigmoid神经网络层和一个pointwise点乘操作。sigmoid层输出0到1之间的数字,点乘操作决定多少信息可以传送过去,当为0时,不传送;当为1时,全部传送。 像这样的控制门,LSTM共有3个,以此保护和控制cell状态。深入了解LSTM我们先来看看cell该删除哪些信息,做这个决定的是包含sigmoid层的遗忘门。对于输入xt和ht-1,遗忘门会输出一个值域为[0, 1]的数字,放进细胞状态Ct−1中。当为0时,全部删除;当为1时,全部保留。以之前预测下一个词的语言模型为例,对于“天空中漂浮着云朵,”这个句子,LSTM的cell状态会记住句子主语“云朵”的词性,这之后才能判断正确的代词。等下次再遇到新主语时,cell会“忘记”“云朵”的词性。我们再来看看cell该如何增加新信息。这可以分为两步,首先,LSTM会用一个包含sigmoid层的输入门决定哪些信息该保留,其次,它会用一个tanh层为这些信息生成一个向量C~t,用来更新细胞状态。在语言模型例子中,如果句子变成了“天空中漂浮着云朵,草地上奔跑着骏马”。那LSTM就会用“骏马”的词性代替正在被遗忘的“云朵”的词性。有了遗忘门和输入门,现在我们就能把细胞状态Ct−1更新为Ct了。如下图所示,其中ft×Ct−1表示希望删除的信息,it×Ct表示新增的信息。最后就是决定LSTM输出内容的输出门。它的信息基于cell状态,但还要经过一定过滤。我们先用sigmoid层决定将要输出的cell内容,再用tanh层把cell状态值推到-1和1之间,并将其乘以sigmoid层的输出,以此做到只输出想要输出的部分。实验目的了解如何使用MindSpore加载常用的NLP数据集。了解MindSpore的model_zoo模块,以及如何使用model_zoo中的模型。了解LSTM构建的SentimentNet网络模型的训练和评估。预备知识熟练使用Python,了解Shell及Linux操作系统基本知识。具备一定的深度学习理论知识,如Embedding、Encoder、Decoder、损失函数、优化器,训练策略、Checkpoint等。了解并熟悉MindSpore AI计算框架,MindSpore官网:https://www.mindspore.cn/实验环境MindSpore 1.0.0(MindSpore版本会定期更新,本指导也会定期刷新,与版本配套);CPU/GPU环境。实验准备数据集准备IMDB是一个与国内豆瓣比较类似的与电影相关的网站,而本次实验用到的数据集是这个网站中的一些用户评论。IMDB数据集共包含50000项影评文字,训练数据和测试数据各25000项,每一项影评文字都被标记为正面评价或负面评价,所以本实验可以看做一个二分类问题。IMDB数据集官网:Large Movie Review Dataset。方式一,从斯坦福大学官网下载aclImdb_v1.tar.gz并解压。方式二,从华为云OBS中下载aclImdb_v1.tar.gz并解压。同时,我们要下载GloVe文件,并在文件glove.6B.200d.txt开头处添加新的一行400000 200,意思是总共读取400000个单词,每个单词用200维度的词向量表示。 修改glove.6B.200.txt如下(你可能需要Sublime Text):400000 200the -0.071549 0.093459 0.023738 -0.090339 0.056123 0.32547…确定评价标准作为典型的分类问题,情感分类的评价标准可以比照普通的分类问题处理。常见的精度(Accuracy)、精准度(Precision)、召回率(Recall)和F_beta分数都可以作为参考。精度(Accuracy)=分类正确的样本数目/总样本数目精准度(Precision)=真阳性样本数目/所有预测类别为阳性的样本数目召回率(Recall)=真阳性样本数目/所有真实类别为阳性的样本数目F1分数=(2∗Precision∗Recall)/(Precision+Recall)在IMDB这个数据集中,正负样本数差别不大,可以简单地用精度(accuracy)作为分类器的衡量标准。脚本准备从课程gitee仓库上下载本实验相关脚本。将脚本和数据集组织为如下形式:lstm├── aclImdb│   ├── imdbEr.txt│   ├── imdb.vocab│   ├── README│   ├── test│   ├── train├── glove│   ├── glove.6B.50d.txt│   ├── glove.6B.100d.txt│   ├── glove.6B.200d.txt│   ├── glove.6B.300d.txt└── 脚本等文件实验步骤准备环节。加载数据集,进行数据处理。定义网络。定义优化器和损失函数。在数据集上训练网络,生成模型。得到模型之后,使用验证数据集,查看模型精度情况。导入模块导入MindSpore模块和辅助模块:import osimport mathimport gensimimport argparseimport numpy as npimport mindspore.dataset as dsfrom itertools import chainfrom easydict import EasyDict as edictfrom mindspore import Modelfrom mindspore import Tensor, nn, context, Parameter, ParameterTuplefrom mindspore.nn import Accuracyfrom mindspore.ops import operations as Pfrom mindspore.mindrecord import FileWriterfrom mindspore.common.initializer import initializerfrom mindspore.train.callback import Callback, CheckpointConfig, ModelCheckpoint, TimeMonitor, LossMonitor原文链接:https://gitee.com/mindspore/course/tree/master/lstm
  • [其他] 梯度消失的根源---深度神经网络和反向传播
    在深度学习方法中,深度神经网络的发展造就了我们可以构建更深层的网络完成更复杂的任务,深层网络比如深度卷积网络,LSTM等等,而且最终结果表明,在处理复杂任务上,深度网络比浅层的网络具有更好的效果。但是,目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数  (非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数我们最终的目的是希望这个多元函数可以很好的完成输入到输出之间的映射,假设不同的输入,输出的最优解是 ,那么,优化深度网络就是为了寻找到合适的权值,满足  取得极小值点,比如最简单的损失函数 :假设损失函数的数据空间是下图这样的,我们最优的权值就是为了寻找下图中的最小值点,对于这种数学寻找最小值问题,采用梯度下降的方法再适合不过了。因此,对于神经网络这种参数式的方法,使用梯度更新可以用来寻找最优的参数。
  • [其他] 常见的三种卷积形式
    卷积通常分为三种:valid卷积、full卷积、same卷积valid卷积:下采样卷积,卷积核不超过特征图的范围full卷积:上采样卷积,卷积核可以超过特征图的范围same卷积:特征尺寸在卷积前后不变这三者,相同点在于卷积核的中心与生成的特征图的单元相对应;不同点在于特征值的选取。
  • [基础知识] 【MindSpore易点通】循环神经网络系列之神经网络模型
    一. 概述通过上篇对神经网络组成部分的分析,本篇的内容是基于上篇内容的继承(上篇内容详见:神经网络的组成)。如果从结构上讲,神经网络就是由很多个单一的神经单元组合到一起,这里面的一个神经单元的输出就可以是另一个神经单元的输入,每一个神经元有着各自的功能,通过将这些功能各异的神经元有序组合,就可以构成结构不同、用途不同的神经网络。例如,图1就是一个简单的人工神经网络。图1:神经网络图二. 神经网络模型对于图1神经网络图的解释,我们使用小圆圈来表示神经网络要接受的信号,标上的圆圈中的+1被称为偏置节点(bias)。神经网络最左层用于接受的外部的信息,所以被称为输入层,最右层是经过神经网络处理后最终的输出,也被称为输出层(本例中,输出层只有一个节点)。中间所有节点组成的一层用于变换计算,但看不到具体计算过程,被称为隐藏层,因为我们无法在训练样本集中观测到它们的值。同时也可以看到,以上神经网络的例子中有3个输入单元(维度为3,偏置单元不计在内),3个隐藏单元及一个输出单元。在这里,我们用Lx来表示网络总共有几层,本例中很显然x=3,同时,我们将第1层记为L1,则L1为输入层,L3为输出层。本例的神经网络有训练参数(W,b),其中(W1,b1,W2,b2)其中W1是第l层第j单元与第l+1层的第i单元之间的连接参数,bi则为第l+1层的第i单元的偏置单元。偏置单元是没有输入的,因为它们总是输出+1。同时,我们记第l层的节点数为si。我们用ai表示第l层第i单元的激活值(输出值)。当l=1时,ai=x,也就是第i个输入值(输入值的第i个特征)。对于给定参数集合(W,b),我们的神经网络就可以按照函数h从(x)来计算输出结果,则计算过程:这里用zi来表示第l层第i单元的激活值(包含偏置单元)。 这样我们就可以将激活函数f()扩展写为向量的形式来表示,则上面的等式可以更简洁地写为:上式的计算过程被称为ANN的前向传播。先前我们使用a=x来表示输入层的激活值,依此类推给定第l层的激活值al之后,则第l+1层的激活值a就可以按照如下式子来计算:更直观的结构如图2所示:图2:输入与输出三. 多输出层模型在第二章节中,我们讨论了一种通用的人工神经网络结构,同时,我们也可以构建另种结构的神经网络(这里的结构指的是两个神经元的连接方式),即含有多个隐藏层的神经网络。例如有一个有nl层的神经网络,那么第1层为输入层,第n层是输出层,中间的每个层l与H+1层紧密相联。在这种构造下,很容易计算神经网络的输出值,我们可以按照之前推出的式子,一步一步地进行前向传播,逐个单元地计算第L2层的每个激活值,依此类推,接着是第L3层的激活值,直到最后的第Ln层。这种联接图没有回路或者闭环,所以称这种神经网络为前馈网络。除此之外,神经网络的输出单元还可以是多个。举个例子,图3的神经网络结构就有两层隐藏层:(L2和L3层),而输出层L4层包含两个输出单元。图3:神经网络连接图要求解这样的神经网络,需要样本集(x,y)。如果想要预测的输出是有多个分类的,那么这种神经网络就比较适合,例如检测一张数字图片,就有两个输出。总结神经网络模型是人工智能最基础的模型,它的创新是受益于神经科学家对大脑神经元的研究。神经网络通过我自学习的方式可以获得高度抽象的信息,以及手工特征无法获取到的特征,在计算机视觉领域取得了革命性的突破。而神经网络之所以最近几年在多个工业领域取得的这么大的成功,反向传播算法是一个很重要的原因。可以说,只有深入了解了反向传播算法才可以说真正了解了神经网络的作用过程,下次分享内容主题反向传播,敬请期待。参考文献[1] 陈雷.深度学习与MindSpore实践[M].清华大学出版社:2020.[2] 诸葛越,葫芦娃.百面机器学习[M].人民邮电出版社:2020.[3] 阿斯顿.张,李沐.动手学深度学习[M].人民邮电出版社:2020.
  • [调优经验] 【转载】基于MindSpore的MobileNetV2网络实现Fine-tune(二)
    MobileNetV2的改进线性瓶颈(Linear Bottlenecks)非正式地,对于一组真实图像的输入,我们说这组层激活值(layer activations)形成“感兴趣的流形(manifold of interest)”。 长期以来,人们一直将神经网络中感兴趣的流形嵌入到低维子空间中。 换句话说,当我们查看一个深卷积层的所有单个通道像素时,这些值中编码的信息实际上位于某种流形中,而这些流又可以嵌入到低维子空间中。这两个见解为我们提供了优化现有神经体系结构的经验提示:假设感兴趣的流形是低维的,我们可以通过将线性瓶颈层插入到卷积块中来捕获这一点。 实验证据表明,使用线性层至关重要,因为它可以防止非线性破坏过多的信息。如果感兴趣的流形在ReLU变换后仍保持非零体积,则它对应于线性变换。ReLU能够保留有关输入流形的完整信息,但前提是输入流形位于输入空间的低维子空间中。倒残差(Inverted residuals)瓶颈块看起来类似于残差块,其中每个块包含一个输入,然后是多个瓶颈,然后是扩展。 但是,受直觉的启发,瓶颈实际上包含所有必要的信息,而扩展层仅充当张量的非线性转换的实现细节,我们直接在瓶颈之间使用快捷方式。下图显示了带或不带shortcut的MobileNetV2模块。如果stride = 1,请使用shortcut将输入瓶颈连接到输出瓶颈(在下图的左侧)。如果跨度= 2,则没有shortcut的输入或输出功能(在下图的右侧)。MobileNetV2网络结构MobileNetV2网络总结构如下表所示,请参照src/MobileNetV2.py。定义MobileNetV2Backbone网络(src/MobileNetV2.py)class MobileNetV2Backbone(nn.Cell):    """    MobileNetV2 architecture.    Args:        class_num (int): number of classes.        width_mult (int): Channels multiplier for round to 8/16 and others. Default is 1.        has_dropout (bool): Is dropout used. Default is false        inverted_residual_setting (list): Inverted residual settings. Default is None        round_nearest (list): Channel round to . Default is 8    Returns:        Tensor, output tensor.    Examples:        >>> MobileNetV2(num_classes=1000)    """    def __init__(self, width_mult=1., inverted_residual_setting=None, round_nearest=8,                 input_channel=32, last_channel=1280):        super(MobileNetV2Backbone, self).__init__()        block = InvertedResidual        # setting of inverted residual blocks        self.cfgs = inverted_residual_setting        if inverted_residual_setting is None:            self.cfgs = [                # t, c, n, s                [1, 16, 1, 1],                [6, 24, 2, 2],                [6, 32, 3, 2],                [6, 64, 4, 2],                [6, 96, 3, 1],                [6, 160, 3, 2],                [6, 320, 1, 1],            ]        # building first layer        input_channel = _make_divisible(input_channel * width_mult, round_nearest)        self.out_channels = _make_divisible(last_channel * max(1.0, width_mult), round_nearest)        features = [ConvBNReLU(3, input_channel, stride=2)]        # building inverted residual blocks        for t, c, n, s in self.cfgs:            output_channel = _make_divisible(c * width_mult, round_nearest)            for i in range(n):                stride = s if i == 0 else 1                features.append(block(input_channel, output_channel, stride, expand_ratio=t))                input_channel = output_channel        # building last several layers        features.append(ConvBNReLU(input_channel, self.out_channels, kernel_size=1))        # make it nn.CellList        self.features = nn.SequentialCell(features)        self._initialize_weights()    def construct(self, x):        x = self.features(x)        return x    def _initialize_weights(self):        """        Initialize weights.        Args:        Returns:            None.        Examples:            >>> _initialize_weights()        """        self.init_parameters_data()        for _, m in self.cells_and_names():            if isinstance(m, nn.Conv2d):                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels                m.weight.set_data(Tensor(np.random.normal(0, np.sqrt(2. / n),                                                          m.weight.data.shape).astype("float32")))                if m.bias is not None:                    m.bias.set_data(                        Tensor(np.zeros(m.bias.data.shape, dtype="float32")))            elif isinstance(m, nn.BatchNorm2d):                m.gamma.set_data(                    Tensor(np.ones(m.gamma.data.shape, dtype="float32")))                m.beta.set_data(                    Tensor(np.zeros(m.beta.data.shape, dtype="float32")))    @property    def get_features(self):        return self.features其中InvertedResidual是由三部分组成,如下表所示。输入操作输出功能说明$c_{in}hw$conv2d 1*1, Relu$c_{in} thw$Pointwise卷积$c_{in} thw$depthwise conv2d 3*3 ,Relucint∗hs∗wscint∗hs∗wsDepthwise卷积cint∗hs∗wscint∗hs∗wsconv2d 1*1, linearc∗hs∗wsc∗hs∗wsPointwise卷积注释: 其中t(扩张倍数expand_ratio),c(输出通道数),s(步长stride)InvertedResidual(src/MobileNetV2.py)定义如下所示:class InvertedResidual(nn.Cell):    """    Mobilenetv2 residual block definition.    Args:        inp (int): Input channel.        oup (int): Output channel.        stride (int): Stride size for the first convolutional layer. Default: 1.        expand_ratio (int): expand ration of input channel    Returns:        Tensor, output tensor.    Examples:        >>> ResidualBlock(3, 256, 1, 1)    """    def __init__(self, inp, oup, stride, expand_ratio):        super(InvertedResidual, self).__init__()        assert stride in [1, 2]        hidden_dim = int(round(inp * expand_ratio))        self.use_res_connect = stride == 1 and inp == oup        layers = []        if expand_ratio != 1:            layers.append(ConvBNReLU(inp, hidden_dim, kernel_size=1))        layers.extend([            # dw            ConvBNReLU(hidden_dim, hidden_dim,                       stride=stride, groups=hidden_dim),            # pw-linear            nn.Conv2d(hidden_dim, oup, kernel_size=1,                      stride=1, has_bias=False),            nn.BatchNorm2d(oup),        ])        self.conv = nn.SequentialCell(layers)        self.add = TensorAdd()        self.cast = P.Cast()    def construct(self, x):        identity = x        x = self.conv(x)        if self.use_res_connect:            return self.add(identity, x)        return x其中ConvBNReLU(src/MobileNetV2.py)集成了卷积、BatchNorm和ReLU。depthwise卷积和普通卷积都使用函数nn.Conv2d,区别在于groups参数,当groups等于输入通道数实现depthwise卷积,当groups等于1为普通卷积。class ConvBNReLU(nn.Cell):    """    Convolution/Depthwise fused with Batchnorm and ReLU block definition.    Args:        in_planes (int): Input channel.        out_planes (int): Output channel.        kernel_size (int): Input kernel size.        stride (int): Stride size for the first convolutional layer. Default: 1.        groups (int): channel group. Convolution is 1 while Depthiwse is input channel. Default: 1.    Returns:        Tensor, output tensor.    Examples:        >>> ConvBNReLU(16, 256, kernel_size=1, stride=1, groups=1)    """    def __init__(self, in_planes, out_planes, kernel_size=3, stride=1, groups=1):        super(ConvBNReLU, self).__init__()        padding = (kernel_size - 1) // 2        in_channels = in_planes        out_channels = out_planes        if groups == 1:            conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, pad_mode='pad', padding=padding)        else:            out_channels = in_planes            conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, pad_mode='pad',                             padding=padding, group=in_channels)        layers = [conv, nn.BatchNorm2d(out_planes), nn.ReLU6()]        self.features = nn.SequentialCell(layers)    def construct(self, x):        output = self.features(x)        return outputMobileNetV2Head网络定义MobileNetV2Head网络(src/MobileNetV2.py)class MobileNetV2Head(nn.Cell):    """    MobileNetV2 architecture.    Args:        class_num (int): Number of classes. Default is 1000.        has_dropout (bool): Is dropout used. Default is false    Returns:        Tensor, output tensor.    Examples:        >>> MobileNetV2(num_classes=1000)    """    def __init__(self, input_channel=1280, num_classes=1000, has_dropout=False, activation="None"):        super(MobileNetV2Head, self).__init__()        # mobilenet head        head = ([GlobalAvgPooling(), nn.Dense(input_channel, num_classes, has_bias=True)]                 if not has_dropout else                [GlobalAvgPooling(), nn.Dropout(0.2), nn.Dense(input_channel, num_classes, has_bias=True)])        self.head = nn.SequentialCell(head)        self.need_activation = True        if activation == "Sigmoid":            self.activation = P.Sigmoid()        elif activation == "Softmax":            self.activation = P.Softmax()        else:            self.need_activation = False        self._initialize_weights()    def construct(self, x):        x = self.head(x)        if self.need_activation:            x = self.activation(x)        return x    def _initialize_weights(self):        """        Initialize weights.        Args:        Returns:            None.        Examples:            >>> _initialize_weights()        """        self.init_parameters_data()        for _, m in self.cells_and_names():            if isinstance(m, nn.Dense):                m.weight.set_data(Tensor(np.random.normal(                    0, 0.01, m.weight.data.shape).astype("float32")))                if m.bias is not None:                    m.bias.set_data(                        Tensor(np.zeros(m.bias.data.shape, dtype="float32")))    @property    def get_head(self):        return self.head其他代码解读网络定义和初始化(src/model.py)。def define_net(config, is_training):    backbone_net = MobileNetV2Backbone()    activation = config.activation if not is_training else "None"    head_net = MobileNetV2Head(input_channel=backbone_net.out_channels,                               num_classes=config.num_classes,                               activation=activation)    net = mobilenet_v2(backbone_net, head_net)    return backbone_net, head_net, net定义特征化函数extract_features()(src/dataset.py)。使用Backbone在全量花卉数据集上做一遍推理,得到特征图数据(Feature Maps)。def extract_features(net, dataset_path, config):    features_folder = os.path.abspath(dataset_path) + '_features'    if not os.path.exists(features_folder):        os.makedirs(features_folder)    dataset = create_dataset(dataset_path=dataset_path,                             do_train=False,                             config=config)    step_size = dataset.get_dataset_size()    if step_size == 0:        raise ValueError("The step_size of dataset is zero. Check if the images count of train dataset \                         is more than batch_size in config.py")    model = Model(net)    for i, data in enumerate(dataset.create_dict_iterator(output_numpy=True)):        features_path = os.path.join(features_folder, f"feature_{i}.npy")        label_path = os.path.join(features_folder, f"label_{i}.npy")        if not os.path.exists(features_path) or not os.path.exists(label_path):            image = data["image"]            label = data["label"]            features = model.predict(Tensor(image))            np.save(features_path, features.asnumpy())            np.save(label_path, label)        print(f"Complete the batch {i+1}/{step_size}")    return step_size初始化网络并特征化数据集(train.py)# define networkbackbone_net, head_net, net = define_net(config, args_opt.is_training)if args_opt.pretrain_ckpt and args_opt.freeze_layer == "backbone":    load_ckpt(backbone_net, args_opt.pretrain_ckpt, trainable=False)    step_size = extract_features(backbone_net, args_opt.dataset_path, config)微调(train.py)if args_opt.pretrain_ckpt is None or args_opt.freeze_layer == "none":    loss_scale = FixedLossScaleManager(config.loss_scale, drop_overflow_update=False)    opt = Momentum(filter(lambda x: x.requires_grad, net.get_parameters()), lr, config.momentum, \            config.weight_decay, config.loss_scale)    model = Model(net, loss_fn=loss, optimizer=opt, loss_scale_manager=loss_scale)    cb = config_ckpoint(config, lr, step_size)    print("============== Starting Training ==============")    model.train(epoch_size, dataset, callbacks=cb)    print("============== End Training ==============")else:    opt = Momentum(filter(lambda x: x.requires_grad, head_net.get_parameters()), lr, config.momentum,\                         config.weight_decay)    network = WithLossCell(head_net, loss)    network = TrainOneStepCell(network, opt)    network.set_train()    features_path = args_opt.dataset_path + '_features'    idx_list = list(range(step_size))    rank = 0    if config.run_distribute:        rank = get_rank()    save_ckpt_path = os.path.join(config.save_checkpoint_path, 'ckpt_' + str(rank) + '/')    if not os.path.isdir(save_ckpt_path):        os.mkdir(save_ckpt_path)    for epoch in range(epoch_size):        random.shuffle(idx_list)        epoch_start = time.time()        losses = []        for j in idx_list:            feature = Tensor(np.load(os.path.join(features_path, f"feature_{j}.npy")))            label = Tensor(np.load(os.path.join(features_path, f"label_{j}.npy")))            losses.append(network(feature, label).asnumpy())        epoch_mseconds = (time.time()-epoch_start) * 1000        per_step_mseconds = epoch_mseconds / step_size        print("epoch[{}/{}], iter[{}] cost: {:5.3f}, per step time: {:5.3f}, avg loss: {:5.3f}"\        .format(epoch + 1, epoch_size, step_size, epoch_mseconds, per_step_mseconds,                 np.mean(np.array(losses))))        if (epoch + 1) % config.save_checkpoint_epochs == 0:            save_checkpoint(net, os.path.join(save_ckpt_path, f"mobilenetv2_{epoch+1}.ckpt"))    print("total cost {:5.4f} s".format(time.time() - start))网络参数设定config_cpu = ed({    "num_classes": 5,        # 类别数,根据实验数据集调整    "image_height": 224,     # 参与训练的图片高度    "image_width": 224,      # 参与训练的图片宽度    "batch_size": 64,        # 每批次样本数    "epoch_size": 20,        # 训练次数    "warmup_epochs": 0,      # 学习率变换步数    "lr_init": .0,           # 初始化学习率    "lr_end": 0.0,           # 最终学习率    "lr_max": 0.01,          # 最大学习率    "momentum": 0.9,         # momentum优化器参数    "weight_decay": 4e-5,    # momentum优化器正则化参数    "label_smooth": 0.1,     # 损失函数参数:smooth factor    "loss_scale": 1024,      # "none"方式下损失函数参数,"backbone"方式下无用    "save_checkpoint": True, # 是否保存模型    "save_checkpoint_epochs": 5,    # "backbone"方式下,多少个epochs保存一次模型,"none"方式下无用    "keep_checkpoint_max": 20,      # "none"方式下最多保存多少个模型,"backbone"方式下无用.    "save_checkpoint_path": "./",   # 保存模型路径    "platform": args.platform,      # 平台.可选"CPU", "GPU", "Ascend",这里固定"CPU"    "run_distribute": False,        # 是否并行执行,"CPU"环境下默认False    "activation": "Softmax"         # 最后一层激活函数})注意: 验证实验batch_size设为1,其他参数与训练时一致。微调训练MobileNetV2做微调时,只需要运行train.py。目前train.py时仅支持单卡模式。传入以下参数:--dataset_path:训练数据集地址,无默认值,用户训练时必须输入。--platform:处理器类型,默认为Ascend,可以设置为CPU或GPU。--freeze_layer:冻结网络,选填"none"或"backbone" 。"none"代表不冻结网络,"backbone" 代表冻结网络"backbone" 部分。CPU只支持微调head网络,不支持微调整个网络。所以这里填"backbone"。--pretrain_ckpt:微调时,需要传入pretrain_checkpoint文件路径以加载预训练好的模型参数权重。--run_distribute:是否使用分布式运行。默认为True,本实验中设置为False。方式一: 通过args文件指定运行参数打开src/args.py配置文件,更改train_parse_args函数为如下所示,以此来指定运行默认参数。def train_parse_args():    train_parser = argparse.ArgumentParser(description='Image classification trian')    train_parser.add_argument('--platform', type=str, default="CPU", choices=("CPU", "GPU", "Ascend"), \        help='run platform, only support CPU, GPU and Ascend')    train_parser.add_argument('--dataset_path', type=str, default="../data/flower_photos_train", help='Dataset path')    train_parser.add_argument('--pretrain_ckpt', type=str, default="../pretrain_checkpoint/mobilenetv2_cpu_gpu.ckpt", help='Pretrained checkpoint path \        for fine tune or incremental learning')    train_parser.add_argument('--freeze_layer', type=str, default="backbone", choices=["none", "backbone"], \        help="freeze the weights of network from start to which layers")    train_parser.add_argument('--run_distribute', type=ast.literal_eval, default=True, help='Run distribute')    train_args = train_parser.parse_args()    train_args.is_training = True    return train_args打开命令行终端,cd进入train.py文件目录。输入python train.py来训练网络。方式二: 命令行指定运行参数python train.py --platform CPU --dataset_path ../data/flower_photos_train --freeze_layer backbone --pretrain_ckpt ../pretrain_checkpoint/mobilenetv2_cpu_gpu.ckpt --run_distribute False运行Python文件时在交互式命令行中查看打印信息,打印结果如下:train args: Namespace(dataset_path='../data/flower_photos_train', freeze_layer='backbone', is_training=True, platform='CPU', pretrain_ckpt='../pretrain_checkpoint/mobilenetv2_cpu_gpu.ckpt', run_distribute=True)cfg: {'num_classes': 5, 'image_height': 224, 'image_width': 224, 'batch_size': 64, 'epoch_size': 20, 'warmup_epochs': 0, 'lr_init': 0.0, 'lr_end': 0.0, 'lr_max': 0.01, 'momentum': 0.9, 'weight_decay': 4e-05, 'label_smooth': 0.1, 'loss_scale': 1024, 'save_checkpoint': True, 'save_checkpoint_epochs': 5, 'keep_checkpoint_max': 20, 'save_checkpoint_path': './', 'platform': 'CPU', 'run_distribute': False, 'activation': 'Softmax'}Complete the batch 1/56Complete the batch 2/56Complete the batch 3/56...Complete the batch 54/56Complete the batch 55/56Complete the batch 56/56epoch[1/20], iter[56] cost: 8033.059, per step time: 143.447, avg loss: 1.276epoch[2/20], iter[56] cost: 7573.483, per step time: 135.241, avg loss: 0.880epoch[3/20], iter[56] cost: 7492.869, per step time: 133.801, avg loss: 0.784epoch[4/20], iter[56] cost: 7391.710, per step time: 131.995, avg loss: 0.916epoch[5/20], iter[56] cost: 7421.159, per step time: 132.521, avg loss: 0.827epoch[6/20], iter[56] cost: 7474.850, per step time: 133.479, avg loss: 0.828epoch[7/20], iter[56] cost: 7415.375, per step time: 132.417, avg loss: 0.796epoch[8/20], iter[56] cost: 7369.605, per step time: 131.600, avg loss: 0.714epoch[9/20], iter[56] cost: 7457.325, per step time: 133.167, avg loss: 0.700epoch[10/20], iter[56] cost: 7545.579, per step time: 134.742, avg loss: 0.739epoch[11/20], iter[56] cost: 8036.823, per step time: 143.515, avg loss: 0.685epoch[12/20], iter[56] cost: 7922.403, per step time: 141.471, avg loss: 0.666epoch[13/20], iter[56] cost: 8000.985, per step time: 142.875, avg loss: 0.665epoch[14/20], iter[56] cost: 7997.285, per step time: 142.809, avg loss: 0.657epoch[15/20], iter[56] cost: 7973.143, per step time: 142.378, avg loss: 0.655epoch[16/20], iter[56] cost: 7872.075, per step time: 140.573, avg loss: 0.649epoch[17/20], iter[56] cost: 7925.634, per step time: 141.529, avg loss: 0.646epoch[18/20], iter[56] cost: 7949.169, per step time: 141.949, avg loss: 0.645epoch[19/20], iter[56] cost: 7692.628, per step time: 137.368, avg loss: 0.641epoch[20/20], iter[56] cost: 7353.783, per step time: 131.318, avg loss: 0.640total cost 156.8277 s注意: 特征化与batch_size、image_height、image_width参数有关,不同的参数生成的特征文件不同。当改变这几个参数时,需要删除../data/flower_photos_train_features文件夹,以便重新生成。因为当特征文件夹(flower_photos_train_features)存在时,为了节约时间,会特征化过程。验证模型使用eval.py在验证集上验证模型性能,需要传入以下参数:--dataset_path:测试数据集地址,无默认值,用户测试时必须输入。--platform:处理器类型,默认为“Ascend”,可以设置为“CPU”或“GPU”。本实验设置为“CPU”--pretrain_ckpt:fine-tune后生成的Backbone+Head模型Checkpoint文件。--run_distribute:是否使用分布式运行。默认值为False,本实验中无需修改。注意: batch_size必须小于等于验证集的大小,可以修改src/config.py文件的第26行如下"batch_size": 50,**方式一: ** 通过args文件指定运行参数打开src/args.py配置文件,更改eval_parse_args函数为如下所示,以此来指定运行默认参数。def eval_parse_args():    eval_parser = argparse.ArgumentParser(description='Image classification eval')    eval_parser.add_argument('--platform', type=str, default="CPU", choices=("Ascend", "GPU", "CPU"), \        help='run platform, only support GPU, CPU and Ascend')    eval_parser.add_argument('--dataset_path', type=str, default="../data/flower_photos_test", help='Dataset path')    eval_parser.add_argument('--pretrain_ckpt', type=str, default="./ckpt_0/mobilenetv2_20.ckpt", help='Pretrained checkpoint path \        for fine tune or incremental learning')    eval_parser.add_argument('--run_distribute', type=ast.literal_eval, default=False, help='If run distribute in GPU.')    eval_args = eval_parser.parse_args()    eval_args.is_training = False    return eval_args打开命令框,cd进入eval.py文件目录。输入python eval.py来训练网络。方式二: 通过命令行指定运行参数python eval.py --platform CPU --dataset_path ../data/flower_photos_test  --pretrain_ckpt ./ckpt_0/mobilenetv2_{epoch_num}.ckpt  --run_distribute False运行Python文件时在命令行中会打印验证结果:result:{'acc': 0.9038461538461539}pretrain_ckpt=./ckpt_0/mobilenetv2_20.ckpt原文链接:https://gitee.com/mindspore/course/tree/master/fine_tune
  • [其他] 优化深度神经网络的基本思想
    优化算法在网络结构确定之后,我们需要对网络的权值(weights)进行优化。一起来聊聊优化深度神经网络的基本思想。梯度下降(gradient descent,GD) 想象你去野足但却迷了路,在漆黑的深夜你一个人被困住山谷中,你知道谷底是出口但是天太黑了根本看不清楚路。于是你确定采取一个贪心(greedy)算法:先试探在当前位置往哪个方向走下降最快(即梯度方向),再朝着这个方向走一小步,重复这个过程直到你到达谷底。这就是梯度下降的基本思想。梯度下降算法的性能大致取决于三个因素。1. 初始位置。如果你初始位置就离谷底很近,自然很容易走到谷底。2. 山谷地形。如果山谷是“九曲十八弯”,很有可能你在里面绕半天都绕不出来。3. 步长。你每步迈多大,当你步子迈太小,很可能你走半天也没走多远,而当你步子迈太大,一不小心就容易撞到旁边的悬崖峭壁,或者错过了谷底。误差反向传播(error back-propagation,BP) 结合微积分中链式法则和算法设计中动态规划思想用于计算梯度。 直接用纸笔推导出中间某一层的梯度的数学表达式是很困难的,但链式法则告诉我们,一旦我们知道后一层的梯度,再结合后一层对当前层的导数,我们就可以得到当前层的梯度。动态规划是一个高效计算所有梯度的实现技巧,通过由高层往低层逐层计算梯度,避免了对高层梯度的重复计算。滑动平均(moving average) 要前进的方向不再由当前梯度方向完全决定,而是最近几次梯度方向的滑动平均。利用滑动平均思想的优化算法有带动量(momentum)的SGD、Nesterov动量、Adam(ADAptive Momentum estimation)等。自适应步长 自适应地确定权值每一维的步长。当某一维持续震荡时,我们希望这一维的步长小一些;当某一维一直沿着相同的方向前进时,我们希望这一维的步长大一些。利用自适应步长思想的优化算法有AdaGrad、RMSProp、Adam等。学习率衰减 当开始训练时,较大的学习率可以使你在参数空间有更大范围的探索;当优化接近收敛时,我们需要小一些的学习率使权值更接近局部最优点。深度神经网络优化的困难 有学者指出,在很高维的空间中,局部最优是比较少的,而大部分梯度为零的点是鞍点。平原区域的鞍点会使梯度在很长一段时间内都接近零,这会使得拖慢优化过程。
  • [技术干货] 深度学习的现实应用
    近年来掀起的深度学习革命已经深刻地改变了诸多应用领域,并将在越来越多的领域取得成功。其中最广为人知的领域包括自动语音识别、图像识别、自然语言理解及很多其他交叉领域(如医疗、生物、金融等)。下面将依次简单介绍这些深度学习的典型现实应用。1.3.1 自动语音识别自动语音识别(Automatic Speech Recognition,ASR)是一项将语音转换成文本的技术。从早期的基于模板的方法到严格的统计模型,再到如今的深度模型,语音识别技术已经经历了几代的更迭。在深度学习模型之前,自动语音识别的主流模型是隐马尔可夫模型(Hidden Markov Models,HMM)。在使用这些模型之前,所有的自动语音识别系统都需要经历四个步骤:特征提取、声学模型、语言模型和解码搜索。在进入声学模型之前,需要消除噪声和增强信号,并将信号从时域转换到频域。声学模型主要用来进行特征的转换与表示,再通过一个语言模型,在解码搜索中对模型的结果进行排序并选取得分最高的文本序列。早期应用于声学建模的深度模型是普通的深度神经网络(Deep Neural Networks,DNN),但DNN需要固定大小的输入,因而需要一种能够处理不同长度语音信号的方法。另外,考虑到语音信号是一种非平稳时序信号,如何有效地对长时时序动态相关性进行建模也颇为重要。而这些恰好是循环神经网络的强项。因此,目前主流的自动语音识别深度学习模型是循环神经网络的变种——长短期记忆网络(Long ShortTerm Memory,LSTM)。以循环神经网络为基础的语音识别系统极大地减少了识别错误率,被广泛应用于目前商业上主流的语音识别设备(如亚马逊的Alexa)上。1.3.2 图像识别图像识别是深度学习最成功的应用之一。深度学习在计算机视觉领域的突破发生在2012年,Hinton教授的研究小组利用卷积神经网络架构(AlexNet)大幅降低了ImageNet ILSVRC挑战中图像分类任务的错误率并取得了冠军。之后不断有新的基于卷积神经网络的架构被提出,包括GoogleNet、VGGNet、ResNet、DenseNets和Inception。这些模型在不断加深网络深度的同时,也能不断提升图像分类的准确率。同时,深度学习也被应用于其他计算机视觉任务中,包括目标检测、图像分割、图像标注、行为分析、人脸识别,以及基于生成对抗网络(Generative Adversarial Networks,GAN)的图形风格迁移、视频生成等。在这些应用的背后,起到关键作用的深度学习模型当属深度卷积神经网络。卷积神经网络中最重要的操作是卷积和池化。受益于参数共享和稀疏连接,卷积神经网络非常适合处理图像数据。通过堆叠很多层,卷积神经网络可以不断地从低层特征中提取更高层的特征,最终更好地进行下游任务的处理。目前各种新的网络架构仍在不断被提出,我们期望深度学习在图像识别领域不断取得新的成果。1.3.3 自然语言处理神经网络从2000年开始就逐渐被应用到语言模型中,在成分解析、情感分析、信息抽取、机器翻译、文本分类等自然语言理解的任务上均取得了好的结果。其中,一项重要成果就是词向量的学习。词向量可以看作是一种运用深度神经网络将词转换成隐含空间中的一个向量化的位置表示的方法。将词向量作为循环神经网络的输入,能有效利用合成式的向量语法对句子和短语进行解析。合成式的向量语法可以被认为是由循环神经网络实施的上下文无关的概率语法。另一方面,以长短期记忆网络为代表的循环神经网络在机器翻译和语言模型等方面的表现也较为突出。近年来,除了循环神经网络之外,新的一些深度神经网络结构(如Transformer)也不断被提出,它们通过学习文本序列中的长期依赖和分层结构,在自然语言处理的任务上取得了显著的效果。此外,基于预训练的无监督模型,如建立在Transformer基础上的BERT(Bidirectional Encoder Representations from Transformers)模型,采用迁移学习和微调的方法,进一步刷新了深度学习方法在自然语言处理任务上的技术前沿。到目前为止,面向自然语言处理任务的深度学习架构仍在不断进化,与强化学习、无监督学习等的结合应该会带来效果更优的模型。1.3.4 其他领域深度学习在其他领域(如生物学、医疗和金融等)也有很多应用。在生物学研究中,深度学习算法可以发现人类无法捕捉到的特征。研究人员利用这些算法对细胞图像进行分类,建立基因组连接,加速药物发明周期。在医疗领域,深度卷积神经网络被应用于癌细胞分类、病变检测、器官分割和图像增强等医疗图像分析任务中,并取得了不错的成果。在金融领域,深度学习被应用于金融欺诈检测和反洗钱等任务,也可以通过模拟交易员的行为,完成选股、择时、风控等较为复杂的任务。此外,深度学习在异常检测和信用评分等领域也有应用。                                                                                                                                本文转载自华为云社区 作者:HWCloudAI