• [行业资讯] 蓝牙物联网论坛开启,一起加入精准的蓝牙圈子
    时间:2022年8月18日 9:00—12:00地点:深圳会展中心(福田)主办单位:物联传媒、蓝牙技术联盟(SIG)论坛背景蓝牙技术作为主流的IoT连接技术之一,目前每年的市场出货量达到了数十亿的级别,而IoT则是蓝牙技术最重要的增长点。近些年来,为了适应物联网市场的需求,蓝牙技术也在不断的演进,比如BLE、蓝牙AoA/AoD定位,蓝牙mesh,和基于蓝牙技术的无源物联网等。每一次的技术革新,都是为应用做出更好的服务。蓝牙最新技术已经发展到什么程度,它将会使用哪些应用场景,又有哪些比较好的落地案例呢?基于对蓝牙技术的发展现状与创新应用的讨论,聚拢以蓝牙技术为核心的精准圈子,共谋产业发展之路。会议亮点1、蓝牙技术领军亮相2、物联传媒×蓝牙技术联盟打造蓝牙物联网最专业的圈子3、聚焦蓝牙技术最新的技术成果与应用成果4、20+同期论坛,800+同期展商,全方位了解AIoT产业论坛议程时间演讲主题09:00-09:35观众签到09:35-09:40主持开场与嘉宾介绍09:40-10:00蓝牙低功耗音频—LE Audio开创音频新纪元蓝牙技术联盟 亚太暨中国市场总监 李佳蓉10:00-10:20低功耗蓝牙在物联网与音频的应用发展与趋势瑞昱半导体 企划经理 杨咏菘10:20-10:40低功耗蓝牙SOC在位置服务和无线音频领域的创新应用方案泰凌微电子 业务拓展总监 梁佳毅10:40-11:00蓝牙mesh在行业场景应用与创新杭州涂鸦信息技术有限公司 智慧酒店&租住事业部总经理 应海平11:00-11:20蓝牙物联网创新解决方案北京百瑞互联技术有限公司 市场部经理 李丽11:20-11:40Bluetooth LE Audio带出无线音频新用例北欧半导体 华东及华北地区销售经理 吴迪11:40-12:00蓝牙寻向技术及其创新应用蓝色创源(北京)科技有限公司 产品总监 刘继达演讲嘉宾李佳蓉蓝牙技术联盟亚太暨中国市场总监嘉宾简介:李佳蓉女士拥有15年以上的科技市场及营销顾问资历,擅长营销策略拟定及品牌沟通推广,现职为蓝牙技术联盟(Bluetooth SIG)亚太区市场推广负责人,致力于提升蓝牙技术在亚太区的认知与采用率,并协助联盟成立以上海为基地的亚太专业团队。演讲摘要:近日,蓝牙技术联盟正式将这一功能更名为Auracast广播音频,Auracast广播音频使智能手机、笔记本电脑、电视和公共广播系统等音频发射器能够向附近不限数量的扬声器、耳机和助听器等蓝牙音频接收器广播音频,帮助人们实现分享音频内容、解除无声世界、体验最佳音频三大目标。杨咏菘瑞昱半导体 Realtek 企划经理嘉宾简介:杨咏菘现任瑞昱半导体蓝牙部门企划经理,负责蓝牙产品推广与重要品牌客户经营,在蓝牙与无线通讯领域拥有超过二十年的经验。担任过蓝牙软件开发、技术支持、产品规划与市场经营与销售等工作。演讲摘要:本次演讲主题将从芯片的角度出发,由浅入深涵盖物联网的各个领域与应用。从智能家居、穿戴式、蓝牙Mesh到医疗相关应用,以及蓝牙5.2低功耗音频的BIS、CIS的应用,进而把蓝牙音频带到更大的应用领域与场景。蓝牙音频分享技术能够突破以往应用,同时支持多个耳机设备连接到单个音讯串流等用例,并让用户享受更长的播放时间与更好的音频效果。梁佳毅泰凌微电子 业务拓展总监嘉宾简介:梁佳毅自2016年起至今工作于泰凌微电子(上海)股份有限公司,先后担任总经理技术助理及业务拓展和市场总监,负责业务拓展、产品及方案推广等工作。演讲摘要:本次论坛,泰凌将介绍支持包括位置服务和低功耗音频的最新蓝牙低功耗技术的产品和应用案例。随着近年来核心规范的不断迭代更新,蓝牙低功耗技术正在逐渐开拓全新的应用场景。规范5.1引入了AOA/AOD角度寻向功能,从而提供更精确的位置服务,满足资产追踪和室内定位导航等一系列应用需求。规范5.2引入了CIS/BIS和LC3 codec,从而支持蓝牙低功耗音频,这一项具有革命性的无线音频技术,为大规模的产品和场景创新奠定了基础。应海平杭州涂鸦信息技术有限公司 智能智慧酒店&租住事业部总经理嘉宾简介:应海平有超过7年的酒店行业从业经验,在智慧酒店行业标准化、系统化、规模化中拥有丰富实践经验。带领涂鸦酒店在国内累计实现超200+品牌渠道合作,累计完成智慧酒店客房超7万+间,在线IoT设备超50万+,每日约有超5万人次入住体验智能化服务。演讲摘要:本次分享将会带来涂鸦在蓝牙mesh方面的案例以及产品与方案特点。吴迪北欧半导体华东及华北地区销售经理嘉宾简介:吴迪毕业于浙江大学,拥有近10年的半导体以及物联网行业经验。他先后在美国与欧洲知名的半导体公司从事销售管理与市场拓展岗位,对物联网诸多应用有丰富的理解与认知。演讲摘要:Bluetooth LE Audio的出台为历久尝新的蓝牙无线音频注入新动力,除了万众期待的更高品质更有效率的音乐串流,它还为大众带来崭新的用例。音频广播让沿用多年的广播系统得到大幅的提升。辅听设备(hearing aids)标准更加开启了在医用级助听器和音乐耳机之间的新品类。北欧半导体在这次演讲会跟大家分享这些新用例的想法。刘继达蓝色创源(北京)科技有限公司 产品总监嘉宾简介:刘继达,现任蓝色创源(北京)科技有限公司产品总监,负责室内高精度定位和位置感知产品的规划设计,主持开发了多项基于UWB、蓝牙AOA等技术的精准位置感知产品,并参与多个业内标准的编制。演讲摘要:万物互联时代下,位置数据呈现出日益广阔的发展空间和商业价值,蓝牙作为有史以来最成功的无线技术之一,累计出货量已经突破400亿,蓝牙技术除了作为音频领域的领导者,也已经应用到了非通信用途,尤其是在高精度室内定位技术上,蓝牙寻向技术以其独有优势,提供了一系列可靠的位置服务。蓝色创源通过新一代蓝牙AOA及AOD技术,实现了厘米级定位精度,在多类场景上进行了创新应用探索,为千行百业的位置服务提供有效赋能。报名参会扫描下方二维码或点击阅读原文,提前预约会议
  • [干货汇总] 教你使用CANN将照片一键转换成卡通风格
    【摘要】 你喜欢动画片,或者说卡通,动漫吗?我是挺喜欢的。绚丽多彩的卡通世界从来没有缺失过吸引力。手冢治虫画笔下,那个可以上天入地的阿童木,在与邪恶世界的斗争中教会了我们勇敢与正义。漫画工匠宫崎骏用清新的水彩勾勒出自然的乡村景观,不染一丝现实的尘土。美艳而不可方物的世界令人神往。这次是将AnimeGAN部署到Ascend 310,从而实现对自己想要图片的一键转换为我们想看到的卡通风格。本文分享自华为云社区《【CANN训练营】CANN训练营_昇腾AI趣味应用实现AI趣味应用(上)随笔》,作者: Tianyi_Li。前言你喜欢动画片,或者说卡通,动漫吗?我是挺喜欢的。绚丽多彩的卡通世界从来没有缺失过吸引力。手冢治虫画笔下,那个可以上天入地的阿童木,在与邪恶世界的斗争中教会了我们勇敢与正义。漫画工匠宫崎骏用清新的水彩勾勒出自然的乡村景观,不染一丝现实的尘土。美艳而不可方物的世界令人神往。从《大闹天宫》到《大圣归来》,从《哪吒闹海》到《哪吒之魔童降世》,国漫的发展也不曾落下。恢弘的场景结合扣人心弦的故事,不仅有丰富视觉享受,同时也带来了一个心灵慰藉的港湾。但是卡通世界的诞生需要日积月累的积淀,在一笔笔线条和色彩的勾勒下才能生成动人的场景。而人工智能却带来了便捷的可能,现实世界的景色人物都可以一键定格为卡通风格。在尽可能保留显示细节的同时也保持着艺术的风格化。这次是将AnimeGAN部署到Ascend 310,从而实现对自己想要图片的一键转换为我们想看到的卡通风格。参考实现: https://github.com/TachibanaYoshino/AnimeGAN参考论文: https://link.springer.com/chapter/10.1007/978-981-15-5577-0_18最终效果图如下图所示,左图是输入,右图是输出:CANN介绍Ascend 310是硬件,我们是基于在硬件上构建的软件进行开发的,不会直接接触到底层的硬件,这里我们是基于CANN开发,CANN(Compute Architecture for Neural Networks)是华为公司针对AI场景推出的异构计算架构,通过提供多层次的编程接口,支持用户快速构建基于昇腾平台的AI应用和业务。包括:AscendCL:昇腾硬件的统一编程接口,包含了编程模型、硬件资源抽象、AI任务及内核管理、内存管理、模型和算子调用、媒体预处理接口、加速库调用等一系列功能,充分释放昇腾系统多样化算力,使能开发者快速开发AI应用。TBE算子开发工具:预置丰富API接口,支持用户自定义算子开发和自动化调优,缩短工期,节省人力。算子库:基于昇腾处理器,深度协同优化的高性能算子库这里我们主要用到的还Ascend CL,也就是ACL,不过为了更加方便开发,减少对原生接口的数据对齐的琐碎限制,我们使用官方推出的进一步封装的acllite,相当于做了进一步封装,更加方便开发者使用。acllite的主要接口如下图所示:具体的开发流程如下图所示,不仅适用于本应用,也适用于所有的开发应用。AnimeGAN网络概述AnimeGAN生成网络结构如下,以Generative Adversarial Networks(GAN)为基础,其架构包括一个生成器(Generator)用于将现实世界场景的照片转换为动漫图像,和一个判别器(Discriminator)区分图像是来自真实目标域还是来自生成器产生的输出,通过迭代训练两个网络(即生成器和判别器),由判别器提供的对抗性损失可以生成卡通化的结果。同时将生成器替换为自编码结构,使得生成器具有更强的生成能力。对于生成器,它希望生成样本尽可能符合真实样本的分布,而判别器则希望尽可能的区分真实样本与生成样本。具体来说,判别器将真实样本判断为正确,记为1;而将生成结果判断为错误,记为0。AnimeGAN 的生成器可以被认为是一个对称的编码器-解码器网络。主要由标准卷积、深度可分离卷积、反向残差块(IRB),上采样和下采样模块组成。 在生成器中,最后一个具有 1×1 卷积核的卷积层不使用归一化层,后面是 tanh 非线性激活函数。Conv-Block 由具有 3×3 卷积核的标准卷积、实例归一化层和 LRelu 激活函数组成。 DSConv 由具有 3 × 3 卷积核的深度可分离卷积、实例归一化层和 LRelu 激活函数组成。反转的残差块包含 Conv-Block、深度卷积、点卷积和实例归一化层。为了避免最大池化导致的特征信息丢失,使用Down-Conv作为下采样模块来降低特征图的分辨率。它包含步长为 2 的 DSConv 模块和步长为 1 的 DSConv 模块。在 Down-Conv 中,特征图的大小被调整为输入特征图大小的一半。 Down-Conv 模块的输出是步长为 2 的 DSConv 模块和步长为 1 的 DSConv 模块的输出之和。使用Up-Conv 用作上采样模块以提高特征图的分辨率。为了有效减少生成器的参数数量,网络中间使用了 8 个连续且相同的 IRB。与标准残差块 相比,IRB 可以显着减少网络的参数数量和计算工作量。生成器中使用的 IRB 包括具有 512 个内核的逐点卷积、具有 512 个内核的深度卷积和具有 256 个内核的逐点卷积。值得注意的是,最后一个卷积层没有使用激活函数。为了辅助生成器生成更好的结果,判别器需要判断输出图像是否是真实的卡通图片。因为判断是否真实依赖于图片本身特征,不需要抽取最高层的图片特征信息,所以可以设计成较为浅层的框架。首先对输入进行卷积核为3 x 3的卷积,然后紧接两个步长为2的卷积块来降低分辨率,并且提取重要的特征信息。最后使用一个3 × 3的卷积层得到最终提取的特征,再与真实标签进行损失计算。如果输入为256 × 256,则输出为64 × 64的PatchGAN形式。这里将Leaky ReLU的参数设置为0.2。开发过程介绍在拿到一个模型,我们希望做开发部署的时候,基本流程如下图所示:下面就来看看。分析预处理代码模型转换获取到原始模型后,需要使用昇腾CANN所提供的ATC模型转换工具,将第三方框架的模型转换为昇腾推理芯片所支持的om模型。模型转换步骤可参考昇腾文档中开发者文档->应用开发->将已有模型通过ATC工具转换(命令行)的指导进行转换。该样例通过不同分辨率的模型支持三种不同的输入图片,直接影响到生成图片的质量。以下为模型转换过程。三种不同的模型输入分辨率,分辨率越高,图片质量越好,但模型推理时间也就越长,咱们用的是第一种256 * 256,如下图所示:测试预处理代码编写如果你想用Python,也没问题,来看看Python版本的代码:使用DVPP对读入图片进行解码,并缩放至256 × 256分辨率,以符合网络输入大小;在模型转换时,使用AIPP功能,将unit8的数据转换为fp16格式,将0~255的数值归一化到-1~1,将BGR的图片格式转换为RGB格式。执行推理后处理如果使用Python接口开发,代码如下所示:后处理模块主要是对模型的推理结果进行格式变换,然后将变换结果反馈给用户。主要过程是先将-1~1的值映射回0~255,然后将256 × 256的转换结果缩放回原始图像的尺寸大小。最后进行色域转换将RGB格式的输出转换为BGR格式。结果展示整理流程图如下图所示:1.运行管理资源申请:用于初始化系统内部资源,固定的调用流程。2.加载模型文件并构建输出内存:从文件加载离线模型AnimeGAN.om数据,需要由用户自行管理模型运行的内存,根据内存中加载的模型获取模型的基本信息包含模型输入、输出数据的数据buffer大小;由模型的基本信息构建模型输出内存,为接下来的模型推理做好准备。3.数据预处理:对读入的图像数据进行预处理,然后构建模型的输入数据。4.模型推理:根据构建好的模型输入数据进行模型推理。5.解析推理结果:根据模型输出,解析模型的推理结果。使用OpenCV将转换后的卡通画数据转化为JPEG。(可选)优化加速结语图片卡通化或者说动漫化,还是挺有意思的,算是AI一个娱乐性较强的应用了,可以让每个普通人随时随地创造自己想要的卡通化Demo,很有意思,如果你想体验的话,可以到昇腾开发者社区的在线体验,上传自己的图片转换,如果你想要代码,那也没问题,在线体验提供了原始代码,可以免费下载使用,奉上在线实验链接:https://www.hiascend.com/zh/developer/mindx-sdk/cartoon/99172254img最后奉上不同分辨率下的运行结果对比:
  • [API使用] 求助大神,关于mindspore.ops.operation.Conv2d算子使用
    卷积层的实现算子是mindspore.ops.operation.Conv2d(out_channel,kernel_size, mode=1,pad_mode="valid",pad=0, stride=1,dilation=1,group=1,data_format="NCHW") 其中的mode参数用于指定不同的卷积计算方式:mode=0,math convolutionmode=1,cross-correlation convolutionmode=2,deconvolutionmode=3,depthwise convolution问题1:指定mode=3时报错,说mode必须为1。问题2:将限制代码注释掉,mode设置为3,但是卷积结果和mode为1时,完全一样。这里测试时使用了相同的输入数据,使用了相同的weight。 请教正式用法,目标是实现深度可分离卷积,谢谢! 
  • [其他] 递归神经网络(RNN)
    递归神经网络(RNN)RNN是最强大的模型之一,它使我们能够开发如分类、序列数据标注、生成文本序列(例如预测下一输入词的SwiftKey keyboard应用程序),以及将一个序列转换为另一个序列(比如从法语翻译成英语的语言翻译)等应用程序。大多数模型架构(如前馈神经网络)都没有利用数据的序列特性。例如,我们需要数据呈现出向量中每个样例的特征,如表示句子、段落或文档的所有token。前馈网络的设计只是为了一次性地查看所有特征并将它们映射到输出。让我们看一个文本示例,它显示了为什么顺序或序列特性对文本很重要。I had cleaned my car和I had my car cleaned两个英文句子,用同样的单词,但只有考虑单词的顺序时,它们才意味着不同的含义。人类通过从左到右阅读词序列来理解文本,并构建了可以理解文本数据中所有不同内容的强大模型。RNN的工作方式有些许类似,每次只查看文本中的一个词。RNN也是一种包含某特殊层的神经网络,它并不是一次处理所有数据而是通过循环来处理数据。由于RNN可以按顺序处理数据,因此可以使用不同长度的向量并生成不同长度的输出。图6.3提供了一些不同的表示形式。 图6.3图6.3来自关于RNN一个著名博客(http://karpathy.github.io/2015/05/21/rnn-effectiveness),其中作者Andrej Karpathy写明了如何使用Python从头开始构建RNN并将其用作序列生成器。6.4.1 通过示例了解RNN如何使用假设我们已经构建了一个RNN模型,并且尝试了解它提供的功能。当了解了RNN的作用后,就可以来探讨一下RNN内部发生了什么。让我们用Thor的评论作为RNN模型的输入。我们正在看的示例文本是the action scenes were top notch in this movie... .首先将第一个单词the传递给模型;该模型生成了状态向量和输出向量两种不同的向量。状态向量在处理评论中的下一个单词时传递给模型,并生成新的状态向量。我们只考虑在最后一个序列中生成的模型的输出。图6.4概括了这个过程。 图6.4图6.4演示了以下内容:RNN如何通过展开和图像来工作;状态如何以递归方式传递给同一模型。到现在为止,我们只是了解了RNN的功能,但并不知道它是如何工作的。在了解其工作原理之前来看一些代码片段,它会更详细地展示我们学到的东西。仍然将RNN视为黑盒:在上述代码中,hidden变量表示状态向量,有时也称为隐藏状态。到现在为止,我们应该知道了如何使用RNN。现在来看一下实现RNN的代码,并了解RNN内部发生的情况。以下代码包含RNN类:除了上述代码中的单词RNN之外,其他一切听起来与在前面章节中使用的非常类似,因为PyTorch隐藏了很多反向传播的复杂度。让我们通过init函数和forward函数来了解发生了什么。__init__函数初始化了两个线性层,一个用于计算输出,另一个用于计算状态或隐藏向量。forward函数将input向量和hidden向量组合在一起,并将其传入两个线性层,从而生成输出向量和隐藏状态。对于output层,我们应用log_softmax函数。initHidden函数有助于创建隐藏向量,而无需在第一次时声明调用RNN。让我们通过图6.5了解RNN类的作用。 图6.5图6.5说明了RNN的工作原理。关注 “ 人工智能技术与咨询” ,了解更多 资讯 !
  • [经验分享] 使用MindStudio进行MindInsight调优
    相对应的视频教学可以在B站进行观看:https://www.bilibili.com/video/BV1St4y1473r一、MindSpore和MindInsight环境搭建和配置介绍1 MindSpore简介昇思MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标。其中,易开发表现为API友好、调试难度低;高效执行包括计算效率、数据预处理效率和分布式训练效率;全场景则指框架同时支持云、边缘以及端侧场景。昇思MindSpore总体架构如下图所示:ModelZoo(模型库):ModelZoo提供可用的深度学习算法网络(ModelZoo 地址 )Extend(扩展库):昇思MindSpore的领域扩展库,支持拓展新领域场景,如GNN/深度概率编程/强化学习等,期待更多开发者来一起贡献和构建。Science(科学计算):MindScience是基于昇思MindSpore融合架构打造的科学计算行业套件,包含了业界领先的数据集、基础模型、预置高精度模型和前后处理工具,加速了科学行业应用开发(了解更多 )。Expression(全场景统一API):基于Python的前端表达与编程接口。同时未来计划陆续提供C/C++、华为自研编程语言前端-仓颉(目前还处于预研阶段)等第三方前端的对接工作,引入更多的第三方生态。Data(数据处理层):提供高效的数据处理、常用数据集加载等功能和编程接口,支持用户灵活的定义处理注册和pipeline并行优化。Compiler(AI编译器):图层的核心编译器,主要基于端云统一的MindIR实现三大功能,包括硬件无关的优化(类型推导、自动微分、表达式化简等)、硬件相关优化(自动并行、内存优化、图算融合、流水线执行等)、部署推理相关的优化(量化、剪枝等)。Runtime(全场景运行时):昇思MindSpore的运行时系统,包含云侧主机侧运行时系统、端侧以及更小IoT的轻量化运行时系统。Insight(可视化调试调优工具):昇思MindSpore的可视化调试调优工具,能够可视化地查看训练过程、优化模型性能、调试精度问题、解释推理结果(了解更多 )。Armour(安全增强库):面向企业级运用时,安全与隐私保护相关增强功能,如对抗鲁棒性、模型安全测试、差分隐私训练、隐私泄露风险评估、数据漂移检测等技术(了解更多 )。执行流程有了对昇思MindSpore总体架构的了解后,我们可以看看各个模块之间的整体配合关系,具体如图所示:昇思MindSpore作为全场景AI框架,所支持的有端(手机与IOT设备)、边(基站与路由设备)、云(服务器)场景的不同系列硬件,包括昇腾系列产品,英伟达NVIDIA系列产品,Arm系列的高通骁龙、华为麒麟的芯片等系列产品。左边蓝色方框的是MindSpore主体框架,主要提供神经网络在训练、验证相关的基础API功能,另外还会默认提供自动微分、自动并行等功能。蓝色方框往下是MindSpore Data模块,可以利用该模块进行数据预处理,包括数据采样、数据迭代、数据格式转换等不同的数据操作。在训练的过程会遇到很多调试调优的问题,因此有MindSpore Insight模块对loss曲线、算子执行情况、权重参数变量等调试调优相关的数据进行可视化,方便用户在训练过程中进行调试调优。设计理念• 支持全场景协同昇思MindSpore是源于全产业的最佳实践,向数据科学家和算法工程师提供了统一的模型训练、推理和导出等接口,支持端、边、云等不同场景下的灵活部署,推动深度学习和科学计算等领域繁荣发展。• 提供Python编程范式,简化AI编程昇思MindSpore提供了Python编程范式,用户使用Python原生控制逻辑即可构建复杂的神经网络模型,AI编程变得简单。• 提供动态图和静态图统一的编码方式目前主流的深度学习框架的执行模式有两种,分别为静态图模式和动态图模式。静态图模式拥有较高的训练性能,但难以调试。动态图模式相较于静态图模式虽然易于调试,但难以高效执行。 昇思MindSpore提供了动态图和静态图统一的编码方式,大大增加了静态图和动态图的可兼容性,用户无需开发多套代码,仅变更一行代码便可切换动态图/静态图模式,例如设置context.set_context(mode=context.PYNATIVE_MODE)切换成动态图模式,设置context.set_context(mode=context.GRAPH_MODE)即可切换成静态图模式,用户可拥有更轻松的开发调试及性能体验。• 采用函数式可微分编程架构,使用户聚焦于模型算法的数学原生表达神经网络模型通常基于梯度下降算法进行训练,但手动求导过程复杂,结果容易出错。昇思MindSpore的基于源码转换(Source Code Transformation,SCT)的自动微分(Automatic Differentiation)机制采用函数式可微分编程架构,在接口层提供Python编程接口,包括控制流的表达。用户可聚焦于模型算法的数学原生表达,无需手动进行求导。• 统一单机和分布式训练的编码方式随着神经网络模型和数据集的规模不断增加,分布式并行训练成为了神经网络训练的常见做法,但分布式并行训练的策略选择和编写十分复杂,这严重制约着深度学习模型的训练效率,阻碍深度学习的发展。MindSpore统一了单机和分布式训练的编码方式,开发者无需编写复杂的分布式策略,在单机代码中添加少量代码即可实现分布式训练,例如设置context.set_auto_parallel_context(parallel_mode=ParallelMode.AUTO_PARALLEL)便可自动建立代价模型,为用户选择一种较优的并行模式,提高神经网络训练效率,大大降低了AI开发门槛,使用户能够快速实现模型思路。层次结构昇思MindSpore向用户提供了3个不同层次的API,支撑用户进行网络构建、整图执行、子图执行以及单算子执行,从低到高分别为Low-Level Python API、Medium-Level Python API以及High-Level Python API。• High-Level Python API第一层为高阶API,其在中阶API的基础上又提供了训练推理的管理、混合精度训练、调试调优等高级接口,方便用户控制整网的执行流程和实现神经网络的训练推理及调优。例如用户使用Model接口,指定要训练的神经网络模型和相关的训练设置,对神经网络模型进行训练,通过Profiler接口调试神经网络性能。• Medium-Level Python API第二层为中阶API,其封装了低阶API,提供网络层、优化器、损失函数等模块,用户可通过中阶API灵活构建神经网络和控制执行流程,快速实现模型算法逻辑。例如用户可调用Cell接口构建神经网络模型和计算逻辑,通过使用Loss模块和Optimizer接口为神经网络模型添加损失函数和优化方式,利用Dataset模块对数据进行处理以供模型的训练和推导使用。• Low-Level Python API第三层为低阶API,主要包括张量定义、基础算子、自动微分等模块,用户可使用低阶API轻松实现张量定义和求导计算。例如用户可通过Tensor接口自定义张量,使用ops.composite模块下的GradOperation算子计算函数在指定处的导数。2 MindInsight简介MindInsight是昇思MindSpore的可视化调试调优工具。利用MindInsight,您可以可视化地查看训练过程、优化模型性能、调试精度问题、解释推理结果。您还可以通过MindInsight提供的命令行方便地搜索超参,迁移模型。在MindInsight的帮助下,您可以更轻松地获得满意的模型精度和性能。MindInsight包括以下内容:• 训练过程可视 (收集 Summary 数据、查看训练看板 )• 训练溯源及对比 • 性能调优 • 精度调试 • 超参调优 • 模型迁移 3 环境安装配置3.1 MindSpore环境安装配置选择适合自己的环境条件后,获取命令并按照指南进行安装,或使用云平台创建和部署模型,安装细节参见链接:https://www.mindspore.cn/install 验证是否安装成功方法一:python -c "import mindspore;mindspore.run_check()"如果输出:MindSpore version: 版本号The result of multiplication calculation is correct, MindSpore has been installed successfully!说明MindSpore安装成功了。方法二:import numpy as npfrom mindspore import Tensorimport mindspore.ops as opsimport mindspore.context as contextcontext.set_context(device_target="Ascend")x = Tensor(np.ones([1,3,3,4]).astype(np.float32))y = Tensor(np.ones([1,3,3,4]).astype(np.float32))print(ops.add(x, y))如果输出:[[[[2. 2. 2. 2.][2. 2. 2. 2.][2. 2. 2. 2.]][[2. 2. 2. 2.][2. 2. 2. 2.][2. 2. 2. 2.]][[2. 2. 2. 2.][2. 2. 2. 2.][2. 2. 2. 2.]]]]说明MindSpore安装成功了。升级MindSpore版本当需要升级MindSpore版本时,可执行如下命令:pip install --upgrade mindspore-ascend=={version}其中:• 升级到rc版本时,需要手动指定{version}为rc版本号,例如1.6.0rc1;如果升级到正式版本,=={version}字段可以缺省。3.2 MindInsight环境安装配置确认系统环境信息• 硬件平台支持Ascend、GPU和CPU。• 确认安装Python 3.7.5或3.9.0版本。如果未安装或者已安装其他版本的Python,可以选择下载并安装:– Python 3.7.5版本 64位,下载地址:官网 或华为云 。– Python 3.9.0版本 64位,下载地址:官网 或华为云 。• MindInsight与MindSpore的版本需保持一致。• 若采用源码编译安装,还需确认安装以下依赖。– 确认安装node.js 10.19.0及以上版本。– 确认安装wheel 0.32.0及以上版本。• 其他依赖参见requirements.txt 。可以采用pip安装,源码编译安装和Docker安装三种方式。pip安装安装PyPI上的版本:pip install mindinsight=={version}安装自定义版本:pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/{version}/MindInsight/any/mindinsight-{version}-py3-none-any.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple其中:• 当环境中的MindSpore不是最新版本时,需要手动指定{version}为当前环境中MindSpore版本号。注:非root用户需要在命令中加入“--user”参数。源码编译安装从代码仓下载源码git clone https://gitee.com/mindspore/mindinsight.git -b r1.7编译安装MindInsight可选择以下任意一种安装方式:1.在源码根目录下执行如下命令。cd mindinsightpip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simplepython setup.py install2.构建whl包进行安装进入源码的根目录,先执行build目录下的MindInsight编译脚本,再执行命令安装output目录下生成的whl包。cd mindinsightbash build/build.shpip install output/mindinsight-{version}-py3-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simpleDocker安装MindSpore的镜像包含MindInsight功能,请参考官网安装指导 。验证是否成功安装执行如下命令:mindinsight start如果出现下列提示,说明安装成功:Web address: http://127.0.0.1:8080service start state: success二、MindStudio简介和安装1 MindStudio简介MindStudio提供在AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助您在一个工具上就能高效便捷地完成AI应用开发。MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。功能简介• 针对安装与部署,MindStudio提供多种部署方式,支持多种主流操作系统,为开发者提供最大便利。• 针对网络模型的开发,MindStudio支持TensorFlow、Pytorch、MindSpore框架的模型训练,支持多种主流框架的模型转换。集成了训练可视化、脚本转换、模型转换、精度比对等工具,提升了网络模型移植、分析和优化的效率。• 针对算子开发,MindStudio提供包含UT测试、ST测试、TIK算子调试等的全套算子开发流程。支持TensorFlow、PyTorch、MindSpore等多种主流框架的TBE和AI CPU自定义算子开发。• 针对应用开发,MindStudio集成了Profiling性能调优、编译器、MindX SDK的应用开发、可视化pipeline业务流编排等工具,为开发者提供了图形化的集成开发环境,通过MindStudio能够进行工程管理、编译、调试、性能分析等全流程开发,能够很大程度提高开发效率。功能框架MindStudio功能框架如图所示,目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具等多种工具。工具功能MindStudio工具中的主要几个功能特性如下:• 工程管理:为开发人员提供创建工程、打开工程、关闭工程、删除工程、新增工程文件目录和属性设置等功能。• SSH管理:为开发人员提供新增SSH连接、删除SSH连接、修改SSH连接、加密SSH密码和修改SSH密码保存方式等功能。• 应用开发:针对业务流程开发人员,MindStudio工具提供基于AscendCL(Ascend Computing Language)和集成MindX SDK的应用开发编程方式,编程后的编译、运行、结果显示等一站式服务让流程开发更加智能化,可以让开发者快速上手。• 自定义算子开发:提供了基于TBE和AI CPU的算子编程开发的集成开发环境,让不同平台下的算子移植更加便捷,适配昇腾AI处理器的速度更快。• 离线模型转换:训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。• 日志管理:MindStudio为昇腾AI处理器提供了覆盖全系统的日志收集与日志分析解决方案,提升运行时算法问题的定位效率。提供了统一形式的跨平台日志可视化分析能力及运行时诊断能力,提升日志分析系统的易用性。• 性能分析:MindStudio以图形界面呈现方式,实现针对主机和设备上多节点、多模块异构体系的高效、易用、可灵活扩展的系统化性能分析,以及针对昇腾AI处理器的性能和功耗的同步分析,满足算法优化对系统性能分析的需求。• 设备管理:MindStudio提供设备管理工具,实现对连接到主机上的设备的管理功能。• 精度比对:可以用来比对自有模型算子的运算结果与Caffe、TensorFlow、ONNX标准算子的运算结果,以便用来确认神经网络运算误差发生的原因。• 开发工具包的安装与管理:为开发者提供基于昇腾AI处理器的相关算法开发套件包Ascend-cann-toolkit,旨在帮助开发者进行快速、高效的人工智能算法开发。开发者可以将开发套件包安装到MindStudio上,使用MindStudio进行快速开发。Ascend-cann-toolkit包含了基于昇腾AI处理器开发依赖的头文件和库文件、编译工具链、调优工具等。2 MindStudio安装2.1 安装Python依赖(1)官方网站下载安装安装 Python3.7.5 到Windows本地。(2)设置环境变量。(3)“Win + R”快捷键打开系统命令行,输入“Python -V”,显示Python版本号表示安装成功。(4)安装Python3相关依赖。pip install xlrd==1.2.0pip install absl-pypip install numpypip install requests(5)如若返回如下信息,则表示安装成功。Successfully installed xlrd-1.2.0Successfully installed absl-py-0.12.0 six-1.15.0Successfully installed numpy-1.20.1Successfully installed requests-2.27.1更多安装细节请参考:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000022.html 2.2 安装MinGW依赖(1)根据电脑配置,下载适合的(下载参考地址 ),例如64位可以选择x86_64-posix-seh。(2)解压MinGW安装包到自定义路径。(3)在Windows 10操作系统的“控制面板 > 系统和安全 > 系统”中选择“高级系统设置”,如图所示。(4)打开系统命令行,输入gcc -v命令。若显示版本号表示安装成功。更多安装细节请参考:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000022.html 2.3 安装Java依赖(1)要求Java版本为11,参考下载地址 。(2)下载后安装到本地,设置Java环境变量。(3)打开系统命令,输入java --version,如显示Java版本信息,则表示安装成功。2.4 安装Cmake以msi格式软件包为例,安装步骤如下(下载参考地址 ),你也可以登录CMake 官网 下载合适的版本(1)单击快捷键“win+R”,输入cmd,单击快捷键“Ctrl+Shift+Enter”,进入管理员权限命令提示符。若弹出“用户帐户控制”提示窗口,单击“是”。(2)执行以下命令,安装软件包:msiexec /package {path}\{name}.msi例如:msiexec /package D:\cmake-3.22.3-win64-x64.msi(3)根据安装向导进行安装。更多安装细节请参考:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000022.html 2.5 安装MindStudio(1)MindStudio官网为我们提供两种安装方式。大家可以选择.zip文件,也可以选择.exe文件。此处我选择下载.zip文件。(2)下载好后直接解压到任意目录。解压后目录结构如图所示。(3)点击“bin”目录,然后双击目录下的“MindStudio64.exe”应用程序,运行MindStudio。 详细安装指导请参阅:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000021.html 三、使用MindStudio创建训练工程和运行脚本1 导入模型代码创建训练工程(1) 启动MindStudio首次启动MindStudio会进入如下欢迎界面,大家按需选择新建项目或打开本地项目,在这里,我点击 Open 按钮打开本地现存项目(https://gitee.com/mindspore/models/tree/master/official/recommend/ncf )。(2) 选择项目所在位置,添加 ncf 项目,点击 OK确定。 (3) 项目结构如图所示。2 配置远程环境2.1 连接远程服务器(1) 点击 Tools -> Deployment -> Configuration,配置远程连接服务器。(2) 选中左侧 Deployment 选项卡,点击左上角加号,输入自定义远程连接名称。(3) 输入服务器 IP 地址、端口号、用户名及密码,建议勾选 Save password 保存密码,测试可以成功连接后,点击OK确定。(4) 点击 Mappings 配置本地到服务器的文件路径映射。Local Path 填入本地项目路径,Deployment Path 选中远程服务器的项目路径,这两个文件夹名称不必完全相同。Excluded Paths(非必需)为配置忽略路径,表示忽略的项目文件不会上传到远程服务器。配置完成后,点击 OK 确定。 2.2 设置CANN(1) 点击 File -> Settings,进入设置。(2) 在左侧菜单依次选中 Appearance & Behavior -> System Settings -> CANN, 进入 CANN 配置选项卡中,设置远程服务器CANN路径。2.3 配置远程SDK(1) 点击 File -> Projects Structure 进入项目设置。(2) 在左侧菜单中选择 SDKs,点击左上角加号,选择 Add Python SDK... 进行SDK配置。(3) 在弹出的选项卡中选择 SSH Interpreter,在Deploy中选择远程连接名称,等待 IDE 自动检测可用的Interpreter。(4) 自动检测远程的SDK并显示如下,可以对其进行手动修改,我将 SDK 名称更改为 msp1.7 以便区分。(5) 在 Project 中设置刚才配置的远程SDK msp1.7。3 运行训练脚本3.1 安装项目依赖(1) 点击 Tools -> Start SSH session 打开远程服务器终端。(2) 远程服务器终端显示在 IDE 下方控制台处,输入 pip list 检查所需依赖是否已安装。(3) 菜单栏中点击 Ascend -> Convert To Ascend Project,将当前项目转换为昇腾项目。(4) 在弹出的对话框中选择转换的类型和框架,此处选择 Ascend Training 和 MindSpore 框架,点击 OK 确定。3.2 数据集下载和处理(1)NCF模型介绍NCF 是用于协同过滤推荐的通用框架,其中神经网络架构用于对用户交互进行建模。与传统模型不同,NCF 不诉诸矩阵分解 (MF),其对用户和项目的潜在特征进行内积。它用可以从数据中学习任意函数的多层感知器代替积。详见:https://gitee.com/mindspore/models/tree/master/official/recommend/ncf (2)展开src目录,右击 movielens.py,配置运行参数。(3)配置运行参数,其中 Script path 设置为运行文件,Parameters 中设置参数,Python interpreter 选择前文配置的远程服务器中的 SDK,点击 OK 确定。(4) 点击工具栏中的运行按钮,等待 ml-1m 数据集下载和预处理,大家可以在控制台输出查看当前程序运行的实时日志。如果数据处理结束,会在控制台输出正常退出。(5) 当运行程序后产生新的文件时,需要本地同步更新。建议大家点击Tools -> Deployment -> Automatic Upload 开启本地与服务器文件自动同步的功能。(6)开启自动同步后,更新过程如图所示:3.3 训练项目(1)如图所示,点击Edit Configuration来编辑配置(2)设置训练参数,此处设置了训练20个epoch,batch_size为256,输出保存在 ./output文件夹中,checkpoint保存在 ./nfc.ckpt 文件夹中,点击 OK 确定。(3)点击运行,项目开始进行训练。(4)在控制台中查看训练过程中实时打印的日志。四、MindInsight训练可视化及精度调优指南1 准备训练脚本(1)在train.py中,导入SummaryCollector。from mindspore.train.callback import SummaryCollector(2)在train.py代码中,实例化 SummaryCollector,并添加到callbacks中。# Init summary_collectorsummary_collector = SummaryCollector(summary_dir="./summary_dir")model.train(epochs,ds_train,callbacks=[TimeMonitor(ds_train.get_dataset_size()),callback, ckpoint_cb, summary_collector],dataset_sink_mode=False)(3)增加如上代码后,须重新训练模型,收集的数据存放于 ./summary_dir 中。2 MindInsight训练可视化配置(1)在工具栏选择 Ascend -> MindInsight 打开 MindInsight 管理界面。(2) MindInsight 管理界面可显示并管理多个 MindInsight训练可视化工程。MindInsight 管理界面相关属性说明如下图所示,点击Enable按钮,配置MindInsight组件相关参数。(3)在弹出的选项卡中,配置MindInsight组件相关参数,其中 Summary Base Dir 填入代码中设置的目录,WorkSpace 可以在 SSH 终端中输入 mindinsight start 查看,Port为端口号。(4)单击 OK 完成 MindInsight 组件相关参数配置,出现如图所示界面,说明配置成功。(5)点击 View 按钮即可跳转 MindInsight 界面。3 查看MindInsight训练看板及精度调优指南代码是精度问题的重要源头,超参问题、模型结构问题、数据问题、算法设计和实现问题会体现在脚本中,而我们使用的MindInsight生态工具可以将脚本中的各类问题以生动的可视化数据呈现给开发者,下面我们开始探究如何使用MindInsight进行精度调优。(1)进入训练列表后,我们可以点击右上角的按钮选择开启/关闭自动刷新看板信息和设置刷新频率,以及切换语言和主题。(2)点击“训练看板”后,可以看见训练时的各类可视化数据。主要包括损失函数、训练参数、训练数据以及网络计算图等。(3)点击 “参数详情” ,检查超参。MindInsight可以辅助用户对超参做检查,大多数情况下,SummaryCollector会自动记录常见超参,大家可以通过MindInsight的训练参数详情功能和溯源分析功能查看超参。结合MindInsight模型溯源分析模块和脚本中的代码,可以确认超参的取值,识别明显不合理的超参。如果有标杆脚本,建议同标杆脚本一一比对超参取值,如果有默认参数值,则默认值也应一并比对,以避免不同框架的参数默认值不同导致精度下降或者训练错误。根据我们的经验,超参问题主要体现为几个常见的超参取值不合理,例如:①学习率过大导致loss震荡难收敛,学习率过小导致训练不充分,学习率带来的影响可以直观地从loss曲线观察到;②loss_scale参数不合理,有可能导致loss为nan或loss迟迟不收敛;③权重初始化参数不合理等。参数详情可以显示常见的超参数。如下图所示:(4)点击 “参数分布图”,可以查看网络可训练参数随着迭代次数增加而产生的分布变化情况。大多数情况下,SummaryCollector会自动记录模型参数变化情况(默认记录5个参数),可以通过MindInsight的参数分布图模块查看。如果想要记录更多参数的参数分布图,请参考SummaryCollector 的histogram_regular参数,或参考HistogramSummary 算子。(5)点击“计算图”,检查模型结构。在模型结构方面,常见的问题有:①算子使用错误(使用的算子不适用于目标场景,如应该使用浮点除,错误地使用了整数除)。②权重共享错误(共享了不应共享的权重)。③权重冻结错误(冻结了不应冻结的权重)。④节点连接错误(应该连接到计算图中的block未连接)。⑤loss函数错误。⑥优化器算法错误(如果自行实现了优化器)等。MindInsight可以辅助用户对模型结构进行检查。大多数情况下,SummaryCollector会自动记录计算图,点击 “计算图”,可以直观地看到各个网络节点的关系,如下图所示:图中左侧为直观的计算图,右侧为各节点的树状结构图,点击相应的节点可以将其展开或折叠,方便用户查看。(6)点击“标量信息”,检查loss曲线。大多数精度问题会在网络训练过程中发现,并且可以直观地体现在损失函数的图表中,我们总结了一些可以体现在损失函数异常的常见问题:①权重问题(例如权重不更新、权重更新过大、权重值过大/过小、权重冻结不准确、权重共享设置有误);②激活值问题(激活值饱和或过弱,例如Sigmoid的输出接近1,Relu的输出全为0);③梯度问题(例如梯度消失、梯度爆炸);④训练epoch不足(loss还有继续下降的趋势);⑤算子计算结果存在NAN、INF等。如下图,我们可以查看详细的损失函数信息,并且面板设置有开启/关闭Loss曲线全屏等功能,在这里可以直观地看到损失函数的收敛趋势以及波动幅度。五、MindInsight训练耗时统计及性能调优指南1 准备训练脚本(1) 在train.py中导入Profiler。from mindspore.profiler import Profiler(2)收集profiler数据并分析。profiler = Profiler(output_path='./profiler_data')profiler.analyse()(3)再次训练项目。此处仅仅作为模型性能调优,可以适当将训练总分步数调小(例如两个step,数据经过整个计算图即可得到算子耗时)。2 MindInsight调优配置(1)更改MindInsight配置参数,与训练可视化的操作相似,这里的 Summary Base Dir 填入代码里设置的参数。(2)单击 OK 完成 MindInsight 组件相关参数配置,出现如图所示界面,说明配置成功。(3)点击 View 按钮即可跳转 MindInsight 界面。3 查看MindInsight性能看板及性能调优指南(1)右上角可以选择开启/关闭自动刷新看板信息和刷新频率,以及切换语言和主题。点击 “性能分析”。(2)进入性能分析看板后,可以看见有关训练耗时的各类数据图表。(3)点击“算子耗时统计排名”,可以查看各个算子的执行时间进行统计展示(包括AICORE、AICPU、HOSTCPU算子)。在右上角可以选择饼图/柱状图展示各算子类别的时间占比,每个算子类别的执行时间会统计属于该类别的算子执行时间总和。统计前20个占比时间最长的算子类别,展示其时间所占的百分比以及具体的执行时间(毫秒),我们可以选择算子耗时排名靠前的算子进行性能优化,这样有更大的优化空间。(4)点击“迭代轨迹”,查看每次迭代中各阶段的耗时,确定性能瓶颈点在哪个阶段,然后再针对该阶段进行详细分析。下面简单解释一下迭代轨迹中的三个阶段:• 迭代间隙:该阶段反映的是每个迭代开始时等待训练数据的时间。如果该阶段耗占比较高,说明数据处理的速度跟不上训练的速度。• 前反向计算:该阶段主要执行网络中的前向及反向算子,承载了一个迭代主要的计算工作。如果该阶段耗占比较高,较为合理。• 迭代拖尾:该阶段主要包含参数更新等操作,在多卡场景下还包括集合通信等操作。如果该阶段耗占比较高,可能是集合通信耗时比较长。(5)进入“迭代轨迹”面板查看迭代轨迹详情。当我们确定性能瓶颈点在哪个阶段时,就可以更有针对性地进行性能优化。此处我们总结了三个阶段时间异常的原因分析及解决方案:• 针对迭代间隙过长的问题:理想情况下,某个迭代开始前向训练时,其所需要的训练数据已经在Host侧完成了加载及增强并发送到了Device侧,反映到迭代间隙耗时通常在1毫秒内,否则就会由于等待训练数据而造成芯片算力的浪费。迭代间隙耗时长,说明该迭代开始前向计算时等待了较长的时间后训练数据才发送到了Device侧。用户需要到“数据准备”页面进一步确认是数据增强还是数据发送过程存在性能问题。• 针对前反向耗时过长的问题:该阶段主要包含网络中前向及反向算子的执行时间。若该时间段耗时较长,建议按跳转到“算子耗时统计排名”标签页,查看训练过程中各算子的耗时情况,重点关注耗时排名靠前的部分算子。分享一些解决算子耗时长的小tips(欢迎补充~):– 在不影响精度的前提下,将float32类型修改为float16类型;– 存在转换算子过多(TransData、Cast类算子)且耗时明显时,如果是用户手动加入的算子,可分析其必要性,如果对精度没有影响,可去掉冗余的Cast、TransData算子;• 针对迭代拖尾耗时过长的问题:该阶段在单卡场景主要包含参数更新等操作。从实际的调优经验来看,在单卡训练场景下该阶段耗时都很短,不会存在性能瓶颈。如果用户遇到单卡场景下该阶段耗时长,可以下载“时间线”,使用chrome://tracing工具观察参数更新相关的算子耗时是否有异常,并到MindSpore 社区 反馈。六、FAQ1、使用远程conda环境无法识别conda环境里的包原因:使用MindStudio进行远程连接服务器资源时,默认使用/usr/local/...下的本地环境。解决方法:可以尝试指定运行文件为shell脚本,在shell脚本靠前位置指明source activate xxx-env来激活远程conda环境。2、启动MindInsight训练看板卡顿,单击无响应。解决方法:(1)尝试disable后重新开启;(2)尝试重新存储训练数据;(3)SummaryCollector实例化的参数收集频率collect_freq设置的值过小,尝试调大一点。3、点击View查看MindInsight训练面板,显示为空。解决方法:Summary Base Dir 填入正确的目录,无需加前缀“./”。4、MindInsight训练面板显示异常数据(数据不符合预期)。原因:每个summary日志文件目录中,应该只放置一次训练的数据。一个summary日志目录中如果存放了多次训练的summary数据,MindInsight在可视化数据时会将这些训练的summary数据进行叠加展示,可能会与预期可视化效果不相符。解决方法:将summary日志文件目录删除后,重新训练生成文件。5、训练看板中Loss曲线过于平滑,难以分析Loss震荡幅度。解决方法:将model.train方法的dataset_sink_mode参数设置为False,从而以step作为collect_freq参数的单位收集数据。当dataset_sink_mode为True时,将以epoch作为collect_freq的单位,此时建议手动设置collect_freq参数。collect_freq参数默认值为10。七、从昇腾官方中体验更多内容MindSpore模型开发教程与API可参考MindSpore官网:https://www.mindspore.cn/ , 也可以在昇腾论坛进行讨论和交流: https://bbs.huaweicloud.com/forum/forum-726-1.html 总结本文主要介绍了如何使用MindStudio在MindSpore模型开发时使用MindInsight工具进行调优,详细介绍了其中的MindSpore环境搭建和配置介绍、MindStudio的安装与使用、训练工程的导入与配置、MindInsight训练可视化以及MindInsight性能调优等。 欢迎大家提出意见与反馈,谢谢!
  • [技术干货] 序列数据和文本的深度学习
    序列数据和文本的深度学习 用于构建深度学习模型的不同文本数据表示法:理解递归神经网络及其不同实现,例如长短期记忆网络(LSTM)和门控循环单元(Gated Recurrent Unit,GRU),它们为大多数深度学习模型提供文本和序列化数据;为序列化数据使用一维卷积。可以使用RNN构建的一些应用程序如下所示。文档分类器:识别推文或评论的情感,对新闻文章进行分类。序列到序列的学习:例如语言翻译,将英语转换成法语等任务。时间序列预测:根据前几天商店销售的详细信息,预测商店未来的销售情况。 1 使用文本数据文本是常用的序列化数据类型之一。文本数据可以看作是一个字符序列或词的序列。对大多数问题,我们都将文本看作词序列。深度学习序列模型(如RNN及其变体)能够从文本数据中学习重要的模式。这些模式可以解决类似以下领域中的问题:自然语言理解;文献分类;情感分类。这些序列模型还可以作为各种系统的重要构建块,例如问答(Question and Answering,QA)系统。虽然这些模型在构建这些应用时非常有用,但由于语言固有的复杂性,模型并不能真正理解人类的语言。这些序列模型能够成功地找到可执行不同任务的有用模式。将深度学习应用于文本是一个快速发展的领域,每月都会有许多新技术出现。我们将会介绍为大多数现代深度学习应用提供支持的基本组件。与其他机器学习模型一样,深度学习模型并不能理解文本,因此需要将文本转换为数值的表示形式。将文本转换为数值表示形式的过程称为向量化过程,可以用不同的方式来完成,概括如下:将文本转换为词并将每个词表示为向量;将文本转换为字符并将每个字符表示为向量;创建词的n-gram并将其表示为向量。文本数据可以分解成上述的这些表示。每个较小的文本单元称为token,将文本分解成token的过程称为分词(tokenization)。在Python中有很多强大的库可以用来进行分词。一旦将文本数据转换为token序列,那么就需要将每个token映射到向量。one-hot(独热)编码和词向量是将token映射到向量最流行的两种方法。图6.1总结了将文本转换为向量表示的步骤。 图6.1下面介绍分词、n-gram表示法和向量化的更多细节。6.1.1 分词将给定的一个句子分为字符或词的过程称为分词。诸如spaCy等一些库,它们为分词提供了复杂的解决方案。让我们使用简单的Python函数(如split和list)将文本转换为token。为了演示分词如何作用于字符和词,让我们看一段关于电影Thor:Ragnarok的小评论。我们将对这段文本进行分词处理:The action scenes were top notch in this movie. Thor has never been this epic in the MCU. He does some pretty epic sh*t in this movie and he is definitely not under-powered anymore. Thor in unleashed in this, I love that.1.将文本转换为字符Python的list函数接受一个字符串并将其转换为单个字符的列表。这样做就将文本转换为了字符。下面是使用的代码和结果:以下是结果:结果展示了简单的Python函数如何将文本转换为token。2.将文本转换为词我们将使用Python字符串对象函数中的split函数将文本分解为词。split函数接受一个参数,并根据该参数将文本拆分为token。在我们的示例中将使用空格作为分隔符。以下代码段演示了如何使用Python的split函数将文本转换为词:在前面的代码中,我们没有使用任何的分隔符,默认情况下,split函数使用空格来分隔。3.n-gram表示法我们已经看到文本是如何表示为字符和词的。有时一起查看两个、三个或更多的单词非常有用。n-gram是从给定文本中提取的一组词。在n-gram中,n表示可以一起使用的词的数量。看一下bigram(当n = 2时)的例子,我们使用Python的nltk包为thor_review生成一个bigram,以下代码块显示了bigram的结果以及用于生成它的代码:ngrams函数接受一个词序列作为第一个参数,并将组中词的个数作为第二个参数。以下代码块显示了trigram表示的结果以及用于实现它的代码:在上述代码中唯一改变的只有函数的第二个参数n的值。许多有监督的机器学习模型,例如朴素贝叶斯(Naive Bayes),都是使用n-gram来改善它的特征空间。n-gram同样也可用于拼写校正和文本摘要的任务。n-gram表示法的一个问题在于它失去了文本的顺序性。通常它是和浅层机器学习模型一起使用的。这种技术很少用于深度学习,因为RNN和Conv1D等架构会自动学习这些表示法。6.1.2 向量化将生成的token映射到数字向量有两种流行的方法,称为独热编码和词向量(word embedding,也称之为词嵌入)。让我们通过编写一个简单的Python程序来理解如何将token转换为这些向量表示。我们还将讨论每种方法的各种优缺点。1.独热编码在独热编码中,每个token都由长度为N的向量表示,其中N是词表的大小。词表是文档中唯一词的总数。让我们用一个简单的句子来观察每个token是如何表示为独热编码的向量的。下面是句子及其相关的token表示:An apple a day keeps doctor away said the doctor. 上面句子的独热编码可以用表格形式进行表示,如下所示。An100000000apple010000000a001000000day000100000keeps000010000doctor000001000away000000100said000000010the000000001该表描述了token及其独热编码的表示。因为句子中有9个唯一的单词,所以这里的向量长度为9。许多机器学习库已经简化了创建独热编码变量的过程。我们将编写自己的代码来实现这个过程以便更易于理解,并且我们可以使用相同的实现来构建后续示例所需的其他功能。以下代码包含Dictionary类,这个类包含了创建唯一词词表的功能,以及为特定词返回其独热编码向量的函数。让我们来看代码,然后详解每个功能:上述代码提供了3个重要功能。初始化函数__init__创建一个word2idx字典,它将所有唯一词与索引一起存储。idx2word列表存储的是所有唯一词,而length变量则是文档中唯一词的总数。在词是唯一的前提下,add_word函数接受一个单词,并将它添加到word2idx和idx2word中,同时增加词表的长度。onehot_encoded函数接受一个词并返回一个长度为N,除当前词的索引外其余位置全为0的向量。比如传如的单词的索引是2,那么向量在索引2处的值是1,其他索引处的值全为0。在定义好了Dictionary类后,准备在thor_review数据上使用它。以下代码演示了如何构建word2idx以及如何调用onehot_encoded函数:上述代码的输出如下:单词were的独热编码如下所示:独热表示的问题之一就是数据太稀疏了,并且随着词表中唯一词数量的增加,向量的大小迅速增加,这也是它的一种限制,因此独热很少在深度学习中使用。2.词向量词向量是在深度学习算法所解决的问题中,一种非常流行的用于表示文本数据的方式。词向量提供了一种用浮点数填充的词的密集表示。向量的维度根据词表的大小而变化。通常使用维度大小为50、100、256、300,有时为1000的词向量。这里的维度大小是在训练阶段需要使用的超参数。如果试图用独热表示法来表示大小为20000的词表,那么将得到20000×20000个数字,并且其中大部分都为0。同样的词表可以用词向量表示为20000×维度大小,其中维度的大小可以是10、50、300等。一种方法是为每个包含随机数字的token从密集向量开始创建词向量,然后训练诸如文档分类器或情感分类器的模型。表示token的浮点数以一种可以使语义上更接近的单词具有相似表示的方式进行调整。为了理解这一点,我们来看看图6.2,它画出了基于5部电影的二维点图的词向量。 图6.2图6.2显示了如何调整密集向量,以使其在语义上相似的单词具有较小的距离。由于Superman、Thor和Batman等电影都是基于漫画的动作电影,所以这些电影的向量更为接近,而电影Titanic的向量离动作电影较远,离电影Notebook更近,因为它们都是浪漫型电影。在数据太少时学习词向量可能是行不通的,在这种情况下,可以使用由其他机器学习算法训练好的词向量。由另一个任务生成的向量称为预训练词向量。下面将学习如何构建自己的词向量以及使用预训练词向量。 
  • [行业资讯] 首款使用深度学习清除通话噪音的无线耳塞
    随着在COVID-19疫情封锁期间会议转移到网上,许多人发现,叽叽喳喳的室友、垃圾车和其他响亮的杂音会打断了重要的对话。这经历启发了华盛顿大学的三位研究人员(他们在COVID-19期间是室友)研发出了更好的耳塞,为了增强说话人的声音和减少背景噪音,“ClearBuds”使用了一种新的麦克风系统和第一个实时操作的机器学习系统,该系统可以在智能手机上运行。研究人员于6月30日在ACM移动系统、应用和服务国际会议上介绍了这个项目。“ClearBuds在两个关键方面区别于其他无线耳机,”Paul G. Allen(保罗·艾伦)计算机科学与工程学院的博士生Maruchi Kim说。首先,ClearBuds使用了双麦克风阵列,每个耳塞上的麦克风可以产生两个同步的音频流,提供信息,并允许我们在空间上以更高的分辨率分离来自不同方向的声音。其次,轻量级的神经网络进一步增强了说话人的声音。”虽然大多数商业耳塞也在每个耳塞上都有麦克风,但只有一个耳塞在同一时间主动向手机发送音频。使用ClearBuds耳机,每个耳塞都会向手机发送一串音频,研究人员设计了蓝牙网络协议,允许这些数据流在70微秒内同步。该团队的神经网络算法在手机上运行来处理音频流。首先,它会抑制任何非语音的声音,然后它会隔离并增强同时从两个耳塞扬声器的声音——传入的任何噪音。Allen School的博士生Ishan Chatterjee说:“因为说话者的声音与两个耳塞的距离很近,而且距离大致相等,所以神经网络可以训练成只关注他们的声音,消除包括其他声音在内的背景声音,这种方法和你自己耳朵的工作原理非常相似,它们利用声音到达你左右耳朵的时间差来判断声音来自哪个方向。”当研究人员将 ClearBuds 与苹果的AirPods Pro 进行比较时,ClearBuds 表现更好,在所有测试中实现了更高的信号失真比。”Allen School的博士生Vivek Jayaram说:“当你考虑到我们的神经网络在iPhone上运行不到20毫秒这一事实时,这是非常了不起的,与通常用于运行神经网络的大型商业显卡相比,iPhone的计算能力只是一个小部分,我们如何在保持输出质量的同时减少传统神经网络的大小?这是我们在这篇论文中必须解决的挑战的一部分。研究小组还在“野外”对ClearBuds进行了测试,他们记录了8个人在嘈杂的环境中阅读“古登堡计划”,比如在咖啡店或繁忙的街道上。然后,研究人员让37人对这些10到60秒的录音片段进行打分,参与打分者认为通过ClearBuds的神经网络处理的片段具有最好的噪音抑制和最好的整体聆听体验。研究人员说,ClearBuds的一个限制是人们必须同时戴上两种耳塞才能获得噪音抑制的体验。但该团队表示,这里开发的实时通信系统可以用于各种其他应用,包括智能家居扬声器、跟踪机器人位置或搜索和救援任务。团队目前正在努力提高神经网络算法的效率,以便它们能够在耳塞上运行。
  • [模型训练] YOLOv3人体目标检测模型实现(二)
    3.2 YOLOv3为了节省篇幅,这一节只挑部分贴代码,更多的代码和包的导入请参考 附件\model\yolo.py。(参考:https://gitee.com/mindspore/models/tree/r1.5/official/cv/yolov3_darknet53)class YoloBlock 是Darknet53 输出后的处理模块,包括YOLOv3结构图(参见 YOLOv3人体目标检测模型实现(一))中的 Convolutional Set 以及后面的卷积:class YoloBlock(nn.Cell): """ YoloBlock for YOLOv3. Args: in_channels: Integer. Input channel. out_chls: Integer. Middle channel. out_channels: Integer. Output channel. Returns: Tuple, tuple of output tensor,(f1,f2,f3). Examples: YoloBlock(1024, 512, 255) """ def __init__(self, in_channels, out_chls, out_channels): super(YoloBlock, self).__init__() out_chls_2 = out_chls*2 self.conv0 = _conv_bn_relu(in_channels, out_chls, ksize=1) self.conv1 = _conv_bn_relu(out_chls, out_chls_2, ksize=3) self.conv2 = _conv_bn_relu(out_chls_2, out_chls, ksize=1) self.conv3 = _conv_bn_relu(out_chls, out_chls_2, ksize=3) self.conv4 = _conv_bn_relu(out_chls_2, out_chls, ksize=1) self.conv5 = _conv_bn_relu(out_chls, out_chls_2, ksize=3) self.conv6 = nn.Conv2d(out_chls_2, out_channels, kernel_size=1, stride=1, has_bias=True) def construct(self, x): c1 = self.conv0(x) c2 = self.conv1(c1) c3 = self.conv2(c2) c4 = self.conv3(c3) c5 = self.conv4(c4) c6 = self.conv5(c5) out = self.conv6(c6) return c5, outclass YOLOv3 则将主干网络和 YoloBlock 组合起来(包含上采样)成为结构图中完整的YOLOv3模型:class YOLOv3(nn.Cell): """ YOLOv3 Network. Note: backbone = darknet53 Args: backbone_shape: List. Darknet output channels shape. backbone: Cell. Backbone Network. out_channel: Integer. Output channel. Returns: Tensor, output tensor. Examples: YOLOv3(backbone_shape=[64, 128, 256, 512, 1024] backbone=darknet53(), out_channel=255) """ def __init__(self, backbone_shape, backbone, out_channel): super(YOLOv3, self).__init__() self.out_channel = out_channel self.backbone = backbone self.backblock0 = YoloBlock(backbone_shape[-1], out_chls=backbone_shape[-2], out_channels=out_channel) self.conv1 = _conv_bn_relu(in_channel=backbone_shape[-2], out_channel=backbone_shape[-2]//2, ksize=1) self.backblock1 = YoloBlock(in_channels=backbone_shape[-2]+backbone_shape[-3], out_chls=backbone_shape[-3], out_channels=out_channel) self.conv2 = _conv_bn_relu(in_channel=backbone_shape[-3], out_channel=backbone_shape[-3]//2, ksize=1) self.backblock2 = YoloBlock(in_channels=backbone_shape[-3]+backbone_shape[-4], out_chls=backbone_shape[-4], out_channels=out_channel) self.concat = P.Concat(axis=1) def construct(self, x): # input_shape of x is (batch_size, 3, h, w) # feature_map1 is (batch_size, backbone_shape[2], h/8, w/8) # feature_map2 is (batch_size, backbone_shape[3], h/16, w/16) # feature_map3 is (batch_size, backbone_shape[4], h/32, w/32) img_hight = P.Shape()(x)[2] img_width = P.Shape()(x)[3] feature_map1, feature_map2, feature_map3 = self.backbone(x) con1, big_object_output = self.backblock0(feature_map3) con1 = self.conv1(con1) ups1 = P.ResizeNearestNeighbor((img_hight // 16, img_width // 16))(con1) con1 = self.concat((ups1, feature_map2)) con2, medium_object_output = self.backblock1(con1) con2 = self.conv2(con2) ups2 = P.ResizeNearestNeighbor((img_hight // 8, img_width // 8))(con2) con3 = self.concat((ups2, feature_map1)) _, small_object_output = self.backblock2(con3) return big_object_output, medium_object_output, small_object_outputclass DetectionBlock 负责对YOLOv3的输出下图中的计算:class DetectionBlock(nn.Cell): """ YOLOv3 detection Network. It will finally output the detection result. Args: scale: Character. config: Configuration. is_training: Bool, Whether train or not, default True. Returns: Tuple, tuple of output tensor,(f1,f2,f3). Examples: DetectionBlock(scale='l',stride=32,config=config) """ def __init__(self, scale, config=None, is_training=True): super(DetectionBlock, self).__init__() self.config = config if scale == 's': idx = (0, 1, 2) elif scale == 'm': idx = (3, 4, 5) elif scale == 'l': idx = (6, 7, 8) else: raise KeyError("Invalid scale value for DetectionBlock") self.anchors = Tensor([self.config.anchor_scales for i in idx], ms.float32) self.num_anchors_per_scale = 3 self.num_attrib = 4+1+self.config.num_classes self.lambda_coord = 1 self.sigmoid = nn.Sigmoid() self.reshape = P.Reshape() self.tile = P.Tile() self.concat = P.Concat(axis=-1) self.conf_training = is_training def construct(self, x, input_shape): num_batch = P.Shape()(x)[0] grid_size = P.Shape()(x)[2:4] # Reshape and transpose the feature to [n, grid_size[0], grid_size[1], 3, num_attrib] prediction = P.Reshape()(x, (num_batch, self.num_anchors_per_scale, self.num_attrib, grid_size[0], grid_size[1])) prediction = P.Transpose()(prediction, (0, 3, 4, 1, 2)) range_x = range(grid_size[1]) range_y = range(grid_size[0]) grid_x = P.Cast()(F.tuple_to_array(range_x), ms.float32) grid_y = P.Cast()(F.tuple_to_array(range_y), ms.float32) # Tensor of shape [grid_size[0], grid_size[1], 1, 1] representing the coordinate of x/y axis for each grid # [batch, gridx, gridy, 1, 1] grid_x = self.tile(self.reshape(grid_x, (1, 1, -1, 1, 1)), (1, grid_size[0], 1, 1, 1)) grid_y = self.tile(self.reshape(grid_y, (1, -1, 1, 1, 1)), (1, 1, grid_size[1], 1, 1)) # Shape is [grid_size[0], grid_size[1], 1, 2] grid = self.concat((grid_x, grid_y)) box_xy = prediction[:, :, :, :, :2] box_wh = prediction[:, :, :, :, 2:4] box_confidence = prediction[:, :, :, :, 4:5] box_probs = prediction[:, :, :, :, 5:] # gridsize1 is x # gridsize0 is y box_xy = (self.sigmoid(box_xy) + grid) / P.Cast()(F.tuple_to_array((grid_size[1], grid_size[0])), ms.float32) # box_wh is w->h box_wh = P.Exp()(box_wh) * self.anchors / input_shape box_confidence = self.sigmoid(box_confidence) box_probs = self.sigmoid(box_probs) if self.conf_training: return grid, prediction, box_xy, box_wh return self.concat((box_xy, box_wh, box_confidence, box_probs))class YoloLossBlock 用于计算模型推理得到的3个输出特征图的损失:class YoloLossBlock(nn.Cell): """ Loss block cell of YOLOV3 network. """ def __init__(self, scale, config=None): super(YoloLossBlock, self).__init__() self.config = config if scale == 's': # anchor mask idx = (0, 1, 2) elif scale == 'm': idx = (3, 4, 5) elif scale == 'l': idx = (6, 7, 8) else: raise KeyError("Invalid scale value for DetectionBlock") self.anchors = Tensor([self.config.anchor_scales for i in idx], ms.float32) self.ignore_threshold = Tensor(self.config.ignore_threshold, ms.float32) self.concat = P.Concat(axis=-1) self.iou = Iou() self.reduce_max = P.ReduceMax(keep_dims=False) self.xy_loss = XYLoss() self.wh_loss = WHLoss() self.confidenceLoss = ConfidenceLoss() self.classLoss = ClassLoss() def construct(self, grid, prediction, pred_xy, pred_wh, y_true, gt_box, input_shape): # prediction : origin output from yolo # pred_xy: (sigmoid(xy)+grid)/grid_size # pred_wh: (exp(wh)*anchors)/input_shape # y_true : after normalize # gt_box: [batch, maxboxes, xyhw] after normalize object_mask = y_true[:, :, :, :, 4:5] class_probs = y_true[:, :, :, :, 5:] grid_shape = P.Shape()(prediction)[1:3] grid_shape = P.Cast()(F.tuple_to_array(grid_shape[::-1]), ms.float32) pred_boxes = self.concat((pred_xy, pred_wh)) true_xy = y_true[:, :, :, :, :2] * grid_shape - grid true_wh = y_true[:, :, :, :, 2:4] true_wh = P.Select()(P.Equal()(true_wh, 0.0), P.Fill()(P.DType()(true_wh), P.Shape()(true_wh), 1.0), true_wh) true_wh = P.Log()(true_wh / self.anchors * input_shape) # 2-w*h for large picture, use small scale, since small obj need more precise box_loss_scale = 2 - y_true[:, :, :, :, 2:3] * y_true[:, :, :, :, 3:4] gt_shape = P.Shape()(gt_box) gt_box = P.Reshape()(gt_box, (gt_shape[0], 1, 1, 1, gt_shape[1], gt_shape[2])) # add one more dimension for broadcast iou = self.iou(P.ExpandDims()(pred_boxes, -2), gt_box) # gt_box is x,y,h,w after normalize # [batch, grid[0], grid[1], num_anchor, num_gt] best_iou = self.reduce_max(iou, -1) # [batch, grid[0], grid[1], num_anchor] # ignore_mask IOU too small ignore_mask = best_iou < self.ignore_threshold ignore_mask = P.Cast()(ignore_mask, ms.float32) ignore_mask = P.ExpandDims()(ignore_mask, -1) # ignore_mask backpro will cause a lot maximunGrad and minimumGrad time consume. # so we turn off its gradient ignore_mask = F.stop_gradient(ignore_mask) xy_loss = self.xy_loss(object_mask, box_loss_scale, prediction[:, :, :, :, :2], true_xy) wh_loss = self.wh_loss(object_mask, box_loss_scale, prediction[:, :, :, :, 2:4], true_wh) confidence_loss = self.confidenceLoss(object_mask, prediction[:, :, :, :, 4:5], ignore_mask) class_loss = self.classLoss(object_mask, prediction[:, :, :, :, 5:], class_probs) loss = xy_loss + wh_loss + confidence_loss + class_loss batch_size = P.Shape()(prediction)[0] return loss / batch_size损失函数的实现可见 附件\model\loss.py。最后,class YOLOV3DarkNet53 将前面的 class 组装在一起:class YOLOV3DarkNet53(nn.Cell): """ Darknet based YOLOV3 network. Args: is_training: Bool. Whether train or not. Returns: Cell, cell instance of Darknet based YOLOV3 neural network. Examples: YOLOV3DarkNet53(True) """ def __init__(self, is_training, config=None): super(YOLOV3DarkNet53, self).__init__() self.config = config self.keep_detect = self.config.keep_detect self.tenser_to_array = P.TupleToArray() # YOLOv3 network self.feature_map = YOLOv3(backbone=DarkNet(ResidualBlock, [1, 2, 8, 8, 4], [32, 64, 128, 256, 512], [64, 128, 256, 512, 1024], detect=True), backbone_shape=[64, 128, 256, 512, 1024], out_channel=self.config.out_channel) # prediction on the default anchor boxes self.detect_1 = DetectionBlock('l', is_training=is_training, config=self.config) self.detect_2 = DetectionBlock('m', is_training=is_training, config=self.config) self.detect_3 = DetectionBlock('s', is_training=is_training, config=self.config) def construct(self, x): input_shape = F.shape(x)[2:4] input_shape = F.cast(self.tenser_to_array(input_shape), ms.float32) big_object_output, medium_object_output, small_object_output = self.feature_map(x) if not self.keep_detect: return big_object_output, medium_object_output, small_object_output output_big = self.detect_1(big_object_output, input_shape) output_me = self.detect_2(medium_object_output, input_shape) output_small = self.detect_3(small_object_output, input_shape) # big is the final output which has smallest feature map return output_big, output_me, output_small将 loss 的计算和网络组装在一起:class YoloWithLossCell(nn.Cell): """YOLOV3 loss.""" def __init__(self, network, config=None): super(YoloWithLossCell, self).__init__() self.yolo_network = network self.config = config self.tenser_to_array = P.TupleToArray() self.loss_big = YoloLossBlock('l', self.config) self.loss_me = YoloLossBlock('m', self.config) self.loss_small = YoloLossBlock('s', self.config) def construct(self, x, y_true_0, y_true_1, y_true_2, gt_0, gt_1, gt_2): input_shape = F.shape(x)[2:4] input_shape = F.cast(self.tenser_to_array(input_shape), ms.float32) yolo_out = self.yolo_network(x) loss_l = self.loss_big(*yolo_out[0], y_true_0, gt_0, input_shape) loss_m = self.loss_me(*yolo_out[1], y_true_1, gt_1, input_shape) loss_s = self.loss_small(*yolo_out[2], y_true_2, gt_2, input_shape) return loss_l + loss_m + loss_s(未完,请见下一篇 YOLOv3人体目标检测模型实现(三))
  • [问题求助] Atlas300T(9000)加速卡加速神经网络模型训练,使用pytorch框架,模型为LSTM
    【功能模块】硬件为Atlas300T(9000)操作系统centos7.9CANN版本:Ascend-cann-toolkit_5.1.RC2.alpha007_linux-x86_64pytorch版本:1.8.1-3.0-rc2需要训练模型为LSTM【操作步骤&问题现象】我这面想使用Atlas 300T 训练卡训练神经网络模型(LSTM),我查询到你们那面的框架是支持LSTM模型的,但我这面模型训练的时候老是会报错。【截图信息】报错对应部分代码(加粗行):class LSTM_DAE(torch.nn.Module):    def __init__(self, input_size, hidden_size, num_layers, output_size):        super(LSTM_DAE, self).__init__()        # 参数初始化        self.input_size = input_size        self.hidden_size = hidden_size        self.num_layers = num_layers        self.output_size = output_size                self.LSTM = nn.LSTM(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers)        self.reg1 = nn.Sequential(            nn.Linear(hidden_size, hidden_size // 2),            nn.ReLU(),            nn.Linear(hidden_size//2 , hidden_size // 2),            nn.ReLU(),            nn.Linear(hidden_size // 2, output_size)        )    def forward(self, x):        y, (hn, cn) = self.LSTM(x)        seq_len, batch_size, hidden_size = y.shape        self.LSTM.flatten_parameters()        y = y.view(-1, hidden_size)        y = self.reg1(y)        y = y.view(seq_len, batch_size, -1)        return y, (hn, cn)备注:1)程序在GPU服务器上是可以用GPU加速训练的;2)程序在NPU服务器上,若不加载到NPU上也是可以模型训练的,即程序中下面部分代码注释掉是可以运行的:    device= torch.device("npu:0")    if 'npu' in device:      torch_npu.npu.set_device(device)【日志信息】(可选,上传日志内容或者附件)
  • [教程] 深入了解神经网络
    深入了解神经网络本章将介绍用于解决实际问题的深度学习架构的不同模块。前一章使用PyTorch的低级操作构建了如网络架构、损失函数和优化器这些模块。本章将介绍用于解决真实问题的神经网络的一些重要组件,以及PyTorch如何通过提供大量高级函数来抽象出复杂度。本章还将介绍用于解决真实问题的算法,如回归、二分类、多类别分类等。本章将讨论如下主题:详解神经网络的不同构成组件;探究PyTorch中用于构建深度学习架构的高级功能;应用深度学习解决实际的图像分类问题。3.1 详解神经网络的组成部分上一章已经介绍了训练深度学习算法需要的几个步骤。1.构建数据管道。2.构建网络架构。3.使用损失函数评估架构。4.使用优化算法优化网络架构的权重。上一章中的网络由使用PyTorch数值运算构建的简单线性模型组成。尽管使用数值运算为玩具性质的问题搭建神经架构很简单,但当需要构建解决不同领域的复杂问题时,如计算机视觉和自然语言处理,构建一个架构就迅速变得复杂起来。大多数深度学习框架,如PyTorch、TensorFlow和Apache MXNet,都提供了抽象出很多复杂度的高级功能。这些深度学习框架的高级功能称为层(layer)。它们接收输入数据,进行如同在前面一章看到的各种变换,并输出数据。解决真实问题的深度学习架构通常由1~150个层组成,有时甚至更多。抽象出低层的运算并训练深度学习算法的过程如图3.1所示。 图3.13.1.1 层——神经网络的基本组成在本章的剩余部分,我们会见到各种不同类型的层。首先,先了解其中最重要的一种层:线性层,它就是我们前面讲过的网络层结构。线性层应用了线性变换:Y=Wx+b线性层之所以强大,是因为前一章所讲的功能都可以写成单一的代码行,如下所示。上述代码中的myLayer层,接受大小为10的张量作为输入,并在应用线性变换后输出一个大小为5的张量。下面是一个简单例子的实现:可以使用属性weights和bias访问层的可训练参数:线性层在不同的框架中使用的名称有所不同,有的称为dense层,有的称为全连接层(fully connected layer)。用于解决真实问题的深度学习架构通常包含不止一个层。在PyTorch中,可以用多种方式实现。一个简单的方法是把一层的输出传入给另一层:每一层都有自己的学习参数,在多个层的架构中,每层都学习出它本层一定的模式,其后的层将基于前一层学习出的模式构建。把线性层简单堆叠在一起是有问题的,因为它们不能学习到简单线性表示以外的新东西。我们通过一个简单的例子看一下,为什么把线性层堆叠在一起的做法并不合理。假设有具有如下权重的两个线性层:层权重Layer13.0Layer22.0以上包含两个不同层的架构可以简单表示为带有另一不同层的单层。因此,只是堆叠多个线性层并不能帮助我们的算法学习任何新东西。有时,这可能不太容易理解,我们可以用下面的数学公式对架构进行可视化:Y = 2(3X1) -2 Linear layersY = 6(X1) -1 Linear layers为解决这一问题,相较于只是专注于线性关系,我们可以使用不同的非线性函数,帮助学习不同的关系。深度学习中有很多不同的非线性函数。PyTorch以层的形式提供了这些非线性功能,因为可以采用线性层中相同的方式使用它们。一些流行的非线性函数如下所示:sigmoidtanhReLULeaky ReLU3.1.2 非线性激活函数非线性激活函数是获取输入,并对其应用数学变换从而生成输出的函数。我们在实战中可能遇到数个非线性操作。下面会讲解其中几个常用的非线性激活函数。1.sigmoidsigmoid激活函数的数学定义很简单,如下: 简单来说,sigmoid函数以实数作为输入,并以一个0到1之间的数值作为输出。对于一个极大的负值,它返回的值接近于0,而对于一个极大的正值,它返回的值接近于1。图3.2所示为sigmoid函数不同的输出。 图3.2sigmoid函数曾一度被不同的架构使用,但由于存在一个主要弊端,因此最近已经不太常用了。当sigmoid函数的输出值接近于0或1时,sigmoid函数前一层的梯度接近于0,由于前一层的学习参数的梯度接近于0,使得权重不能经常调整,从而产生了无效神经元。2.tanh非线性函数tanh将实数值输出为-1到1之间的值。当tanh的输出极值接近-1和1时,也面临梯度饱和的问题。不过,因为tanh的输出是以0为中心的,所以比sigmoid更受偏爱,如图3.3所示。 图3.33.ReLU近年来ReLU变得很受欢迎,我们几乎可以在任意的现代架构中找到ReLU或其某一变体的身影。它的数学公式很简单:f(x)=max(0,x)简单来说,ReLU把所有负值取作0,正值保持不变。可以对ReLU函数进行可视化,如图3.4所示。 图3.4使用ReLU函数的一些好处和弊端如下。有助于优化器更快地找到正确的权重集合。从技术上讲,它使随机梯度下降收敛得更快。计算成本低,因为只是判断了阈值,并未计算任何类似于sigmoid或tangent函数计算的内容。ReLU有一个缺点,即当一个很大的梯度进行反向传播时,流经的神经元经常会变得无效,这些神经元称为无效神经元,可以通过谨慎选择学习率来控制。我们将在第4章中讨论调整学习率的不同方式时,了解如何选择学习率。4.Leaky ReLULeaky ReLU尝试解决一个问题死角,它不再将饱和度置为0,而是设为一个非常小的数值,如0.001。对某些用例,这一激活函数提供了相较于其他激活函数更优异的性能,但它不是连续的。
  • [教程] 深入了解神经网络
    深入了解神经网络本章将介绍用于解决实际问题的深度学习架构的不同模块。前一章使用PyTorch的低级操作构建了如网络架构、损失函数和优化器这些模块。本章将介绍用于解决真实问题的神经网络的一些重要组件,以及PyTorch如何通过提供大量高级函数来抽象出复杂度。本章还将介绍用于解决真实问题的算法,如回归、二分类、多类别分类等。本章将讨论如下主题:详解神经网络的不同构成组件;探究PyTorch中用于构建深度学习架构的高级功能;应用深度学习解决实际的图像分类问题。3.1 详解神经网络的组成部分上一章已经介绍了训练深度学习算法需要的几个步骤。1.构建数据管道。2.构建网络架构。3.使用损失函数评估架构。4.使用优化算法优化网络架构的权重。上一章中的网络由使用PyTorch数值运算构建的简单线性模型组成。尽管使用数值运算为玩具性质的问题搭建神经架构很简单,但当需要构建解决不同领域的复杂问题时,如计算机视觉和自然语言处理,构建一个架构就迅速变得复杂起来。大多数深度学习框架,如PyTorch、TensorFlow和Apache MXNet,都提供了抽象出很多复杂度的高级功能。这些深度学习框架的高级功能称为层(layer)。它们接收输入数据,进行如同在前面一章看到的各种变换,并输出数据。解决真实问题的深度学习架构通常由1~150个层组成,有时甚至更多。抽象出低层的运算并训练深度学习算法的过程如图3.1所示。 图3.13.1.1 层——神经网络的基本组成在本章的剩余部分,我们会见到各种不同类型的层。首先,先了解其中最重要的一种层:线性层,它就是我们前面讲过的网络层结构。线性层应用了线性变换:Y=Wx+b线性层之所以强大,是因为前一章所讲的功能都可以写成单一的代码行,如下所示。上述代码中的myLayer层,接受大小为10的张量作为输入,并在应用线性变换后输出一个大小为5的张量。下面是一个简单例子的实现:可以使用属性weights和bias访问层的可训练参数:线性层在不同的框架中使用的名称有所不同,有的称为dense层,有的称为全连接层(fully connected layer)。用于解决真实问题的深度学习架构通常包含不止一个层。在PyTorch中,可以用多种方式实现。一个简单的方法是把一层的输出传入给另一层:每一层都有自己的学习参数,在多个层的架构中,每层都学习出它本层一定的模式,其后的层将基于前一层学习出的模式构建。把线性层简单堆叠在一起是有问题的,因为它们不能学习到简单线性表示以外的新东西。我们通过一个简单的例子看一下,为什么把线性层堆叠在一起的做法并不合理。假设有具有如下权重的两个线性层:层权重Layer13.0Layer22.0以上包含两个不同层的架构可以简单表示为带有另一不同层的单层。因此,只是堆叠多个线性层并不能帮助我们的算法学习任何新东西。有时,这可能不太容易理解,我们可以用下面的数学公式对架构进行可视化:Y = 2(3X1) -2 Linear layersY = 6(X1) -1 Linear layers为解决这一问题,相较于只是专注于线性关系,我们可以使用不同的非线性函数,帮助学习不同的关系。深度学习中有很多不同的非线性函数。PyTorch以层的形式提供了这些非线性功能,因为可以采用线性层中相同的方式使用它们。一些流行的非线性函数如下所示:sigmoidtanhReLULeaky ReLU3.1.2 非线性激活函数非线性激活函数是获取输入,并对其应用数学变换从而生成输出的函数。我们在实战中可能遇到数个非线性操作。下面会讲解其中几个常用的非线性激活函数。1.sigmoidsigmoid激活函数的数学定义很简单,如下: 简单来说,sigmoid函数以实数作为输入,并以一个0到1之间的数值作为输出。对于一个极大的负值,它返回的值接近于0,而对于一个极大的正值,它返回的值接近于1。图3.2所示为sigmoid函数不同的输出。 图3.2sigmoid函数曾一度被不同的架构使用,但由于存在一个主要弊端,因此最近已经不太常用了。当sigmoid函数的输出值接近于0或1时,sigmoid函数前一层的梯度接近于0,由于前一层的学习参数的梯度接近于0,使得权重不能经常调整,从而产生了无效神经元。2.tanh非线性函数tanh将实数值输出为-1到1之间的值。当tanh的输出极值接近-1和1时,也面临梯度饱和的问题。不过,因为tanh的输出是以0为中心的,所以比sigmoid更受偏爱,如图3.3所示。 图3.33.ReLU近年来ReLU变得很受欢迎,我们几乎可以在任意的现代架构中找到ReLU或其某一变体的身影。它的数学公式很简单:f(x)=max(0,x)简单来说,ReLU把所有负值取作0,正值保持不变。可以对ReLU函数进行可视化,如图3.4所示。 图3.4使用ReLU函数的一些好处和弊端如下。有助于优化器更快地找到正确的权重集合。从技术上讲,它使随机梯度下降收敛得更快。计算成本低,因为只是判断了阈值,并未计算任何类似于sigmoid或tangent函数计算的内容。ReLU有一个缺点,即当一个很大的梯度进行反向传播时,流经的神经元经常会变得无效,这些神经元称为无效神经元,可以通过谨慎选择学习率来控制。我们将在第4章中讨论调整学习率的不同方式时,了解如何选择学习率。4.Leaky ReLULeaky ReLU尝试解决一个问题死角,它不再将饱和度置为0,而是设为一个非常小的数值,如0.001。对某些用例,这一激活函数提供了相较于其他激活函数更优异的性能,但它不是连续的。
  • [参赛经验分享] 赛事回顾 | 第四届·2022量子计算黑客松全国大赛圆满落幕!
    随着全球新一轮科技革命的飞速发展,颠覆性技术革新风起云涌,量子科技当之无愧是最引人瞩目的焦点。2022年5月29日,由HiQ量子计算软件团队、上海大学、电子科技大学、南方科技大学、昇思MindSpore社区和华为云ModelArts平台联合举办的第四届·2022量子计算黑客松全国大赛决赛圆满落幕。1大赛赛况总结本此大赛历时两个多月,吸引了来自北京大学、清华大学、中国科学技术大学、复旦大学、浙江大学、上海交通大学、中山大学、南方科技大学、上海大学等国内外170多所高校的本科生、研究生以及建信金科、中国金融认证中心等企业员工,总计500多人报名。近200个团队参与本次比赛,共同创新,推动量子计算的技术研究。为了体现前沿性和交叉性,本次参赛题目涉及量子计算、量子化学、机器学习等交叉学科。初赛题目颇具挑战性,赛题1“利用量子经典混合的神经网络来完成手写字体识别任务”、赛题2“量子化学模拟——基态能求解的浅层线路设计”,基于高性能开源量子计算框架MindSpore Quantum和HiQ量子计算云平台完成赛题。参赛团队之间互相启发,台上竞争,台下合作,经过层层选拔,最终有13个团队、28名优秀选手成功晋级总决赛,汇聚一堂巅峰对决。2嘉宾评委阵容强大2022年5月29日总决赛在线上如期举行。决赛邀请六位量子计算领域的专家组成评审团,分别是南方科技大学物理系教授、HiQ量子计算软件与算法首席科学家翁文康老师,中国科学院计算机技术研究所研究员孙晓明老师,北京清华大学自动化系教授吴热冰老师,上海交通大学物理系教授唐豪老师,电子科技大学计算机系教授王晓霆老师,MindSpore Quantum高级研究员徐旭升博士。决赛答辩环节,由于日程紧,团队多,给予评委团的压力很大。但是,我们的嘉宾评委全程保持了高度专注,认真听取每一支队伍的决赛演讲,以公正、严谨的态度进行打分,并从自己的专业出发为作品提出中肯的意见和建议。各队选手均是有备而来,凭借深厚的专业知识、对赛题创新性的深入挖掘和团队协作精神,深深的打动了各位评委老师,答辩提问环节选手对评委老师的各种挑战和提问也是应对自如。3角逐冠军,竞争激烈!决赛评审团从创新性、通用性、性能三个维度进行评分,经过激烈的角逐,来自重庆大学的参赛团队以总分第一名的成绩,获得冠军,来自上海大学的两支队伍同时获得亚军。此外还产生了三等奖三名,优秀奖七名。恭喜以下获奖团队,让我们来一睹他们的团队风采吧!一等奖获奖团队:五点组会也没关系团队成员:储贻达、周彦桦、徐维(重庆大学)二等奖获奖团队:Hbar团队成员:唐加亮、王瑞、李宇栋(上海大学)获奖团队:Fenice团队成员:徐宜家、刘懿贤(上海大学)三等奖获奖团队:量子emo小分队团队成员:周旭(中山大学)、刘佳薇(中国科学技术大学)、周俊园(南方科技大学)获奖团队:为什么神经网络和化学都要做团队成员:陈柄任(建信金融科技有限责任公司) 、 于小涵(电子科技大学)获奖团队:零熵 团队成员:耿力(同济大学)优秀奖4 总结没有横空出世的幸运,只有不为人知的努力,在征服与挑战中,各位选手在本次大赛中都收获了属于自己的那一份荣誉与认同。来自不同院校和企业的参赛选手、组织者在一起不仅收获了成绩,更多的是在学术交流和创新实践中收获知识、经验和友情。本次大赛涌现了一大波量子计算种子选手,将成为我国量子计算的后备人才。我们相信通过量子计算黑客松这样的重量级精品赛事,将选拔出更多量子计算优秀人才参与到量子计算的研究中来,推动我国量子计算事业发展。  值得一提的是华为已连续举办了四届量子计算黑客松全国大赛,也受到来自全国各高校和企业单位的高度重视和大力支持。重庆大学物理学院、上海大学新闻网、中国海洋大学信息科学与工程学部、上海科技报、新民晚报等多家高校网站和媒体纷纷对赛事进行报道。
  • [其他] 浅谈k近邻算法
    K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。KNN 的模型表示就是整个训练数据集。对新数据点的预测结果是通过在整个训练集上搜索与该数据点最相似的 K 个实例(近邻)并且总结这 K 个实例的输出变量而得出的。对于回归问题来说,预测结果可能就是输出变量的均值;而对于分类问题来说,预测结果可能是众数(或最常见的)的类的值。关键之处在于如何判定数据实例之间的相似程度。如果你的数据特征尺度相同(例如,都以英寸为单位),那么最简单的度量技术就是使用欧几里得距离,你可以根据输入变量之间的差异直接计算出该值。KNN 算法本身简单有效,它是一种 lazy-learning 算法,分类器不需要使用训练集进行训练,训练时间复杂度为0。KNN 分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为 n,那么 KNN 的分类时间复杂度为O(n)。KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。K 近邻算法使用的模型实际上对应于对特征空间的划分。K 值的选择,距离度量和分类决策规则是该算法的三个基本要素:    K 值的选择会对算法的结果产生重大影响。K值较小意味着只有与输入实例较近的训练实例才会对预测结果起作用,但容易发生过拟合;如果 K 值较大,优点是可以减少学习的估计误差,但缺点是学习的近似误差增大,这时与输入实例较远的训练实例也会对预测起作用,使预测发生错误。在实际应用中,K 值一般选择一个较小的数值,通常采用交叉验证的方法来选择最优的 K 值。随着训练实例数目趋向于无穷和 K=1 时,误差率不会超过贝叶斯误差率的2倍,如果K也趋向于无穷,则误差率趋向于贝叶斯误差率。    该算法中的分类决策规则往往是多数表决,即由输入实例的 K 个最临近的训练实例中的多数类决定输入实例的类别    距离度量一般采用 Lp 距离,当p=2时,即为欧氏距离,在度量之前,应该将每个属性的值规范化,这样有助于防止具有较大初始值域的属性比具有较小初始值域的属性的权重过大。
  • [技术干货] 人工神经网络训练图像分类器
    我们将仅使用全连接层在20000张图像上训练图像分类模型。所以没有卷积和其他花哨的东西,我们将把它们留到下一篇文章中。不用说,但你真的不应该使用普通的人工神经网络来分类图像。图像是二维的,通过展平图像,你将失去使图像可识别的模式。尽管如此,它还是很有趣且可行的,并且会让你洞察这种方法的所有错误。使用的数据集和数据准备我们将使用Kaggle的狗与猫数据集。它是根据知识共享许可证授权的,这意味着你可以免费使用它:图1:狗与猫数据集:该数据集相当大——25000张图像均匀分布在不同的类中(12500张狗图像和12500张猫图像)。它应该足够大,可以训练一个像样的图像分类器,但不能使用人工神经网络。唯一的问题是——它的结构不适合直接使用。你可以按照之前的文章创建一个适当的目录结构,并将其拆分为训练集、测试集和验证集:缩小、灰度化和展平图像让我们导入相关库。我们需要很多,需要安装Numpy、Pandas、TensorFlow、PIL和Scikit Learn:我们不能将图像直接传递到Dense层。单个图像是三维的——高度、宽度、颜色通道——而Dense层需要一维输入。让我们看一个例子。以下代码加载并显示训练集中的cat图像:src_img = Image.open('data/train/cat/1.jpg')display(src_img)图2——猫的图片示例图像宽281像素,高300像素,有三个颜色通道(np.array(src_img).shape)。总的来说,它有252900个像素,在展平时转化为252900个特征。让我们尽可能节省一些资源。如果有意义的话,你应该对你的图像数据集进行灰度化。如果你能对不以颜色显示的图像进行分类,那么神经网络也应该如此。可以使用以下代码段将图像转换为灰色:gray_img = ImageOps.grayscale(src_img)display(gray_img)图3:灰色猫图像显然,它仍然是一只猫,所以颜色在这个数据集中并没有起到很大作用。灰度图像宽281像素,高300像素,但只有一个颜色通道。这意味着我们从252,900 像素减少到84,300 像素。仍然很多,但肯定是朝着正确的方向迈出了一步。数据集中的图像大小不同。这对于神经网络模型来说是个问题,因为它每次都需要相同数量的输入特征。我们可以将每个图像调整为相同的宽度和高度,以进一步减少输入特征的数量。下面的代码片段调整了图像的大小,使其既宽又高96像素:gray_resized_img = gray_img.resize(size=(96, 96))display(gray_resized_img)图4:调整大小的猫图片当然,图像有点小而且模糊,但它仍然是一只猫。但是我们的特征减少到9216个,相当于将特征的数量减少了27倍。作为最后一步,我们需要将图像展平。你可以使用Numpy中的ravel函数来执行此操作:np.ravel(gray_resized_img)图5:扁平猫图片计算机就是这样看待猫的——它只是一个9216像素的数组,范围从0到255。问题是——神经网络更喜欢0到1之间的范围。我们将整个数组除以255.0即可:img_final = np.ravel(gray_resized_img) / 255.0img_final图6-扁平和缩放的猫图像作为最后一步,我们将编写一个process_image函数,将上述所有转换应用于单个图像:让我们在随机的狗图像上进行测试,然后反转最后一步,以直观地表示图像:tst_img = process_image(img_path='data/validation/dog/10012.jpg')Image.fromarray(np.uint8(tst_img * 255).reshape((96, 96)))图7:经过变换的狗形象就这样,这个函数就像字面意思。接下来,我们将其应用于整个数据集。将图像转换为表格数据进行深度学习我们将编写另一个函数——process_folder——它迭代给定的文件夹,并在任何JPG文件上使用process_image函数。然后,它将所有图像合并到一个数据帧中,并添加一个类作为附加列(猫或狗):让我们将其应用于训练、测试和验证文件夹。每个文件夹需要调用两次,一次用于猫,一次用于狗,然后连接集合。我们还将把数据集转储到pickle文件中:下面是训练集的样子:# Training settrain_cat = process_folder(folder=pathlib.Path.cwd().joinpath('data/train/cat'))train_dog = process_folder(folder=pathlib.Path.cwd().joinpath('data/train/dog'))train_set = pd.concat([train_cat, train_dog], axis=0)with open('train_set.pkl', 'wb') as f:   pickle.dump(train_set, f)# Test settest_cat = process_folder(folder=pathlib.Path.cwd().joinpath('data/test/cat'))test_dog = process_folder(folder=pathlib.Path.cwd().joinpath('data/test/dog'))test_set = pd.concat([test_cat, test_dog], axis=0)with open('test_set.pkl', 'wb') as f:   pickle.dump(test_set, f)# Validation set valid_cat = process_folder(folder=pathlib.Path.cwd().joinpath('data/validation/cat'))valid_dog = process_folder(folder=pathlib.Path.cwd().joinpath('data/validation/dog'))valid_set = pd.concat([valid_cat, valid_dog], axis=0)with open('valid_set.pkl', 'wb') as f:   pickle.dump(valid_set, f)图8——训练集数据集包含所有猫的图像,然后是所有狗的图像。这对于训练集和验证集来说并不理想,因为神经网络会按照这个顺序看到它们。你可以使用Scikit Learn中的随机函数来随机排序:train_set = shuffle(train_set).reset_index(drop=True)valid_set = shuffle(valid_set).reset_index(drop=True)下面是它现在的样子:图9——随机后的训练集下一步是将特征与目标分离。我们将对所有三个子集进行拆分:X_train = train_set.drop('class', axis=1)y_train = train_set['class']X_valid = valid_set.drop('class', axis=1)y_valid = valid_set['class']X_test = test_set.drop('class', axis=1)y_test = test_set['class']最后,使用数字编码目标变量。有两个不同的类(cat和dog),因此每个实例的目标变量应该包含两个元素。例如,使用factorize函数进行编码:y_train.factorize()图10-factorize函数标签被转换成整数——猫为0,狗为1。你可以使用TensorFlow中的to_category函数,并传入factorize后的数组,以及不同类的数量(2):y_train = tf.keras.utils.to_categorical(y_train.factorize()[0], num_classes=2)y_valid = tf.keras.utils.to_categorical(y_valid.factorize()[0], num_classes=2)y_test = tf.keras.utils.to_categorical(y_test.factorize()[0], num_classes=2)因此,y_train现在看起来是这样的:图11——目标变量从概率的角度考虑——第一张图片有100%的几率是猫,0%的几率是狗。这些都是真实的标签,所以概率可以是0或1。我们现在终于有了训练神经网络模型所需的一切。用人工神经网络(ANN)训练图像分类模型我随机选择了层的数量和每层的节点数量,以下2部分不能更改:· 输出层——它需要两个节点,因为我们有两个不同的类。我们不能再使用sigmoid激活函数了,所以选择softmax。· 损失函数——我们使用分类交叉熵。其他部分可以随意更改:以下是我在100个epoch后得到的结果:图12:100个epoch后的ANN结果60%的准确率比猜测稍微好一点,但性能一般。尽管如此,我们还是来检查一下训练期间指标发生了什么变化。以下代码片段绘制了100个epoch中每个epoch的训练损失与验证损失:plt.plot(np.arange(1, 101), history.history['loss'], label='Training Loss')plt.plot(np.arange(1, 101), history.history['val_loss'], label='Validation Loss')plt.title('Training vs. Validation Loss', size=20)plt.xlabel('Epoch', size=14)plt.legend();图13:训练损失与验证损失该模型能很好地学习训练数据,但不能推广。随着我们对模型进行更多epoch的训练,验证损失继续增加,这表明模型不稳定且不可用。让我们看看准确度:plt.plot(np.arange(1, 101), history.history['accuracy'], label='Training Accuracy')plt.plot(np.arange(1, 101), history.history['val_accuracy'], label='Validation Accuracy')plt.title('Training vs. Validation Accuracy', size=20)plt.xlabel('Epoch', size=14)plt.legend();图14:训练准确度与验证准确度类似的图片。验证精度稳定在60%左右,而模型对训练数据的拟合度过高。对于一个包含20K训练图像的两类数据集,60%的准确率几乎是它所能达到的最差水平。原因很简单——Dense层的设计并不是为了捕捉二维图像数据的复杂性。结论现在你知道了——如何用人工神经网络训练一个图像分类模型,以及为什么你不应该这么做。这就像穿着人字拖爬山——也许你能做到,但最好不要。       原文标题 : 人工神经网络训练图像分类器
  • [行业资讯] 行业应用加速落地 5G+AI催化物联网蝶变
    新冠肺炎疫情防控期间,数字技术与线上经济以前所未有的广度和深度向全社会渗透。物联网作为将物理世界映射到数字世界的桥梁,正在从万物互联向万物智联迈进,在社会经济的数字化、智能化转型中扮演着越来越重要的角色。据工业和信息化部运行监测协调局统计,截至今年3月末,国内三家基础电信企业发展蜂窝物联网终端用户15.2亿户,规模快速接近移动电话用户。大体量的用户基数、丰富多样的应用场景,加上5G规模化商用部署、人工智能加速普及产生的叠加效应,我国物联网进入快速发展阶段。IDC报告预测,中国物联网IP连接量将在2025年达到102.7亿,占到亚太(除日本)总连接量的84%。中国企业紧抓数字经济与5G物联网的广阔机遇,面向智慧农业、多媒体、智慧办公、智慧健康、智慧物流等场景推出产品和服务,在助力国内各行各业数字化转型升级的同时,加快融入全球市场。《2022高通物联网创新应用蓝宝书》详细呈现了高通通过多样、领先的连接、计算、物联网等解决方案,支持国内厂商加速出海之路。5G+AI催化物联网蝶变物联网的存在,能有效采集千行百业的数据,并推动数据向结构化、精细化转变,从而促进数字经济与实体经济的融合发展。要充分发挥物联网在数字经济的信息基础设施作用,需要提升物联网的连接能力和处理能力,使之容纳更多终端、更高效地处理数据并覆盖更多场景。5G的高带宽、低时延,正在推动物联网从窄带物联网向大带宽物联网发展,支持100MB/秒的数据传输速度。5G的海量连接特性,可以做到一平方公里支持一百万个传感器联网,大大扩展了物联网的应用。而终端侧和边缘侧的人工智能,加速了数据的采集速度和处理效率,使物联网终端能够实现自动识别、自动跟随、实时导引等丰富多样的智能化功能。中国工程院院士邬贺铨指出,5G的高带宽、低时延打通了数据从采集到决策的全过程,将物联网与云计算、人工智能无缝融合。同时,人工智能芯片与操作系统可以直接嵌入5G物联网模块构成AIoT终端。所以5G物联网不仅是物联网的一种连接方式,5G内生的一些特点也赋能了物联网升级。作为无线技术供应商,高通在物联网、无线通信技术、AI领域有着长期的技术积累。在物联网方面,高通推出了专用的调制解调器、处理器、SoC和解决方案。在无线通信技术方面,高通提供了从支持蜂窝网络、广域网无线技术的调制解调器到射频前端的完整解决方案;在AI方面,高通将AI引擎引入了移动芯片和物联网专业芯片产品。同样值得注意的是,随着物联网向智慧医疗、家庭医疗、直播、办公等场景延伸,需要处理的已不仅仅是物与物的通信,也要满足用户握持、操作终端设备的需求,这就意味着终端要更加小巧轻便、易于部署。如在智慧办公领域,钉钉视频会议系统推出了集音箱、摄像、麦克风于一体的F2视频会议一体机,具备10米内的高音质和高清画面覆盖及智能化功能,在保证会议室与用户终端体验一致的同时,免去了繁琐的布线。F2一体机能够将诸多功能all in one,离不开高通集成了DSP(数字信号处理器)、图像处理及编解码、NPU等芯片的物联网处理器。基于DSP,F2视频会议一体机实现了高速率、全方位的音频捕捉以及抗混响、远距离拾音放音等能力。芯片的图像处理和编解码能力,使F2一体机能够支持最高4K、120帧/秒的视频处理。NPU带来的AI算力,支撑了自动取景、发言人跟踪、多画面自动导播等高阶功能,使与会者具备更好的会议参与感及被关注感。终端产品的简单易用,需要建立在芯片系统的高度集成上。高通多款用于物联网解决方案的移动芯片平台和物联网芯片,都将核心处理器、音视频信号处理、AI引擎、调制解调器等元器件集成到同一芯片平台,并采用高度集成的封装,以降低终端产品设计的复杂性,加快产品的研发上市。行业应用驱动数字经济行业应用是物联网发展的主要驱动力之一,物联网新型基础设施的规模化部署需要与千行百业紧密结合。工业和信息化部等八部门印发的《物联网新型基础设施建设三年行动计划(2021—2023年)》在社会治理、行业应用、民生消费三大领域重点推进12个行业的物联网部署,推进物联网与农业、制造业、建造业、生态环保、文旅等产业深度融合,促进产业提质增效。数字经济倍增作用的标志之一,是将倚重人力的传统行业转向信息化、数字化的运营模式。农业是对人力依赖性较强的传统行业之一,存在智能化、精细化不足的问题,因而容易受到有害生物和气候的影响。在卢森堡,芯讯通与Frontier Connect推出的“室外农田IoT物联网监测系统”,正在通过光学相机、图像控制器、紫外线传感器、智能仪表等传感设备,实时生成温湿度、光照时长、土壤PH值等影响作物生长的因素,以及水泵压力、灌溉时间等设备状态数据。在这套系统中,基于骁龙X55 5G调制解调器及射频系统研发的5G模组,保证了传感设备之间以及传感设备、监测终端、云端、显示终端之间的实时数据传输,让农业从业者可以通过手机、平板等终端随时访问农田数据,获取作物产量和质量的估算和预测。优化资源配置是数字经济“普惠性”的重要体现,医疗等存在资源配置不均的产业,尤其需要数字技术提升全流程的效率和体验。通过信息技术提升医护人员的整体工作效率,是满足民众日益增长的医护需求的有效方式。比如在最常见的输液场景中,如果人工核对药剂和病患,不仅效率有限还有出错的风险。东集推出的5G智慧医疗终端“小码哥Cruise2 5G-HC”,让医护人员能够利用这款轻薄易握的PDA数据采集器扫描输液袋上的条码呼叫病人,也能扫描病人的手持标签确认其身份,既提升了工作效率,也通过双向比对更好地保障用药安全。该终端内置骁龙690 5G移动平台,集成了骁龙X51 5G调制解调器,利用5G网络低至毫秒级的时延,大幅提升了数据的采集、识别速度,在提升医护人员工作效率的同时提升患者的就诊体验。在数字经济时代,数字技术对于文化消费的重塑,正在为消费升级和新的消费增长点培育注入动能。2021年,中央广播电视总台基于“5G+4K/8K+AI”技术矩阵,在东京奥运会报道中实现了全球首次4K超高清频道的奥运赛事直播,通过总台全媒体平台收看人次达479亿次。传统直播方式依赖卫星转播车等大型设备,在极端天气下时常遭遇信号中断等问题,且由于运输不便,在应对突发场景时存在局限。在5G时代,传媒和直播等产业的响应速度和制播效率有了新的可能。为此,移远通信与TVU Networks推出了5G直播背包及5G多网聚合路由器。5G的高速率、低时延和广连接能力,不仅大幅提升了新闻直播的数据采集、远端制作、远程传输能力和效率,还为广大观众带来4K/8K甚至VR级的视觉体验。这套TVU One 5G直播产品搭载了基于骁龙X55 5G调制解调器及射频系统的5G模组。信息显示,TVU One 5G直播包在实际超高清视频直播中的时延可低至0.5秒。高通对于全球蜂窝网和射频主要频段与传输方式的支持,也为国内企业开拓全球市场提供了便利。比如骁龙X55 5G调制解调器支持5G毫米波和6GHz以下频段,高通 9205芯片平台支持海外主流的物联网无线通信技术eMTC,使国内企业在进军海外市场的过程中避免了场测、认证等障碍,提升全球服务能力。
总条数:945 到第
上滑加载中