• [基础知识] What's Anomaly Detection ?
    异常检测是一个发现“少数派”的过程。异常检测一直是机器学习中一个非常重要的子分支,在各种人工智能落地应用例如计算机视觉、数据挖掘、NLP中,异常检测算法都是很热门的研究方向,特别是大数据时代,人工处理数据的速度已经远远赶不上机器了,所以更快地检测数据中的异常情况成为了我们当下非常重要的任务。在深度学习广泛的推广之前,传统的异常检测算法有很多,例如高斯拟合,半监督学习等等,而在深度学习大火之后,人们也开始研究将深度学习应用于各种异常任务中(也就是Deep Anomaly Detection,以下统称DAD),并取得了很大的成功,本文将把当下该方向热门的研究方向分类并列举了对应的文章,希望能帮助大家更好地理解此方向的研究。                                         异常检测,从定义而言就是一种识别不正常情况与挖掘非逻辑数据的技术,也叫outliers。例如在计算机视觉的应用中,有人在抖音发表一个视屏,在边骑车边打电话,那这就是个不符合规范的视屏,我们能否采用一些方式来将其检测出来,再例如在数据挖掘领域中,那异常检测的应用就更广泛了,比如信用卡盗刷,超大金额支出等等。通常情况下,在我们阅读论文的过程中,异常检测(Anomaly Detection)也被叫做,Novelty Detection,Outlier Detection,Forgery Detection,Out-of-distribution Detection。在阅读论文的情况,这些名词也有轻微的区别,以计算机视觉为例,如下图所示。                                                                               在计算机视觉的基本任务——图像分类中,单分类与多分类问题,将几种概念的细微区别基本阐述清楚了。Anomaly Detection指在不属于该分类的数据集中,而Novelty是检测可能属于该分类但却没见过(Unseen)也就是Novel的数据集,而OOD(out-of-distribution)则是多分类中不同目标的分布,这些任务在接下来的论文中,也经常有人进行相应的研究。                                                             
  • [基础知识] 小样本学习INTRODUCTION
    Few-shot learning (FSL) 在机器学习领域具有重大意义和挑战性,是否拥有从少量样本中学习和概括的能力,是将人工智能和人类智能进行区分的明显分界点,因为人类可以仅通过一个或几个示例就可以轻松地建立对新事物的认知,而机器学习算法通常需要成千上万个有监督样本来保证其泛化能力。原则上我们将FSL方法分为基于生成模型和基于判别模型两种,其中基于元学习的FSL方法值得特别注意。到目前为止,FSL有一部分比较重要的应用,涵盖了计算机视觉,自然语言处理,音频和语音,强化学习和数据分析等许多研究热点,可以说是一个很有发展前景的方向。INTRODUCTION作为人类,其中一个显著的标志就是能够仅通过一个或几个示例就快速建立对新概念的认知能力。许多认知学和心理学证据表明,人类可以通过很少的图像来识别视觉对象,甚至儿童也可以通过仅一次的接触去记住一个新单词。尽管没有确切的证据解释人类从少量样本中学习和概括能力的实现机制,但是一些神经生物学学者认为,人类杰出的学习和认知能力得益于其前额叶皮层(PFC)和人脑的工作记忆机制 ,尤其是PFC特定的神经生物学机制与先前存储在大脑中的记忆之间的相互作用。相比之下,大多数尖端的机器学习算法都需要大量数据,尤其是最广为人知的深度学习,即使它已将人工智能推向了新的高潮,在视觉,文本,语音等广泛的研究领域中均取得了令人瞩目的成就。一般来讲,深度学习的成功可以归结于三个关键因素:强大的计算资源(例如GPU)、复杂的神经网络(如CNN、LSTM)、大规模数据集。但是,由于诸如隐私,安全性或数据的高标签成本等一系列因素,许多现实的应用场景(例如在医学,军事和金融领域)没有条件获取足够的带标签的训练样本,因此,如何使得一个机器学习/深度学习系统能够从非常少量的样本中高效地学习和推广其认知能力,成为许多机器学习/深度学习研究人员迫切期待实现的蓝图。    从高层的角度来看,研究小样本学习(FSL)的理论和实践意义主要来自三个方面:首先,FSL方法预计不会依赖大规模的训练样本,从而避免了某些特定应用中数据准备的高昂成本。FSL可以缩小人类智能与人工智能之间的距离,这是发展通用类型AI的必经之路。FSL可以为一项新出现的、可采集样本很少的任务实现低成本,快速的模型部署。尽管上述的实践意义非常令人鼓舞,但由于其理论中固有的难度(即数据规模问题),对于FSL的研究在过去的几十年里,比起利用大量数据进行的机器学习研究要缓慢很多。从以上可以看出,如果一个学习算法只使用普通的ML/DL学习技术来处理一个FSL任务,而没有任何复杂的学习策略或特定的网络设计,那么得到的算法模型将面临严重的过拟合问题。小样本学习(FSL)可以追溯到2000年初,也称为small-sample learning, few-shot learning或者one-shot learning,这个概念(FSL)正交于zero-shot learning(ZSL),那是机器学习的另一个热门话题。ZSL的设置需要特定于概念的辅助信息,以支持跨概念的知识传递信息,这与FSL的信息大不相同。参考来源:https://zhuanlan.zhihu.com/p/258562899
  • [基础知识] Transformer简介(四)——终章
    长着很多头的野兽 论文通过添加一种名为“多头”注意力的机制,进一步完善了自注意力层。这样可以通过两种方式提高注意力层的性能: 1、它扩展了模型专注于不同位置的能力。是的,在上面的例子中,z1包含所有其他编码的一小部分,但是它可能由实际单词本身主导。如果我们要翻译这样的句子,例如“The animal didn’t cross the street because it was too tired”,那么我们会想知道这里面的“it”指的是什么。 2、它为注意力层提供了多个“表示子空间”(representation subspaces)。正如我们接下来将要看到的,在多头注意力机制下,我们拥有多组Query/Key/Value权重矩阵(Transformer使用八个注意力头,因此每个编码器/解码器最终都能得到八组)。这些集合中的每一个都是随机初始化的。然后,在训练之后,将每个集合用于将输入的embedding(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。                                                             在多头注意力下,我们单独为每个头维护不同的Q / K / V权重矩阵,从而就会得到不同的Q / K / V矩阵。就像之前那样,我们将X乘以WQ / WK / WV矩阵以生成Q / K / V矩阵。 如果我们执行上面概述的自注意力计算,每次使用不同的权重矩阵,计算八次,我们最终将得到八个不同的Z矩阵。                                                                 这给我们带来了一些挑战。前馈层所预期的并不是8个矩阵,而是一个单一的矩阵(每个单词一个向量)。因此,我们需要一种方法来将这八个矩阵压缩为单个矩阵。 我们该怎么做?我们把这些矩阵合并,然后将它们乘以一个另外的权重矩阵WO。                                                                          这差不多就是多头注意力的全部内容。我发现其中的矩阵还是很多的。下面我试试将它们全部放在一个视图中,以便我们可以统一查看。                                                                        既然我们已经涉及到注意力头的内容,那么让我们重新回顾一下前面的例子,看看在示例句中对“ it”一词进行编码时,不同的注意力头关注的位置分别在哪:                                                                                当我们对“it”一词进行编码时,一个注意力头专注于“the animal”一词,而另一个则专注于“tired”一词——从某种意义上来说,模型对单词“it”的表示既依赖于对“animal”的表示又依赖于对“tired”的表示。 但是,如果我们将所有的注意力头都加到图片中,则可能会比较难以直观解释:                                                                                    使用位置编码表示序列的顺序 到目前为止,我们对这个模型的描述中尚且缺少一种表示输入序列中单词顺序的方法。 为了解决这个问题,Transformer为每个输入的embedding添加一个向量。这些向量遵循模型学习的特定模式,能够帮助我们确定每个单词的位置,或序列中不同单词之间的距离。在这个地方我们的直觉会是,将这些值添加到embedding中后,一旦将它们投影到Q / K / V向量中,以及对注意力点积,就可以在embedding向量之间提供有意义的距离。                                                              为了使模型感知到单词的顺序,我们添加了位置编码向量,它的值遵循特定的规律。 如果我们假设embedding的维数为4,则实际的位置编码则应如下图所示:                                                                 一个真实示例,其embedding大小为4的位置编码 这种规律看起来会是什么样的? 在下图中,每行对应一个向量的位置编码。因此,我们要把第一行添加到输入序列中第一个单词的embedding向量。每行包含512个值,每个值都在1到-1之间。我们对它们进行了颜色编码,从而使变化规律更加明显。                                                                 一个真实例子的位置编码,embedding大小为512(列),20个单词(行)。你会发现,它看起来像是从中心位置向下分开的。这是因为左半部分的值是由一个函数(使用正弦函数)生成的,而右半部分的值是由另一个函数(使用余弦函数)生成的。然后它们被合并起来形成每个位置的编码向量。 论文中描述了位置编码用到的公式(第3.5节)。你可以在get_timing_signal_1d()中查看用于生成位置编码的代码。这不是唯一的位置编码方法。但是,它的优势在于能够放大到看不见的序列长度(例如,我们训练后的模型被要求翻译一个句子,而这个句子比我们训练集中的任何句子都长)。 (代码地址:https://github.com/tensorflow/tensor2tensor/blob/23bd23b9830059fbc349381b70d9429b5c40a139/tensor2tensor/layers/common_attention.py) 2020年7月更新:上面显示的位置编码来自Transformer的Tranformer2Transformer实现。论文中用的方法略有不同,论文中没有直接链接,而是将两个信号交织。下面的图显示了这种方式的样子。这是用来生成它的代码:https://github.com/jalammar/jalammar.github.io/blob/master/notebookes/transformer/transformer_positional_encoding_graph.ipynb 
  • [基础知识] Transformer简介(三)——浅析
    自注意力浅析 首先,让我们看一下如何使用向量来计算自注意力,然后着眼于如何使用矩阵来实现。 计算自注意力的第一步是依据每个编码器的输入向量(在这种情况下,是每个单词的embedding)创建三个向量。因此,对于每个单词,我们创建一个Query向量,一个Key向量和一个Value向量。通过将embedding乘以我们在训练过程中训练的三个矩阵来创建这些向量。 请注意,这些新向量的维数小于embedding向量的维数。新向量的维数为64,而embedding和编码器输入/输出向量的维数为512。新向量不一定非要更小,这是为了使多头注意力(大部分)计算保持一致的结构性选择。                                                                    x1乘以WQ权重矩阵可得出q1,即与该单词关联的“Query”向量。我们最终为输入句子中的每个单词创建一个“Query”,一个“Key”和一个“Value”投射。 什么是“Query”,“Key”和“Value”向量? 它们是一种抽象,对于注意力的计算和思考方面非常有用。继续阅读下面的注意力计算方式,你几乎就能了解所有这些媒介所起的作用了。 计算自注意力的第二步是计算一个分数(score)。假设我们正在计算这个例子中第一个单词“Thinking”的自注意力。我们需要根据该单词对输入句子中的每个单词打分。这个分数决定了当我们为某个位置的单词编码时,在输入句子的其他部分上的重视程度。 分数是通过将Query向量的点积与我们要评分的各个单词的Key向量相乘得出的。因此,如果我们正在处理位置#1上的单词的自注意,则第一个分数将是q1和k1的点积。第二个得分将是q1和k2的点积。                                                                      第三和第四步是将分数除以8(论文中使用的Key向量维数的平方根,即64。这将引入更稳定的渐变。此处也许会存在其他可能的值,但这是默认值),然后将结果通过一个softmax操作传递。Softmax对分数进行归一化,使它们均为正数,并且和为一。                                                                               这个softmax分数将会决定在这个位置上的单词会在多大程度上被表达。显然,当前位置单词的softmax得分最高,但有时候,注意一下与当前单词相关的另一个单词也会很有用。第五步是将每个Value向量乘以softmax分数(对后续求和的准备工作)。这里直觉的反应是保持我们要关注的单词的value完整,并压过那些无关的单词(例如,通过把它们乘以0.001这样的很小的数)。第六步是对加权向量进行求和。这将在此位置(对于第一个单词)产生自注意层的输出。                                                                      这样就完成了自注意力的计算。生成的向量是可以被发送到前馈神经网络的。但是,在实际的实现过程中,此计算以矩阵形式进行,以实现更快的处理速度。现在,看完了单词级计算,让我们接着看矩阵计算吧。 自注意力的矩阵计算 第一步是计算Query,Key和Value矩阵。我们将嵌入内容打包到矩阵X中,然后将其乘以我们训练过的权重矩阵(WQ,WK,WV)。                                                                  X矩阵中的每一行对应于输入句子中的一个单词。我们再次看到嵌入向量(图中的512或4个框)和q / k / v向量(图中的64或3个框)的大小差异。 最后,由于我们要处理的是矩阵,因此我们可以通过一个公式将步骤2到6压缩来计算自注意力的输出。                                                                 矩阵形式的自注意力计算参考资源:https://mp.weixin.qq.com/s/dWgqwFjYmtj5CwYyuFvEGw
  • [AI人工智能全栈成长...] 【问答官】有没有小伙伴有各种深度学习网络的结构图?
    有收藏深度学习网络结构图的小伙伴能否共享一下?如ResNet:
  • [AI人工智能全栈成长...] 【问答官】学习深度学习需要懂的数据结构和算法有哪些?
    想要从数据结构和算法的层面去理解深度学习,需要做哪些尝试?
  • [其他] 如何评价深度学习领域中的Transformer架构?
    Google 2017年提出了Transformer模型,之后席卷了整个NLP领域,红极一时的BERT、GPT-2都采用了基于Transformer的架构,现在都用到CV领域了,用于目标检测和全景分割的DETR就是代表,Transformer咋这么强呢?怎么评价它在各领域的通用性啊?
  • [技术干货] 数学物理与深度学习(1)【原创】
    # 深度学习,共形场论和对称函数 ## 非线性,过拟合与压缩感知 深度学习中,一个非常难以解决的问题是过拟合问题。过拟合的一个解释是参数空间太大,即参数过多。但这个解释非常的浅层。因为如果我们觉得参数过多,那么就可以减少参数啊。但问题的关键在于,正如我们并不知道应该增加什么特征一样,我们也并不知道减少参数的原则。所以有一种叫Dropout 的方法来随机减少节点从而达到减少参数的目的。这都是非常机械的办法来处理过拟合困难。 那么有没有合适的理论框架能够处理增加/减少参数以抑制欠拟合/过拟合的机制呢? 这首先得回到深度学习的本质上来。学习的本质是在输入数据到输出数据之间建立映射关系。数学上即定义了输入到输出的函数关系。那么,这样的函数关系是如何建立的呢?实际上,深度学习的核心算法是反向传播算法,它与物理上的变分法求解经典运动方程是一致的。本质上也是一个最小作用量原理,只不过在深度学习中使用的不是作用量,而是代价函数。 在物理学中,得到的函数一般是经典运动方程的解。有些时候我们得到的解非常简单,就是平面波解。这样的解当然非常稳定。它可以精确预测被研究客体的某时某刻的状态。但是,如果势函数是非线性的,那么就可能带来非常不一样的非线性解。比如海面上的波在微分的吹拂下可以呈现平面波的性质。但在大风的情形下就会有海浪出现,海浪是典型的非线性波,它是高度不稳定的波。水波的顶部会变尖并倒塌,这种不稳定波的状态无法确定。因为一个非常小的扰动都可能造成极其不可控的结果。这在物理上被称作是非线性效应,它有个广为人知的名字:蝴蝶效应。造成这种现象的本质的原因是因为存在多个波的相互作用,而且相互作用很大,超越了水这种介质的粘滞系数的内作用力。直接的结果就是多个水面波形成的波包会碎裂。也就形成了海浪这种波。在这个物理系统中,我们如果想用得到的非线性波来预测它一段时间后的波形注定是徒劳的!这是因为我们始终认为小的扰动不会偏离原先的波形,但实际上,非线性波是破坏这种认知的。所以,物理告诉我们的事实是:即便没有发生过拟合,也可能得到不稳定的无法预测的解。 但是这种非线性效应在深度学习中往往不会考虑到,因为我们往往会进行多次计算,并且趋于收敛。因此发散的解不会被我们触碰到。然而,是不是非线性解就不重要呢?恰恰相反,非线性解才是深度学习中最基本的解。 ![figure1.jpg](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202010/22/1527075mv0pkxysdegg4yd.jpg) 在上面的(a)中,是一个典型的非线性解。它可以看作是一个一元高次函数的片段。即: $$ y = \sum_{n=0}^N a_n x^n \quad (1) $$ 而(b)则是一个线性解,它的一般形式是: $$ y = a*x + b \quad (2)$$ 显然,(a) 对应于过拟合的情形,而 (b) 则对应于欠拟合的情形。一个简单的道理是,非线性越强,则拟合曲线抖动的越厉害。 而欠拟合往往是抹平了抖动。假如我们将N个样本点 $$ \wedge_{i=1}^N\{ \vec{x} ^{(i)}, y^{(i)} \} \quad (3)$$ 看作是待拟合曲线附近的点,我们将这些点按照${x_0}$值的大小排列起来。$x_0$ 可以是任意设定的一个维度,它类似于时间的意义。那么截取一段范围的窗口,我们就可以将这些标记点看作是信号波。运用小波分析,可以将其中的特征频率分离开来。如果得到的频谱分离度不够,得到的特征频率很多,那么就会造成曲线剧烈抖动。这个分波过程实际上是决定了特征的表示空间的维度。表示空间越高,意味着超参数越多,也就会造成拟合曲线自由下降的方向越多。这就会很显然的带来过度拟合。某些不重要的维度的存在本身就是缺陷,因为它会造成势函数的大量鞍点,影响最优化训练的速度。虽然有momentum 等方法来加速训练,但必须意识到,这样的维度本身就不应该被训练。另一方面,假如存在很多的冗余维度,那么存在一种可能性,这些冗余维度本身形成了超参空间的局部最优,即便使用动量之类的手段,最终在这些维度上,也会倾向于这些冗余维度的局部最优解。这种冗余性甚至会掩盖掉某些真正重要的特征,因为它们往往在很少的几步迭代下,就得到了最优解,而重要指标往往需要多次迭代。最后导致这些冗余维度虽然在一开始权重不大,多次迭代后,这些冗余维度的权重超越了真正的重要维度。这对于深度学习而言,是灾难性的结果。 **所以,对于真正重要的特征来说,一个特别重要的问题是它的内禀维度究竟是多少?** 在计算机视觉领域,在卷积神经网络中,只是机械的将每个子图截取到的部分看作是特征,并没有对每个图进行维度分析,这就留下了很多过拟合的隐患。 ** 去芜存菁,势在必行。** 我们需要去除的是特征中的冗余维度,这些维度的非线性响应特别灵敏。如果单纯从响应的角度来看,很难去针对每一个维度进行分析。所以我们可以采用系统性响应的办法来处理。即在卷积截取的特征上掺入随机杂质。掺杂本身需要考虑特征本身的频率,否则杂质的噪声水准会掩盖一切。掺入噪声实际上会阻碍获得特征的精细维度结构。在动力学上,相当于引入了色散。色散的本质就是将子波展宽,压平,这恰好是和非线性波的特征是相反的。如果只有色散,那么波最终会展平消失,如果只有非线性,那么波会变尖崩塌。这两者恰恰是竞争关系的。所以引入合适的色散项能够将非线性波稳定,最终形成物理上所谓的孤子波。这种孤子波是非常稳定的。它具有极佳的抗干扰性。 上面的分析都是基于物理学的。我们在深度学习的操作层面如何来实现呢?实际上,压缩感知算法就是如何用稀疏特征频率来重构数据的方法。陶哲轩,Donoho, Candes三人提出的这个划时代的算法,其中的重要一步就是将现有的特征频率来引入特征噪声,然后递归解析出重要的其他特征频率,而把不重要的特征频率全部过滤掉。这个引入特征频率噪声的办法竟然出奇的简单,就是采用随机采样。 --- ![figure2.jpg](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202010/22/1527299jqup1ma1gsurj33.jpg) --- 而这样采样后的重构过程如下图: --- ![figure3.jpg](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202010/22/152735iu7k1m7dyl8ypr4e.jpg) --- 上图摘自知乎博文 ```js https://zhuanlan.zhihu.com/p/22445302 ``` . 压缩感知后的特征不仅仅保留了绝大部分原先的特征的特性,它还更加干净了。这正是我们想要的结果。 在去年(2019年5月)的 Deep Compressed Sensing (arxiv:1905.06723)一文中就是这样实现的。更精妙的是,这样的算法居然和生成对抗有异曲同工之妙,实际上,在这篇论文中,生成对抗的算法可以看作是深度压缩感知的一个特例。最让人意外的是,深度压缩感知用了更少的训练时间,得到了超越 GAN 的性能。所以这对于深度学习来说,也是一个算法上的革命。实际上,仔细分析 GAN 算法,其实它也是对神经网络进行干扰。生成器本身就是为了对抗鉴别器而存在的。最终的目标是生成器打败鉴别器。这与压缩感知的目标是一致的。压缩感知的最终目标是用更少的特征维度重构数据。 ** 那么,从数学物理的维度来看,人工智能未来的算法进步的方向在何方?** 深度压缩感知解决的是维度问题,也就是特征的量纲。物理学上,仅有量纲是远远不够的。我们还需要更进一步分析其对称性以及映射。在神经网络中,每一次映射,都可以看作是一个演化。
  • [热门活动] 业界首个全场景AI实战营来袭!从小白到大牛只需21天
    2020年了,你还只会调参吗?只会算法调参不会底层开发是否还具有竞争力?大家都会各种编程语言和深度学习框架,你还只会写最简单的网络层,不会高性能计算,没有实际经验又如何获得面试官的青睐呢?要想跑得远,工具得要好。如果能掌握一门性能高又好开发的深度学习框架,对于日常的学习无疑是巨大的加速器。一个框架如果拥有好的图层IR,是AI框架进行高效训练和推理的基础。目前业界的AI框架有三种执行模式:Eager执行模式、图执行模式和Staging(混合)执行模式。MindSpore的图层IR:MindIR,选择的技术路线是采用Functional Graph IR,能够更自然的自动微分实现方式和更方便的隐式并行分析能力,将控制流和数据流合一,更适合JIT优化。背靠全新的设计理念,我们推出了MindSpore深度学习实战营,帮助小白更快的上手高性能深度学习框架,快速训练ResNet-50,实现你的第一个手机App开发,学会智能新闻分类、篮球检测和「猜你喜欢」模型!为什么是21天实战营?7天时间有限,知识点少,不适合初学者的打基底学习;3个月时间过长,知识点繁冗复杂,不利初学者坚持学习和保持学习兴趣。MindSpore深度学习实战营,通过21天的合理课程安排,不仅提供目前大热的移动端部署介绍,还有紧跟时事的趣味实践,更有深度的底层开发讲解,让你从框架到算法到开发,都能一网打尽。课程内容安排01基于MindSpore Lite开发图像分类的安卓APP实战MindSpore Lite是MindSpore新发布的一个轻量级神经网络推理框架,它能大幅降低延迟,节省带宽,保护用户隐私,帮助开发者使能端侧及边缘侧AI能力。主要包含离线转换工具和轻量级运行时两部分。离线转换工具将MindSpore模型及第三方模型变得更小,运行更快;轻量级运行时可部署到智能手机、以及手表、耳机等资源受限的嵌入式设备。在端侧AI图像分类应用中,MindSpore Lite提供模型加载,图编译和图执行等接口,帮助应用使用底层轻量化运行时推理环境,完成图像分类推理工作。MindSpore Lite包含Model,Session,Scheduler,Executor和Kernel等多个核心组件,其中Model用于用户构建图或加载网络,提供import端侧模型加载接口;Session对外直接暴露接口,提供推理会话管理功能,在进行图编译和图执行之前,必须先创建会话,初始化推理任务的上下文环境,如:指定推理并行线程数,指定推理执行的设备后端等;Scheduler算子异构调度器,在图编译阶段,根据上下文指定的设备后端,为算子做最优的选型调度;Executor图执行器,在图执行阶段,为算子动态分配内存,提供内存复用能力优化算子的资源占用率;Kernel算子库提供端侧算子的具体实现。除了提供轻量化运行时,MindSpore Lite还提供离线模型转换工具,使用一行命令即可轻松转换MindSpore框架训练生成的图像分类模型,优化生成后的端侧模型变得更小,运行更快。本课程基于MindSpore Lite开发了一款图像分类的安卓APP,所有同学学习后都可以在安卓手机上拥有一款自己开发的图像分类神器,来看看成品吧~02基于ResNet50实现毒蘑菇识别实战还记得前段时间上了微博热搜的——「云南一女子吃野蘑菇中毒致幻躺病床唱忐忑」吗?让人哭笑不得。越是漂亮的蘑菇,说不定毒性越强哦~那么如何检测毒蘑菇呢?我们专门针对毒蘑菇数据集,运用ResNet-50模型,训练了一个图像识别模型,还运用了MindSpore的黑科技——二阶优化算法讲极大的提升训练速度,让开发更简洁高效。03基于YOLOv3实现篮球检测模型实战了解目标检测的同学对于YOLO 应该不陌生了吧,YOLO是一种实时目标检测算法,它是第一个平衡所提供检测的质量和速度的算法。从最初的YOLOv1到现在发展到YOLOv5,深受开发者欢迎。我们使用最经典的YOLOv3-darket网络进行篮球检测,让各位篮球爱好者在实战的过程中也能一饱眼福。04基于BERT实现新闻分类实战BERT,即双向transformer编码表达,是近年来很火的自然语言处理模型。在Bert网络当中,transformer结构是一个基本单元,把多个这样的基本单元连接起来,就是BERT的算法模型。Transformer结构主要分为两大部分,分别是编码器和解码器, 编码器负责把自然语言序列映射成为隐藏层, 含有自然语言序列的数学表达。然后解码器把隐藏层再映射为人类可读的自然语言序列,从而使我们可以解决各种问题。编码器的结构是整个transformer的基础,解码器也是基于此衍生,并且BERT预训练模型只用到了编码器的部分,也就是先用编码器训练一个语言模型,然后再把它适配给其他五花八门的任务。我们常刷的手机App中的新闻属于什么类别呢?BERT是如何来进行中文新闻分类的呢?讲师将会在ModelArts上一步一步教你如何实践和优化,从原理到实战,全方位教学。05基于Wide&Deep实现CTR预估实战还记得第四课中我们讲到新闻的标签分类吗?APP通过你浏览的新闻的标签,停留的时长,点击的频率,从而给你推送你可能喜欢的新闻或广告。这是如何实现的呢?在CTR预估实战中,我们将会使用Wide&Deep模型,用Cretio数据集手把手教你训练模型。课程学习方式01直播授课每周两次讲师超干货直播+一次晚自习答疑时间+全天小助手贴心服务+结业挑战+精美大奖。区别于普通的PPT的枯燥讲解,讲师全程干货讲解+代码实践,让你在学习中有清晰的思路,深刻的理解算法模型背后的每个细节和实际操作方法。不管你在学习过程中遇到多少阻碍,你都可以通过以下4种方式解决:1、直接在开课时在线发弹幕问讲师;2、记录到每个群专享的共享文档中,每周固定时间的直播答疑;3、学习社群中全职助教,随时记录答疑问题;4、共同的问题在GitHub/Gitee的课件中总结成文档,可自由学习。(注:每次答疑,小助手都会进行记录,以便学员实时查阅。)02你的学习挑战1. 实战Project每次直播课后,讲师都会布置课后作业来进行巩固和提高。作业分为体验作业和进阶作业:体验作业可以让你迅速体验训练结果,获得成就感;进阶作业难度会加大,需要实际动手写代码,提交训练结果。讲师们都会带领助教团队会予以详细的批改和反馈,并逼着你不断的优化!2. 技术文章众所周知最佳学习方法是「费曼学习法」,如果我们只有学习,没有反思和记录,知识会非常容易遗忘,既然我们是21天实战营,遵循人类记忆曲线,那么我们会要求学员学习后在知乎上发表相关的技术文章进行自我学习成果的检验。讲师团队会对学员发表的每一篇文章都进行详细点评。虽然写文章的过程一开始可能会很痛过,也不知道如何下手,但是通过写技术博客养成一种不断反思优化的学习思维是终身受益的哦!03你的学习收获1. 全方位的深度学习知识学习和高效的框架代码实践2. 与华为资深工程师全程深入交流,更有机会与大咖面对面3. 全程作业跟踪批改,以及开发者避“坑”经验大全4. 社群MindSpore深度学习经典资料分享5. 令人心动的结业激励和日常学业激励学习结业激励看到这里会不会担心完不成想要放弃了?别急,我们准备的超豪华的学习和结业激励!结业激励特等奖1个:价值5000元:HUAWEI P40 5G手机一等奖2个:价值2000元:HUAWEI MatePad 10.4英寸 三等奖3个:价值1000元:荣耀手表2 46mm MagicWatch所有正式结业的学员,都将获得MindSpore官方定制的纸质+电子证书。纸质版都用精美画框包装,可长期保存。学业激励积极学员奖:每晚直播抽取5名发言提问最积极的学员,获得MindSpore官方书籍最佳实战奖:每次实战作业完成质量最高的5名同学获得MindSpore官方定制数据线最佳文章奖:每次技术文章作业完成质量最高的5名同学获得MindSpore官方定制雨伞报名方式01上课时间2020年10月22日—2020年11月11日每周二、周四晚八点讲师直播+周六晚自习答疑直播02报名方式关注MindSpore公众号回复「21天实战」即可获取报名方式!前100名报名的同学可获得超全深度学习资料哦~有任何疑问可添加下方小助手微信:mindspore0328▼精彩推荐MindSpore官方资料GitHub:https://github.com/mindspore-ai/mindsporeGitee:https://gitee.com/mindspore/mindspore官方QQ群: 871543426长按下方二维码关注↓
  • [Atlas200] 请问Atlas 200 AI加速模块有对应的resnet/vgg或者其他深度学习参考代码可以直接运行的吗,另外ascend310
    请问Atlas 200 AI加速模块有对应的resnet/vgg或者其他深度学习参考代码可以直接运行的吗,另外ascend310的官方手册哪里可以下载到?
  • [安装经验] MindSpore v1.0使用体验分享
    一、前言学习MindSpore有段时间了,说说我的使用心得吧。我是从一个AI小白开始学习深度学习,步入AI领域的,在接触到MindSpore之前,有听说TF、Pytorch等深度学习框架,但是没有去学习,所以MindSpore可以算是我AI领域的敲门砖吧。MindSpore的安装十分简单,根据官网安装指导即可安装成功。十分流畅,在此便不赘述。二、分享分享一下使用MindSpore1.0训练LeNet网络吧:LeNet5 + MNIST被誉为深度学习领域的“Hello world”。主要介绍使用MindSpore在MNIST手写数字数据集上开发和训练一个LeNet5模型,并验证模型精度。数据集准备MNIST是一个手写数字数据集,训练集包含60000张手写数字,测试集包含10000张手写数字,共10类。MNIST数据集的官网:THE MNIST DATABASE。从官网下载数据集并解压到本地文件夹中。文件结构如下所示。MNIST ├── test │   ├── t10k-images-idx3-ubyte │   └── t10k-labels-idx1-ubyte └── train     └── train-images-idx3-ubyte     └── train-labels-idx1-ubyte导入MindSpore模块设置MindSpore上下文,如执行模式、设备等。数据处理在使用数据集训练网络前,首先需要对数据进行预处理。图片可视化对其中几张图片进行可视化,可以看到图片中的手写数字,MindSpore1.0的新特性,images和labels是tensor,需要加上asnumpy()方法。定义网络模型训练实例化网络,定义损失函数、优化器等等。MindSpore1.0的nn.loss.SoftmaxCrossEntropyWithLogits删除了is_grad参数。训练结果可以看出 ,loss值在0.07左右,精度达到了97.6%三、心得体会刚学MindSpore的时候,有许多不懂的地方,便在官网教程学习,试着跑样例代码,渐渐掌握了一些知识,其中让我觉得MindSpore的优点首先能在训练的同时进行精度验证并保存相应的模型;而且只要定义回调函数Callback便可实现,十分便捷;其次是MindSpore支持的动态图模式和静态图模式一行代码即可切换;最后是能够使用混合精度进行训练,速度提升了而且还能保持单精度训练所能达到的网络精度。虽然优点众多,但是也有缺点,虽然MindSpore在Ascend上的支持度很高,但是在CPU/GPU上面还有点欠缺,希望能开发MindSpore在Ascend上的支持度很高,但是在CPU/GPU上面还有点欠缺,希望能够完善在CPU/GPU上面所支持的算子等等。MindSpore框架有助于我理解深度学习,从数据的转换、封装到卷积层、池化层和全网络的设计,从训练、测试到推理,实操一遍后,让我对深度学习有了更深层次的认知,还加大了我对LeNet、Resnet50、AlexNet等网络的下去,对算法模型和调参有了更大的兴趣,一遍遍的训练模型以达到最好的训练精度。安装环境硬件环境:CPU内存:8G软件环境:操作系统:Windows10Python:Python 3.7.5个人邮箱:znj254423959@163.com
  • [其他] 深度学习的网络里面学到的到底是啥东西?
    为什么用深度学习对一个数据集进行训练之后,它就能对这个数据集类似的图片进行成功预测,差别较大的图片就预测失败呢?深度神经网络到底从数据集中学到了啥?难道它记住了数据集中出现的样子吗?要不然也不至于输入一张没见过的图片就效果很差了
  • [其他问题] 激活函数的疑问
    sigmoid、Tanh、 Relu这三个激活函数各自有什么特征,优缺点
  • [基础知识] 跟着MindSpore一起学习深度概率
    MindSpore开源将近半年,已经推出了蛮多的架构和模型算法创新特性,现有计划围绕模型及算法创新工作开设一个专栏,把过程中的思考/开发遇到的坑,和小伙伴们分享一下,欢迎各位来炮轰。主要包含下图所示几个系列,如果有新的想法,也会在该专栏下及时更新。首先想和大家分享的是深度概率学习系列,名字中包含“深度”和“概率”两个词,其分别对应的就是深度学习和贝叶斯理论,也叫贝叶斯深度学习,深度概率学习简单来说主要是这两方面的融合。l 深度学习和深度概率学习的关系深度学习和深度概率学习有什么关系呢?一图告诉你它们的联系。左边DNN代表的是深度神经网络,右边BNN代表的是贝叶斯神经网络,右图神经元连接的权重变成了分布的形式,一句话来说就是:将确定的权重值变成分布。大家可能想问了,权重变成分布有什么好处呢?l 深度概率学习的优势我们知道,深度学习模型具有强大的拟合能力,而贝叶斯理论具有很好的可解释能力,将两者结合,通过设置网络权重为分布、引入隐空间分布等,可以对分布进行采样前向传播,由此引入了不确定性,因此,增强了模型的鲁棒性和可解释性。上面这段话可能比较难理解,简单来说,是在深度学习网络中加入了分布和采样等概率特性,引入了不确定性,即可以给出预测结果的置信度。这种能力是目前深度学习网络欠缺的,怎么理解不确定性呢?同样地一图告诉你。给大家解释一下,假如深度学习网络训练的时候是猫狗数据集,在测试阶段传入了兔子的图片,此时模型的预测输出肯定是猫狗之一。但大家知道,这个显然是错的,而深度概率学习则会对预测结果给出置信度,如果这个值很高,那说明模型对预测结果是很不确定的。l 深度概率学习的重要应用场景深度概率学习在很多场景下都有应用,例如自动驾驶、目标检测/语义分割等应用场景。比如对自动驾驶时方向盘角度的预测,需要非常精确的估计,一旦估计错误会出现严重的后果,若具有很高的不确定性,应该交给驾驶员进行决策判断。方向盘角度的预测而目标检测/语义分割领域,可以对结果进行不确定性的估计,并可视化呈现出来,这样可以很清晰的知道这部分是由于数据还是模型带来的不确定性,增强模型的可解释性。语义分割场景从上图中的(d)和(e)可以知道,颜色亮暗代表不确定性的高低,那么我们可以很直观的知道哪部分分割效果不好,是由于什么引起的。医疗图像诊断系统如果对某张图片不确定,也不可轻易给出预测结果,应该交给医生进一步诊断。另外还包括主动学习、异常检测等应用场景,这个之后会专门写一篇文章,欢迎大家一起讨论。l 业界经典的深度概率学习框架大家了解了什么是深度概率学习后,接下来我们讲一下目前深度概率学习的框架。业界主流的框架主要为基于TensorFlow的TFP和基于PyTorch的Pyro,但这两个框架都存在着对深度学习用户不友好的问题,如下图所示,其API的设计比较专业化,编程逻辑也与我们熟悉的深度学习编程逻辑差异比较大,更适用于专业的概率学习人员。那么,这里也引出了一个问题,为了让更多用户都能上手深度概率学习,应该设计出什么样的概率编程框架呢?我们的想法和动机:1)包含通用、专业的概率学习编程语言,适用于“专业”用户2)使用开发深度学习模型的逻辑进行概率编程,“小白”用户轻松上手3)深度学习模型与概率学习模型可模块化堆叠4) 提供深度概率学习的工具箱,拓展贝叶斯应用功能清华大学朱军老师团队在2017年开源了ZhuSuan框架--高效的贝叶斯深度学习库。MindSpore概率编程库基于ZhuSuan做了整合优化,开发出了概率学习模型和深度学习模型“无缝”融合的框架,旨在为用户提供完善的概率学习库,用于建立概率模型和应用贝叶斯推理。MindSpore深度概率学习的目标是将深度学习和贝叶斯学习结合,并能面向不同的开发者。具体来说,对于专业的贝叶斯学习用户,提供概率采样、推理算法和模型构建库;另一方面,为不熟悉贝叶斯深度学习的用户提供了高级的API,从而不用更改深度学习编程逻辑,即可利用贝叶斯模型。基于MindSpore的深度概率学习库地址:Gitee,Github目前刚发出了第一个版本,后续会不断进行迭代和完善,也希望大家一起参与到社区来,文后附有链接。深度概率学习系列将从以下几个方面来向大家介绍:首先给大家介绍的是MindSpore深度概率学习库的特性,希望让大家对深度概率学习库有总体上的了解,后续会陆续更新介绍其功能模块。l 深度概率特性MindSpore深度概率学习库建立在MindSpore的基础之上,其支持高度灵活的模型表达和高性能的加速平台(包括Ascend和GPU),并具备训练过程静态执行和动态调试的能力,充分利用MindSpore的优势。其总体框架如下图所示:看上去一头雾水,别着急,下面为大家自下向上进行讲解。Kernels内核模块主要指适用于不同平台的高性能内核,包括贝叶斯模型使用的Distribution kernels和Math kernels。我们知道,随机数生成器(RNG)在很多情况下都使用,为了生成随机数,MindSpore会针对不同分布的不同运算符,例如正态分布、均匀分布、伽玛分布、泊松分布等,这里大家是不是亲切多了,简单来说就是支持大部分的概率分布。另外,随机数生成器同时需要MindSpore前后端的支持。Probabilistic Programming概率编程是用于深度概率建模的工具,其目标是建立和训练深度概率网络,主要的两个部分是用于生成随机张量的统计分布类和概率推断算法。Distributions and Bijectors首先是统计分布类,其功能是支持分布/随机张量。分布/随机张量是随机变量/向量的数学概念的实现。与通常张量不同,分布/随机张量是没有确定性值的张量。相反,我们可以通过按照一定概率分布进行采样来获得随机张量的实现,或计算分布的统计性质。随机分布的统计属性涵盖了概率统计中重要的统计属性,包括但不限于均值,方差/标准差,众数,分位数,概率分布函数(pdf),最大似然估计(log likelihood),累计分布函数(cdf)等。而Bijector类可以用作从一个Distribution类实例到Transformed Distribution类实例的映射。举个例子,假如基本的Distribution是Normal分布,Bijector是Y=EXP(X)的映射,那么Transformed Distribution是EXP(Normal),简单来说就是基本分布类到复杂分布类的映射,通过Bijector类,可以构建一些更复杂的概率分布。Probabilistic Inference Algorithms概率推断算法模块包含了最常见的两类推断算法:随机变分推断(SVI)和马尔科夫链蒙特卡洛算法(MCMC)。在概率模型中,我们经常需要根据数据来近似复杂的概率分布,即对后验概率的计算,而这个概率往往很难计算。变分推断的基本思想是用隐藏变量来近似概率模型的后验分布,将求解数据的后验概率分布问题转化为优化问题。通过优化隐藏变量分布的参数来获取最接近的后验,通过Kullback-Leibler散度衡量,在变分推断中,极小化KL divergence的问题等价于最大化ELBO的问题。这里只是进行简单的概括,更多地可参考Variational Inference: A Review for Statisticians这篇论文,对变分推断总结的非常好。另一种推断算法是马尔可夫链蒙特卡罗(MCMC)。在统计中,马尔可夫链蒙特卡洛(MCMC)方法包括一类用于从概率分布中采样的算法。通过构建具有所需分布作为其平衡分布的马尔可夫链,可以通过记录链中的状态来获得所需分布的样本。MCMC是概率编程中的重要模块,可支持包括数据生成和推断在内的模型功能。关于MCMC的详细介绍,@Eureka的文章写得很清楚,大家可以参考里面的解释:马尔可夫链蒙特卡罗算法(MCMC)Deep Probabilistic Programming该模块旨在提供可组合的概率编程模块,包括Layers、Transform和Deep Probabilistic Network等,这部分也是希望可以用开发深度学习模型的逻辑来构造深度概率模型。Layers贝叶斯神经网络(BNN)是由概率模型和神经网络组成的基本模型,文章刚开始画的就是典型的贝叶斯神经网络,BNN以分布形式表示神经网络的权重,该模块提供了可组合成BNN的Layers。不同于深度神经网络层,这些层在权重和偏置上分配分布,并在输出上产生不确定性,BNN和DNN的区别在于BNN需要计算参数层的后验值,并且BNN的每层layer都需要计算KL loss,所以在训练阶段有所不同。该模块提供的功能是使得用户可以像构建DNN网络一样构建BNN网络。大家如果想实践一下,具体的使用示例可以参考:Bayesian LeNetTransform该模块提供了DNN一键转BNN网络,我们知道对于不熟悉概率学习的用户而言,构建和训练概率神经网络并不友好,所以为这些用户提供了高级的API用来构建贝叶斯神经网络。除了支持模型级别的转换,还支持层级的转换。通过该API,用户可以很方便地构建贝叶斯神经网络,上手十分容易。欢迎大家尝鲜,使用示例:Transform DNN model to BNNDeep Probabilitic NetworkDeep Probabilitic Network意思就是深度概率网络,我们希望能提供一些典型的概率网络模块供用户使用。这其中,Variational AutoEncoder (VAE)是经典的应用了变分推断的深度概率模型,用来学习潜在变量的表示,通过该模型,不仅可以压缩输入数据,还可以生成该类型的新图像。我们将构建网络以产生潜在表征向量,这些潜在表征向量的遵循正态分布,通过变分推断算法来最大化ELBO,使得潜在变量和标准正态分布的差异尽可能的小。在尝试生成新数据时,只需简单地从分布中采样一些值,然后将它们传递给解码器,解码器将返回一些新数据,并且新生成的数据具有多样性。使用该模块来构造变分自编码器(VAE)进行推理尤为简单。用户只需要自定义编码器和解码器(DNN模型),调用VAE或CVAE接口形成其派生网络,然后调用ELBO接口进行优化,最后使用SVI接口进行变分推理。这样做的好处是,不熟悉变分推理的开发者可以像构建DNN模型一样来构建概率模型,而熟悉的开发者可以调用这些接口来构建更为复杂的概率模型。具体的使用示例同样大家可以参考:Variational Auto-EncoderToolbox在本篇开头有提到,贝叶斯神经网络的优势之一就是可以获取不确定性,MindSpore深度概率学习库在上层提供了不确定性估计的工具箱,用户可以很方便地使用该工具箱计算不确定性。再次说一下什么是不确定性:不确定性意味着深度学习模型不知道什么。目前,大多数深度学习算法只能给出高置信度的预测结果,而不能判断预测结果的确定性,不确定性主要有两种类型:偶然不确定性和认知不确定性。偶然不确定性(Aleatoric Uncertainty):描述数据中的内在噪声,即无法避免的误差,这个现象不能通过增加采样数据来削弱,也叫做数据不确定性。认知不确定性(Epistemic Uncertainty):模型自身对输入数据的估计可能因为训练不佳、训练数据不够等原因而不准确,可以通过增加训练数据等方式来缓解,也叫做模型不确定性。提供的不确定性估计工具箱支持主流的深度学习模型,目前主要包括回归和分类任务。在推理阶段,用户只需传入训练好的模型和训练数据集,指定任务和待估计的样本,即可方便地获取偶然不确定性和认知不确定性,在不确定性信息的基础上,用户可以更好地理解模型和数据集。不确定性估计工具箱的使用可参考:Toolbox of Uncertainty Estimation特别感谢清华大学的ZhuSuan团队Jiaxin Shi(石佳欣)和 Jianfei Chen(陈键飞)等人对MindSpore深度概率编程社区的贡献,希望更多的人能参与进来一起完善。想要体验深度概率编程在MindSpore上的应用请查看链接:https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/apply_deep_probability_programming.html这里也列出几个问题想和大家一起探讨:为了让更多用户都能上手深度概率学习,应该设计出什么样的概率编程框架呢?2. 深度概率学习具有更好的鲁棒性和不确定性,是否还有其他的应用场景呢,及普及的局限性在哪?3. 不确定性是现在贝叶斯网络的优势之一,那么我们更多地能用不确定性来做什么?本篇文章就到这里啦,欢迎大家批评指正。下一篇文章我们会详细地介绍概率推断算法和概率模型,包括模块功能、设计的原理和使用方式等。MindSpore官方资料GitHub:https://github.com/mindspore-ai/mindsporeGitee:https://gitee.com/mindspore/mindspore官方QQ群: 871543426长按下方二维码关注↓
  • [安装经验] Mindspore 1.0初体验
    一、前言2020年3月28日,MindSpore正式开源,备受广大开发者的关注。从4月30日发布的v0.2.0-alpha版本,到8月30日发布的v0.7.0-beta版本,推出了数十个亮眼的新特性,9月,在华为全联接大会上,MindSpore正式发布v1.0.0版本。有关Mindspore 1.0更多的介绍可以看这一篇文章:https://www.mindspore.cn/news/newschildren?id=262二、Mindspore 1.0安装Mindspore安装教程参考文档:https://www.mindspore.cn/install这边有个小建议:国内通过pip install 安装的用户可以在教程页面给出的安装命令的最后加上 -i https://mirrors.huaweicloud.com/repository/pypi/simple 命令使用国内源。因为在安装mindspore的时候会安装一些依赖包,这些依赖包没制定过安装源的话他会从国外的默认地址下载,那样的话在国内下载可能比较慢。所有建议加上-i 指定一下国内源。如果想要使用docker安装的话可以参考这个文档:https://gitee.com/mindspore/mindspore 中的Docer镜像部分安装。安装环境硬件环境:CPU:Intel i7-4712MQ内存:8G显卡:Nvidia GeForce 840M软件环境:操作系统:WIN10 2004Python:Python 3.7.7根据官方安装教程安装完毕后,在命令提示符输入python,然后输入代码,执行结果显示1.0.0说明Mindspore 1.0.0安装成功了。import mindspore as ms ms.__version__三、使用Lenet+Mnist初体验1.Lenet介绍LeNet-5是一个较简单的卷积神经网络。下图显示了其结构:输入的二维图像,先经过两次卷积层到池化层,再经过全连接层,最后使用softmax分类作为输出层。LeNet-5 这个网络虽然很小,但是它包含了深度学习的基本模块:卷积层,池化层,全连接层。是其他深度学习模型的基础, 这里我们对LeNet-5进行深入分析。同时,通过实例分析,加深对与卷积层和池化层的理解。2.MNIST数据集介绍MNIST 数据集已经是一个被”嚼烂”了的数据集, 很多教程都会对它”下手”, 几乎成为一个 “典范”. 不过有些人可能对它还不是很了解, 下面来介绍一下.MNIST 数据集可在http://yann.lecun.com/exdb/mnist/获取, 它包含了四个部分:训练集:Training set images: train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)Training set labels: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)测试集Test set images: t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)Test set labels: t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.3.Lenet+MNIST代码程序运行代码可以参考Mindspore官方代码仓:https://gitee.com/mindspore/mindspore/tree/r1.0/model_zoo/official/cv/lenet第一步:将代码下载下来拷贝到本地,代码的文件夹结构如下lenet|___src|       |__config.py|       |__dataset.py|       |__lenet.py||___MNIST_DATA|       |______train(MNIST下载后的训练集解压到这个目录|       |______test(MNIST下载后的验证集解压到这个目录||____train.py   训练代码|____eval.py    测试代码train.py的代码:# Copyright 2020 Huawei Technologies Co., Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================ """ ######################## train lenet example ######################## train lenet and get network model files(.ckpt) : python train.py --data_path /YourDataPath """ import os import ast import argparse from src.config import mnist_cfg as cfg from src.dataset import create_dataset from src.lenet import LeNet5 import mindspore.nn as nn from mindspore import context from mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor, TimeMonitor from mindspore.train import Model from mindspore.nn.metrics import Accuracy from mindspore.common import set_seed set_seed(1) if __name__ == "__main__":     parser = argparse.ArgumentParser(description='MindSpore Lenet Example')     parser.add_argument('--device_target', type=str, default="CPU", choices=['Ascend', 'GPU', 'CPU'],                         help='device where the code will be implemented (default: Ascend)')     parser.add_argument('--data_path', type=str, default="./MNIST_Data",                         help='path where the dataset is saved')     parser.add_argument('--ckpt_path', type=str, default="./ckpt", help='if is test, must provide\                         path where the trained ckpt file')     parser.add_argument('--dataset_sink_mode', type=ast.literal_eval, default=True,                         help='dataset_sink_mode is False or True')     args = parser.parse_args()     context.set_context(mode=context.GRAPH_MODE, device_target=args.device_target)     ds_train = create_dataset(os.path.join(args.data_path, "train"),                               cfg.batch_size)     network = LeNet5(cfg.num_classes)     net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")     net_opt = nn.Momentum(network.trainable_params(), cfg.lr, cfg.momentum)     time_cb = TimeMonitor(data_size=ds_train.get_dataset_size())     config_ck = CheckpointConfig(save_checkpoint_steps=cfg.save_checkpoint_steps,                                  keep_checkpoint_max=cfg.keep_checkpoint_max)     ckpoint_cb = ModelCheckpoint(prefix="checkpoint_lenet", directory=args.ckpt_path, config=config_ck)     model = Model(network, net_loss, net_opt, metrics={"Accuracy": Accuracy()})     print("============== Starting Training ==============")     model.train(cfg['epoch_size'], ds_train, callbacks=[time_cb, ckpoint_cb, LossMonitor()],                 dataset_sink_mode=args.dataset_sink_mode)eval.py的代码:# Copyright 2020 Huawei Technologies Co., Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================ """ ######################## eval lenet example ######################## eval lenet according to model file: python eval.py --data_path /YourDataPath --ckpt_path Your.ckpt """ import os import ast import argparse import mindspore.nn as nn from mindspore import context from mindspore.train.serialization import load_checkpoint, load_param_into_net from mindspore.train import Model from mindspore.nn.metrics import Accuracy from src.dataset import create_dataset from src.config import mnist_cfg as cfg from src.lenet import LeNet5 if __name__ == "__main__":     parser = argparse.ArgumentParser(description='MindSpore Lenet Example')     parser.add_argument('--device_target', type=str, default="CPU", choices=['Ascend', 'GPU', 'CPU'],                         help='device where the code will be implemented (default: Ascend)')     parser.add_argument('--data_path', type=str, default="./MNIST_Data",                         help='path where the dataset is saved')     parser.add_argument('--ckpt_path', type=str, default="", help='if mode is test, must provide\                         path where the trained ckpt file')     parser.add_argument('--dataset_sink_mode', type=ast.literal_eval,                         default=False, help='dataset_sink_mode is False or True')     args = parser.parse_args()     context.set_context(mode=context.GRAPH_MODE, device_target=args.device_target)     network = LeNet5(cfg.num_classes)     net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")     repeat_size = cfg.epoch_size     net_opt = nn.Momentum(network.trainable_params(), cfg.lr, cfg.momentum)     model = Model(network, net_loss, net_opt, metrics={"Accuracy": Accuracy()})     print("============== Starting Testing ==============")     param_dict = load_checkpoint(args.ckpt_path)     load_param_into_net(network, param_dict)     ds_eval = create_dataset(os.path.join(args.data_path, "test"),                              cfg.batch_size,                              1)     acc = model.eval(ds_eval, dataset_sink_mode=args.dataset_sink_mode)     print("============== {} ==============".format(acc))src目录下config.py(用来设置运行参数的文件)from easydict import EasyDict as edict mnist_cfg = edict({     'num_classes': 10,     'lr': 0.01,     'momentum': 0.9,     'epoch_size': 10,     'batch_size': 32,     'buffer_size': 1000,     'image_height': 32,     'image_width': 32,     'save_checkpoint_steps': 1875,     'keep_checkpoint_max': 10, })第二步:执行train.py开始训练模型的命令:python train.py执行结果:看到出现Epoch time:和per step time且屏幕不再滚动就说明训练已经完成。训练完成后我们可以发现代码目录下生成了一个新的文件夹叫CKPT,这个文件夹内存放的就是训练后的ckpt文件,在后面的验证代码中会用到这个里面的文件第三步:执行验证代码test.py命令:python eval.py --ckpt_path=./ckpt/checkpoint_lenet-10_1875.ckpt说明:--ckpt_path 参数指定ckpt文件路径。这里我们选择前面训练产生的最后一个ckpt,也就是checkpoint_lenet-10_1875.ckpt执行结果:看到命令行中出现'Accuracy'的结果后,就说明代码运行成功了,可以看到这次模型训练的进度为98.4375%还算可以。四、总结Lenet+MNIST的模型训练在我看来可以算是Mindspore的Hello world了,执行起来难度不是很大,整个的运行时间也不会很久。这次的模型训练是在CPU环境下运行的,等后面有机会装一个GPU版本,跑一个resnet50+Cifar10看看效果有没有比前几个版本的运行速度快一点。当然更多的算法实例可以参考Mindspore官方码云下的Model_Zoo,里面还有不少好玩的算法代码。有兴趣的可以去试着跑跑看,代码地址:https://gitee.com/mindspore/mindspore/tree/r1.0/model_zoo个人邮箱地址:JeffDing890430@163.com