• 新颖的图卷积神经网络(gCNN)
    西北大学(Northwestern University)的研究人员开发了一种新颖的图卷积神经网络(gCNN),用于分析局部解剖形状和预测 Gf。皮质带和皮质下结构的形态学信息是从两个独立队列中的 T1 加权 MRI 中提取的,即儿童青少年大脑认知发展研究(ABCD;年龄:9.93 ± 0.62 岁)和人类连接组计划(HCP;年龄:28.81 ± 3.70 岁)。将皮质和皮质下表面结合在一起的预测为 ABCD(R = 0.314)和 HCP 数据集(R = 0.454)产生了最高精度的 Gf,优于历史文献中任何其他大脑测量对 Gf 的最新预测。在这两个数据集中,杏仁核、海马体和伏隔核的形态以及颞叶、顶叶和扣带皮质的形态一致地推动了对 Gf 的预测,这表明大脑形态和 Gf 之间的关系发生了重大的重构,包括与奖赏/厌恶处理、判断和决策、动机和情绪有关的系统。该研究以「A multicohort geometric deep learning study of age dependent cortical and subcortical morphologic interactions for fluid intelligence prediction」为题,于 2022 年 10 月 22 日发布在《Scientific Reports》。论文链接:https://www.nature.com/articles/s41598-022-22313-x了解智力的神经基础是一个长期的研究领域,历史上旨在识别涉及各种人类行为的大脑区域,特别是认知任务。Pioneering 和 Binet 的开创性工作发现,从命名对象到定义单词、绘图和解决类比,人类在各种任务中的行为总是不同的。Spearman 将这些观察结果综合到广义智力因素 g 的假设中,从而将人类行为与大脑功能联系起来,这反映了抽象思维,包括获取知识、适应新事物、开发抽象模型以及从学校教育和学习经验中受益的能力。Cattell 的进一步工作将 g 分为流体智能(Gf),即解决新问题和抽象推理的能力,以及与积累知识有关的结晶智能(Gc)。尽管 Gc 和 Gf 相关并在儿童期直至青春期迅速发展,但 Gf 在延迟下降之前的第三个十年达到稳定状态,而 Gc 在整个生命周期中继续发展。其中,Gf 已被证明与大量认知活动呈正相关,并且是教育和职业成功的重要预测指标。Gf 的这些高风险效应需要更好地了解其神经基质,首先要了解其神经解剖学基础。然而,如何找到大脑形态与 Gf 之间的关系仍不清楚。以前试图了解 Gf 的神经基质的工作集中在广泛的神经成像模式和病变模型上,每一种都有其局限性。例如,认知任务的功能成像研究,或血氧水平依赖(BOLO)信号的静息状态振荡之间的同步研究,集中在额顶叶网络,负责以顶叶整合理论的形式整合感觉和执行功能(P-FIT)。或者,结合脑损伤和成像分析的工作探索了多需求(MD)系统如何有助于 Gf。此外,独立于脑损伤的结构成像(即形态测量)也评估了大脑大小与 Gf 之间的相关性,或评估了特定皮质区域和白质纤维束对 Gf 的影响,但没有理论框架。使用这些成像方法,以前的研究已经确定了 Gf 和皮质形态之间的关联,例如皮质厚度、皮质面积、皮质体积、脑回和灰质密度。然而,没有研究皮层下结构的相对影响,也没有研究皮层下和额顶叶网络之外的大脑皮层区域之间的关系,例如颞叶皮层,这与一些基于洞察力的问题解决的适应性过程有关。在整个生命早期,神经变化如何与 Gf 相关非常重要,因为它提供了有关大脑成熟和衰老过程的有价值信息,并提供了对认知障碍的生理原因的洞察。研究人员发现 Gf 与年龄相关的强烈下降最近被归因于额叶皮层的白质差异。此外,Kievit 团队认为这些与年龄相关的变化是由灰质体积和前钳介导的。然而,由于神经系统的个体差异和复杂的与年龄相关的大脑变化,在这个问题上还没有达成共识。最近,形状分析已显示出通过分析表面几何特性来检测跨年龄和行为特征组的结构差异的前景。至关重要的是,这些差异通常无法通过体积变化或灰质变化来检测。因此,基于表面的方法可能对与人类行为和认知功能相关的细微大脑变化更敏感。此外,新皮质扩大主要取决于表面积的增长,这使得在考虑具有显著年龄差异的群组之间的相似性时,皮质和皮质下表面的测量很重要。因此,本研究将开发一种基于表面的方法来识别不同年龄组与 Gf 相关的大脑形态测量的一致和独特特征。来源:https://www.frontiersin.org/articles/10.3389/fnagi.2022.895535/full?&utm_source=Email_to_authors_&utm_medium=Email&utm_content=T1_11.5e1_author&utm_campaign=Email_publication&field=&journalName=Frontiers_in_Aging_Neuroscience&id=895535
  • [API使用] MindSpore Callback方法是否提供网络输出结果?
    run_context.original_args()中是否能获取训练输出的结果,例如是否能输出语义分割的pred_label数组,想用这些结果计算训练阶段的precision、recall等,注意是训练阶段的指标,而不是验证阶段。cb_param.net_outputs只能得到loss值。或者有计算训练阶段指标的其他方法吗?
  • [网络构建] Mindspore网络构建
    网络构建神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell,它由不同的子Cell构成。使用这样的嵌套结构,可以简单地使用面向对象编程的思维,对神经网络结构进行构建和管理。构建Mnist数据集分类的神经网洛import mindsporefrom mindspore import nn, ops个人理解:在代码层面也就是直接调用模块,通过模块来实现我们想要达成的效果。定义模型类定义神经网络时,可以继承nn.Cell类,在__init__方法中进行子Cell的实例化和状态管理,在construct方法中实现Tensor操作。class Network(nn.Cell): def __init__(self): super().__init__() self.flatten = nn.Flatten() self.dense_relu_sequential = nn.SequentialCell( nn.Dense(28*28, 512), nn.ReLU(), nn.Dense(512, 512), nn.ReLU(), nn.Dense(512, 10) ) def construct(self, x): x = self.flatten(x) logits = self.dense_relu_sequential(x) return logits #构建完成后,实例化Network对象,并查看其结构。 model = Network()print(model)Network< (flatten): Flatten<> (dense_relu_sequential): SequentialCell< (0): Dense (1): ReLU<> (2): Dense (3): ReLU<> (4): Dense >> #我们构造一个输入数据,直接调用模型,可以获得一个10维的Tensor输出,其包含每个类别的原始预测值。X = ops.ones((1, 28, 28), mindspore.float32)logits = model(X)print(logits) pred_probab = nn.Softmax(axis=1)(logits)y_pred = pred_probab.argmax(1)print(f"Predicted class: {y_pred}")模型层分解上节构造的神经网络模型中的每一层。input_image = ops.ones((5, 15, 18), mindspore.float32)print(input_image.shape) #输出结果 (5, 15, 18) #nn.Flatten层的实例化 flatten = nn.Flatten()flat_image = flatten(input_image)print(flat_image.shape) #nn.Dense全链层,权重和偏差对输入进行线性变换layer1 = nn.Dense(in_channels=20*20, out_channels=20)hidden1 = layer1(flat_image)print(hidden1.shape) #nn.ReLU层,网络中加入非线性的激活函数print(f"Before ReLU: {hidden1}\n\n")hidden1 = nn.ReLU()(hidden1)print(f"After ReLU: {hidden1}") #nn.SequentialCell容器配置seq_modules = nn.SequentialCell( flatten, layer1, nn.ReLU(), nn.Dense(15, 10)) logits = seq_modules(input_image)print(logits.shape) #nn.Softmax全链层返回的值进行预测softmax = nn.Softmax(axis=1)pred_probab = softmax(logits) 参数模型网络内部神经网络层具有权重参数和偏置参数print(f"Model structure: {model}\n\n") for name, param in model.parameters_and_names(): print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n")内置神经网络(mindspore.nn)1.基本构成单元接口名概述mindspore.nn.CellMindSpore中神经网络的基本构成单元。mindspore.nn.GraphCell运行从MindIR加载的计算图。mindspore.nn.LossBase损失函数的基类。mindspore.nn.Optimizer用于参数更新的优化器基类。2.循环神经网络层接口名概述mindspore.nn.RNN循环神经网络(RNN)层,其使用的激活函数为tanh或relu。mindspore.nn.RNNCell循环神经网络单元,激活函数是tanh或relu。mindspore.nn.GRUGRU(Gate Recurrent Unit)称为门控循环单元网络,是循环神经网络(Recurrent Neural Network, RNN)的一种。mindspore.nn.GRUCellGRU(Gate Recurrent Unit)称为门控循环单元。mindspore.nn.LSTM长短期记忆(LSTM)网络,根据输出序列和给定的初始状态计算输出序列和最终状态。mindspore.nn.LSTMCell长短期记忆网络单元(LSTMCell)。3.嵌入层接口名概述mindspore.nn.Embedding嵌入层。mindspore.nn.EmbeddingLookup嵌入查找层。mindspore.nn.MultiFieldEmbeddingLookup根据指定的索引和字段ID,返回输入Tensor的切片。4.池化层接口名概述mindspore.nn.AdaptiveAvgPool1d对输入的多维数据进行一维平面上的自适应平均池化运算。mindspore.nn.AdaptiveAvgPool2d二维自适应平均池化。mindspore.nn.AdaptiveAvgPool3d三维自适应平均池化。mindspore.nn.AdaptiveMaxPool1d对输入的多维数据进行一维平面上的自适应最大池化运算。mindspore.nn.AdaptiveMaxPool2d二维自适应最大池化运算。mindspore.nn.AvgPool1d对输入的多维数据进行一维平面上的平均池化运算。mindspore.nn.AvgPool2d对输入的多维数据进行二维的平均池化运算。mindspore.nn.MaxPool1d对时间数据进行最大池化运算。mindspore.nn.MaxPool2d对输入的多维数据进行二维的最大池化运算。5. 图像处理层接口名概述mindspore.nn.CentralCrop根据指定比例裁剪出图像的中心区域。mindspore.nn.ImageGradients计算每个颜色通道的图像渐变,返回为两个Tensor,分别表示高和宽方向上的变化率。mindspore.nn.MSSSIM多尺度计算两个图像之间的结构相似性(SSIM)。mindspore.nn.PSNR在批处理中计算两个图像的峰值信噪比(PSNR)。mindspore.nn.ResizeBilinear使用双线性插值调整输入Tensor为指定的大小。mindspore.nn.SSIM计算两个图像之间的结构相似性(SSIM)。因为篇幅原因,这里就不全部介绍了,后面会继续更新
  • [执行问题] 为什么Mindspore.numpy不支持tensor转换
    如图我想把numpy创建的变量转换成Tensor但是报错如图
  • [经验分享] 基于MindStudio的Resnet50深度学习模型开发
    基于MindStudio的MindX SDK应用开发全流程目录一、MindStudio介绍与安装 21 MindStudio介绍 22 MindSpore 安装 4二、MindX SDK介绍与安装 51 MindX SDK介绍 52.MindX SDK安装 6三、可视化流程编排介绍 81 SDK 基础概念 82.可视化流程编排 8四、SE-Resnet介绍 10五、开发过程 101 创建工程 102 代码开发 123 数据准备及模型准备 144 模型转换功能介绍 155 运行测试 16六、遇见的问题 21MindStudio介绍与安装相关课程:昇腾全流程开发工具链(MindStudio)本课程主要介绍MindStudio在昇腾AI开发中的使用,作为昇腾AI全栈中的全流程开发工具链,提供覆盖训练模型、推理应用和自定义算子开发三个场景下端到端工具,极大提高开发效率。建议开发前,学习该课程的第1章和第3章,可以少走很多弯路!!!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功能框架如图1-1所示,目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具等多种工具。图1-1 工具链功能架构工具功能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处理器开发依赖的头文件和库文件、编译工具链、调优工具等。MindStudio安装具体安装操作请参考:MindStudio安装指南 MindStudio环境搭建指导视频场景介绍纯开发场景(分部署形态):在非昇腾AI设备上安装MindStudio和Ascend-cann-toolkit开发套件包。可作为开发环境仅能用于代码开发、编译等不依赖于昇腾设备的开发活动(例如ATC模型转换、算子和推理应用程序的纯代码开发)。如果想运行应用程序或进行模型训练等,需要通过MindStudio远程连接功能连接已部署好运行环境所需软件包的昇腾AI设备。开发运行场景(共部署形态):在昇腾AI设备上安装MindStudio、Ascend-cann-toolkit开发套件包、npu-firmware安装包、npu-driver安装包和AI框架(进行模型训练时需要安装)。作为开发环境,开发人员可以进行普通的工程管理、代码编写、编译、模型转换等功能。同时可以作为运行环境,运行应用程序或进行模型训练。软件包介绍MindStudio:提供图形化开发界面,支持应用开发、调试和模型转换功能,同时还支持网络移植、优化和分析等功能。Ascend-cann-toolkit:开发套件包。为开发者提供基于昇腾AI处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的模型、算子和应用的开发。开发套件包只能安装在Linux服务器上,开发者可以在安装开发套件包后,使用MindStudio开发工具进行快速开发。MindX SDK介绍与安装MindX SDK介绍MindX SDK提供昇腾AI处理器加速的各类AI软件开发套件(SDK),提供极简易用的API,加速AI应用的开发。应用开发旨在使用华为提供的SDK和应用案例快速开发并部署人工智能应用,是基于现有模型、使用pyACL提供的Python语言API库开发深度神经网络应用,用于实现目标识别、图像分类等功能。图2-1 MindX SDK总体结构通过MindStudio实现SDK应用开发分为基础开发与深入开发,通常情况下用户关注基础开发即可,基础开发主要包含如何通过现有的插件构建业务流并实现业务数据对接,采用模块化的设计理念,将业务流程中的各个功能单元封装成独立的插件,通过插件的串接快速构建推理业务。mxManufacture & mxVision关键特性:配置文件快速构建AI推理业务。插件化开发模式,将整个推理流程“插件化”,每个插件提供一种功能,通过组装不同的插件,灵活适配推理业务流程。提供丰富的插件库,用户可根据业务需求组合Jpeg解码、抠图、缩放、模型推理、数据序列化等插件。基于Ascend Computing Language(ACL),提供常用功能的高级API,如模型推理、解码、预处理等,简化Ascend芯片应用开发。支持自定义插件开发,用户可快速地将自己的业务逻辑封装成插件,打造自己的应用插件。MindX SDK安装步骤1 Windows场景下基于MindStuido的SDK应用开发,请先确保远端环境上MindX SDK软件包已安装完成,安装方式请参见《mxManufacture 用户指南》 和《mxVision 用户指南》 的“使用命令行方式开发”>“安装MindX SDK开发套件”章节。步骤2 在Windows本地进入工程创建页面,工具栏点击File > Settings > Appearance & Behavior > System Settings > MindX SDK进入MindX SDK管理界面。界面中MindX SDK Location为软件包的默认安装路径,默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。单击Install SDK进入Installation settings界面,如图2-2。图2-2 MindX SDK管理界面如图2-3所示,为MindX SDK的安装界面,各参数选择如下:Remote Connection:远程连接的用户及IP。Remote CANN Location:远端环境上CANN开发套件包的路径,请配置到版本号一级。Remote SDK Location:远端环境上SDK的路径,请配置到版本号一级。IDE将同步该层级下的include、opensource、python、samples文件夹到本地Windows环境,层级选择错误将导致安装失败。Local SDK Location:同步远端环境上SDK文件夹到本地的路径。默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。图2-3 MindX SDK安装界面图2-4 安装完成后的MindX SDK管理界面步骤3 单击OK结束,返回SDK管理界面,可查看安装后的SDK的信息,如图2-4所示,可单击OK结束安装流程。可视化流程编排介绍SDK基础概念通过stream(业务流)配置文件,Stream manager(业务流管理模块)可识别需要构建的element(功能元件)以及element之间的连接关系,并启动业务流程。Stream manager对外提供接口,用于向stream发送数据和获取结果,帮助用户实现业务对接。Plugin(功能插件)表示业务流程中的基础模块,通过element的串接构建成一个stream。Buffer(插件缓存)用于内部挂载解码前后的视频、图像数据,是element之间传递的数据结构,同时也允许用户挂载Metadata(插件元数据),用于存放结构化数据(如目标检测结果)或过程数据(如缩放后的图像)。图3-1 SDK业务流程相关基础单元可视化流程编排MindX SDK实现功能的最小粒度是插件,每一个插件实现特定的功能,如图片解码、图片缩放等。流程编排是将这些插件按照合理的顺序编排,实现负责的功能。可视化流程编排是以可视化的方式,开发数据流图,生成pipeline文件供应用框架使用。图 4-2 为推理业务流Stream配置文件pipeline样例。配置文件以json格式编写,用户必须指定业务流名称、元件名称和插件名称,并根据需要,补充元件属性和下游元件名称信息。步骤1 进入工程创建页面,用户可通过以下方式开始流程编排。在顶部菜单栏中选择Ascend>MindX SDK Pipeline,打开空白的pipeline绘制界面绘制,也可打开用户自行绘制好的pipeline文件,如图3-3。绘制界面分为左侧插件库、中间编辑区、右侧插件属性展示区,具体参考pipeline绘制 。步骤2 在左侧编辑框选择插件,拖动至中间编辑框,按照用户的业务流程进行连接。如果拖动错误插件或者错误连线,选中错误插件或者错误连线单击键盘Del键删除。用户自定义的流水线绘制完成后,选中流水线中的所有插件,右键选择Set Stream Name设置Stream名称,如果有多条流水线则需要对每一条流水线设置Stream名称。绘制完成单击Save保存。图3-2 Detection and Classification配置pipeline样例图3-3 pipeline绘制界面SE-Resnet50介绍残差神经网络是何凯明提出的网络.在深度学习中,网络越深往往取得的效果越好,但是设计的网络过深后若干不为零的梯度相乘导致了梯度消失的现象影响了训练,在残差神经网络中借助其残差结构可以有效的避免梯度消失的问题,在imagenet数据集上取得了优异的结果.SE-Resnet50网络结构,如图4-1所示:图4-1 SE-Resnet50网络结构开发过程创建工程步骤一:安装完成后,点击 ”New Project” 创建新的项目,进入创建工程界面。选择Ascend App项目类别,然后就是常规的命名和路径修改,在CANN Version处点击change配置远程连接和远程CANN地址。图5-1-1 创建项目步骤二:点击CANN Version的Change后进入下界面进行相关配置,点击远程连接配置的最右侧添加按钮。图5-1-2 远程连接配置步骤三:在定义SSH 配置、保存远程服务器的连接配置后返回Remote CANN Setting界面,继续配置CANN location。加载完后再点击Finish即可完成远程环境配置。图5-1-3 配置CANN location 步骤四:完成远程连接设置后,点击next会进到模板选择界面,由于我们是推理任务,此时我们选择MindX SDK Project(Python),再点击Finish。MindX SDK(昇腾行业SDK),提供面向不同行业使能的开发套件,简化了使用昇腾芯片推理业务开发的过程。SDK提供了以昇腾硬件功能为基础的功能插件,用户可以通过拼接功能插件,快速构建推理业务,也可以开发自定义功能插件。图5-1-4 MindX SDK Project(Python)代码开发代码地址:cid:link_2SDK相关工程目录结构:代码介绍:acc.py:求精度代码,在得到sdk推理结果之后会运行acc.py来求精度,具体使用会在本章节运行测试部分详细展示.data_to_bin.py:数据预处理代码,会将数据集中图片转换为二进制形式保存在路径中,具体使用会在本章节数据准备部分详细展示infer.py:里面包含了Sdk_Api这个类,其中主要使用到的函数为图5-2-1 将cv形式输入转换为sdk输入图5-2-2 得到输出结果config.py:已经写好的配置文件,运行时不需要改动Se_resnet50_ms_test.pipeline:pipeline配置文件,运行时需要修改其中的om文件路径,具体会在运行测试部分详细说明.main.py:推理时所运行的文件,会将所有经过预处理之后的二进制文件通过图5-2-1、5-2-2所示函数,得到推理结果.数据准备及模型准备数据集使用的是imagenet,在infer/sdk/目录下先创建一个文件夹“./dataset”,将910上经过数据预处理的图片保存为二进制放入,具体操作如下:在910服务器上执行文件data_to_bin.py图5-3-1 data_to_bin.py配置参数在文件中将数据集路径如图5-3-1所示改为实际路径之后,运行python data_to_bin.py.运行之后./dataset中会生成images与target两个文件夹,里面分别为图片经过预处理之后保存的二进制文件以及每个图片对应的lebel.图5-3-2 生成的images与target的二进制文件在准备好二进制文件后在910上导出onnx模型文件,保存到infer/sdk目录下。具体操作如下:按照图5-3-3所示位置修改pth路径信息,之后运行python pthtar2onnx.py图5-3-3修改pth路径信息图5-3-4 生成onnx文件运行之后会生成图5-3-4所示onnx文件.模型转换功能介绍用户使用torch框架训练好的第三方模型,在导出onnx模型后,可通过ATC工具将其转换为昇腾AI处理器支持的离线模型(*.om文件),模型转换过程中可以实现算子调度的优化、权重数据重排、内存使用优化等,可以脱离设备完成模型的预处理,详细架构如图5-4-1所示。图5-4-1 ATC工具功能架构在本项目中,要将pytorch框架下训练好的模型(*.onnx文件),转换为昇腾AI处理器支持的离线模型(*.om文件),具体步骤如下:步骤1 点击Ascend > Model Converter,进入模型转换界面,参数配置如图5-4-2所示,若没有CANN Machine,请参见第六章第一节CANN安装。图5-4-2 模型转换界面1各参数解释如下表所示:CANN MachineCANN的远程服务器Model File*.onnx文件的路径(可以在本地,也可以在服务器上)Model Name生成的om模型名字Output Path生成的om模型保存在本地的路径步骤2 点击Next进入图5-4-3界面,该项目数据不需要预处理,直接点击Next,进入图5-4-4界面,再点击Finish开始模型转换。图5-4-3 模型转换界面2图5-4-4 模型转换界面3步骤3 等待出现如图5-4-5所示的提示,模型转换成功图5-4-5模型转换成功运行测试步骤1 修改“sdk/config/SE-resnet50.pipeline”中的参数,具体操作如图5-5-1所示;图5-5-1 修改pipeline中*.om文件路径步骤2 在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面。选择“Ascend App > 工程名”配置应用工程运行参数,图5-5-2为配置示例。配置完成后,单击“Apply”保存运行配置,单击“OK”,关闭运行配置窗口。图5-5-2 工程推理工程运行参数配置在本工程中,推理时运行文件选择main.py,运行参数为--img_path [LR_path] --dataset_name images --pipeline_path [pipeline_path] python3 main.py --img_path "/home/data/xd_mindx/csl/val/" --dataset_name images --pipeline_path "/home/data/xd_mindx/csl/infer/sdk/config/SE-resnet50_test.pipeline"参数解释如下表:参数解释我的设置img_path推理图片路径./val/images/pipeline_pathPipeline文件路径./config/Se_resnet50_ms_test.pipelineinfer_result_dir推理结果保存路径./infer_result/images/images/步骤3 点击运行,出现如图5-5-3所示提示,即为运行成功,infer_result文件夹中即为推理结果,保存为二进制形式。图5-5-3推理操作过程步骤4 配置后处理运行程序,在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面,如图5-5-4所示,点击“+”,后选择Python(后处理可以直接在本地运行),如图5-5-5所示。图5-5-4运行配置界面图5-5-5 运行后处理相关配置Script path运行文件路径Parameters运行时的参数如图5-5-5所示,运行文件为acc.py:步骤5 点击运行,出现如图5-5-6所示提示,即为运行成功。图5-5-6 运行后处理程序步骤6 结果分析,如图5-5-6所示,已经达到了标准精度。 遇见的问题在使用MindStudio时,遇到问题,可以登陆MindStudio昇腾论坛进行互动,提出问题,会有专家老师为你解答。模型转换时,没有CANN Machine图6-1 CANN管理界面解决方案:按以下步骤,重新安装CANN Machine步骤1 点击File>Settings>Appearance & Behavior > System Settings > CANN,进入CANN管理界面,如图6-1所示:步骤2 点击Change CANN,进入Remote CANN Setting界面,如图6-2所示重新安装CANN,点击Finish,安装CANN。6-2 Remote CANN Setting界面图6-3 安装CANN完成参数解释如下表:Remote Connection远程服务器IPRemote CANN location远程服务器中CANN路径步骤3 完成CANN安装,点击OK,重启MindStudio,如图6-3所示。MindStudio导入应用工程后,提示“No Python interpreter configured for the module”解决方案:步骤1 在顶部菜单栏中选择File > Project Structure,在Project Structure窗口中,点击Platform Settings > SDKs,点击上方的“+”添加Python SDK,从本地环境中导入Python,如图6-4所示。图6-4 导入Python SDK步骤2 点击Project Settings > Project,选择上一步添加的Python SDK,如图6-5所示。图6-5 设置Project SDK步骤3 点击Project Settings > Modules,选中“MyApp”,点击“+”后选择Python,为Python Interpreter选择上述添加的Python SDK。点击OK完成应用工程Python SDK配置,如图6-6所示。图6-6 选择Python SDK
  • [其他] 《深度学习入门》笔记 - 20
    因变量的常见数据类型有三种:定量数据、二分类定性数据和多分类定性数据。输出层激活函数的选择主要取决于因变量的数据类型。MNIST数据集是机器学习文献中常用的数据。因变量(0~9)用独热码表示,比如数字8的独热码为(0 0 0 0 0 0 0 0 1 0)数字2的读热码为(0 0 1 0 0 0 0 0 0 0)输出层激活函数的选择取决于因变量的数据类型。选定激活函数之后,需要根据建模目标选择相应的损失函数。
  • [其他] 《深度学习入门》笔记 - 18
    反向传播算法(BP Backward Propagation)是神经网络中逐层计算参数梯度的方法。我早就已经开始看不懂了,这个图还没完。这个正向传播算法和反向传播算法干啥用的呢?我的理解是用来训练神经网络模型的。因为中间加了很多隐藏层,隐藏层也是需要将损失最小化的呀,所以需要引入这两个算法。神经网络的目的是建立输入层与输出层之间的关系,进而利用建立的关系得到预测值。通过增加隐藏层,神经网络可以找到输入层与输出层之间较复杂的关系。深度学习是拥有多个隐藏层的神经网络,在神经网络中,我们通过正向传播算法得到预测值,并通过反向传播算法得到参数梯度,然后利用梯度下降法更新参数,使得模型误差变小,最终得到一个训练好的神经网络模型。在神经网络中,只要知道神经网络的结构,就可以自动的计算参数梯度,进而训练神经网络。因此,无论神经网络模型的结构有多复杂,我们都可以使用一套既定的算法训练神经网络模型。
  • [问题求助] 模型迁移pb2om
    运行结果如上这是日志
  • [其他] 浅谈人工神经网络发展历史
    人工神经网络(Artificial Neural Network,即ANN ),是20世纪80 年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的连接方式组成不同的网络。在工程与学术界也常直接简称为神经网络或类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。最近十多年来,人工神经网络的研究工作不断深入,已经取得了很大的进展,其在模式识别、智能机器人、自动控制、预测估计、生物、医学、经济等领域已成功地解决了许多现代计算机难以解决的实际问题,表现出了良好的智能特性。    发展历史1943年,心理学家W.S.McCulloch和数理逻辑学家W.Pitts建立了神经网络和数学模型,称为MP模型。他们通过MP模型提出了神经元的形式化数学描述和网络结构方法,证明了单个神经元能执行逻辑功能,从而开创了人工神经网络研究的时代。1949年,心理学家提出了突触联系强度可变的设想。60年代,人工神经网络得到了进一步发展,更完善的神经网络模型被提出,其中包括感知器和自适应线性元件等。M.Minsky等仔细分析了以感知器为代表的神经网络系统的功能及局限后,于1969年出版了《Perceptron》一书,指出感知器不能解决高阶谓词问题。他们的论点极大地影响了神经网络的研究,加之当时串行计算机和人工智能所取得的成就,掩盖了发展新型计算机和人工智能新途径的必要性和迫切性,使人工神经网络的研究处于低潮。在此期间,一些人工神经网络的研究者仍然致力于这一研究,提出了适应谐振理论(ART网)、自组织映射、认知机网络,同时进行了神经网络数学理论的研究。以上研究为神经网络的研究和发展奠定了基础。1982年,美国加州工学院物理学家J.J.Hopfield提出了Hopfield神经网格模型,引入了“计算能量”概念,给出了网络稳定性判断。 1984年,他又提出了连续时间Hopfield神经网络模型,为神经计算机的研究做了开拓性的工作,开创了神经网络用于联想记忆和优化计算的新途径,有力地推动了神经网络的研究,1985年,又有学者提出了波耳兹曼模型,在学习中采用统计热力学模拟退火技术,保证整个系统趋于全局稳定点。1986年进行认知微观结构地研究,提出了并行分布处理的理论。1986年,Rumelhart, Hinton, Williams发展了BP算法。Rumelhart和McClelland出版了《Parallel distribution processing: explorations in the microstructures of cognition》。迄今,BP算法已被用于解决大量实际问题。1988年,Linsker对感知机网络提出了新的自组织理论,并在Shanon信息论的基础上形成了最大互信息理论,从而点燃了基于NN的信息应用理论的光芒。1988年,Broomhead和Lowe用径向基函数(Radial basis function, RBF)提出分层网络的设计方法,从而将NN的设计与数值分析和线性适应滤波相挂钩。90年代初,Vapnik等提出了支持向量机(Support vector machines, SVM)和VC(Vapnik-Chervonenkis)维数的概念。人工神经网络的研究受到了各个发达国家的重视,美国国会通过决议将1990年1月5日开始的十年定为“脑的十年”,国际研究组织号召它的成员国将“脑的十年”变为全球行为。在日本的“真实世界计算(RWC)”项目中,人工智能的研究成了一个重要的组成部分。
  • [执行问题] 基于mindspore的yolov5在modelarts复现,出现input_shape问题
    Traceback (most recent call last): File "train.py", line 253, in run_train() File "/home/ma-user/work/yolov5/model_utils/moxing_adapter.py", line 105, in wrapped_func run_func(*args, **kwargs) File "train.py", line 225, in run_train batch_gt_box2, input_shape) File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/nn/cell.py", line 404, in call out = self.compile_and_run(*inputs) File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/nn/cell.py", line 682, in compile_and_run self.compile(*inputs) File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/nn/cell.py", line 669, in compile _cell_graph_executor.compile(self, *inputs, phase=self.phase, auto_parallel_mode=self._auto_parallel_mode) File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/common/api.py", line 548, in compile result = self._graph_executor.compile(obj, args_list, phase, use_vm, self.queue_name) File "/home/ma-user/anaconda3/envs/MindSpore/lib/python3.7/site-packages/mindspore/ops/operations/array_ops.py", line 534, in infer raise ValueError(f"For '{self.name}', the shape of 'input_x' is {x_shp}, " ValueError: For 'Reshape', the shape of 'input_x' is [32, 505, 20, 20], the value of 'input_shape' value is [32, 3, 505, 20, 20]. The product of the shape of 'input_x' should be equal to product of 'input_shape', but product of the shape of 'input_x' is 6464000, product of 'input_shape' is 19392000.
  • [执行问题] 如何将复参数导入神经网络训练
    如题,如何将复参数导入神经网络训练?谢谢!
  • [其他] 浅谈神经网络语言模型
    神经网络语言模型 NNLM 最早由Bengio系统化提出并进行了深入研究[Bengio, 2000, 2003]。当然分开来看,(1) distributed representation最早由Hinton提出(1985), (2)利用神经网络建模语言模型由Miikkulainen and Dyer,Xu and Rudnicky分别在1991和2000提出。 NNLM 依赖的一个核心概念就是词向量(Word Embedding)。词向量源于Hinton在Learning distributed representations of concepts提出的Distributed Representation,Bengio将其引入到语言模型建模中,提出了NNLM。那么,我们不禁要问,什么是词向量呢?词向量 简而言之,词向量是用一个向量来表示一个词,一定程度上可以用来刻画词之间的语义距离。 a、词表中的词表示为一个词向量,其维度一般取值为等值。 b、词向量为神经网络的一类参数,可以通过训练得到,同时基于词向量可以表示词序列的联合分布。 为了得到词向量,我们需要在给定训练数据集情况下,训练得到目标模型。而模型需要满足的约束,即对于任意的,表示与上下文所有可能的组合的概率和为1。 如此,我们可以将分解成两部分: a、词表中任意单词表示为词向量,由此构建了一个的矩阵。 b、词的概率分布可以通过矩阵进行变换得到。函数是组合上下文中词向量构建一个词的条件概率分布,即函数的输出为一个向量,其第个分量表示当前词等于词表中第个词的条件概率,,函数组合了和得到最终的输出结果。神经网络语言模型的优化目标是最大化带正则化项的Log-Likelihood,其中参数集合为为神经网络的参数。发展方向 Bengio在论文的Feature Work部分提出了神经网络语言模型的可能改进方向,在后续研究者(包括他本人)的工作中多有所体现。 a、将神经网络分解成为小的子网络,比如利用词的聚类等。 b、加速SoftMax中的正则项Z的快速求导 c、仅对一部分输出进行梯度传播。 d、引入先验知识,比如语义信息(WordNet),语法信息(low-level: POS, high level:句法结构)等。 e、词向量可解释性。 f、解决一词多义问题(Polysemous)。神经网络语言模型类型● Neural Network Language Model ,NNLM● Log-Bilinear Language Model, LBL● Recurrent Neural Network based Language Model,RNNLM● Collobert 和 Weston 在 2008 年提出的 C&W 模型● Mikolov 等人提出了 CBOW( Continuous Bagof-Words)和 Skip-gram 模型
  • [经验分享] 使用MindStudio完成ShuffleNetV2Plus的SDK应用开发
    ShuffleNetV2Plus-基于MindStudio的MindX SDK应用开发一、任务介绍MindX SDK应用开发旨在使用华为提供的SDK和应用案例快速开发并部署人工智能应用,是基于现有模型、使用pyACL提供的Python语言API库开发深度神经网络应用,用于实现目标识别、图像分类等功能。通过MindStudio实现SDK应用开发分为基础开发与深入开发,通常情况下用户关注基础开发即可,基础开发主要包含如何通过现有的插件构建业务流并实现业务数据对接,采用模块化的设计理念,将业务流程中的各个功能单元封装成独立的插件,通过插件的串接快速构建推理业务。根据MindStudio昇腾论坛上的教程“MindX SDK应用开发全流程”,本图文案例的输出,是基于整体过程在Windows操作系统上开展的,针对ShuffleNetV2Plus图片分类模型的,基于MindStudio的MindX SDK应用开发。二、环境搭建与配置1. Windows安装MindStudioMindStudio提供了AI开发所需的一站式开发环境,提供图形化开发界面,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。同时还支持网络移植、优化和分析等功能。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助用户在一个工具上就能高效便捷地完成AI应用开发。同时,MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。MindStudio可以单独安装在Windows上,用户可在MindStudio下载页面下载软件。安装MindStudio前还需要安装Python3.7.5、MinGW、CMake等本地依赖,具体安装流程可以参考Windows安装MindStudio。在安装MindStudio前需要在Linux服务器上安装部署好Ascend-cann-toolkit开发套件包,之后在Windows上安装MindStudio,安装完成后通过配置远程连接的方式建立MindStudio所在的Windows服务器与Ascend-cann-toolkit开发套件包所在的Linux服务器的连接,实现全流程开发功能。开发运行场景如图1所示。图1 开发运行场景(共部署形态)2. Windows安装MindX SDK步骤1-远端环境MindX SDK开发套件安装Windows场景下基于MindStuido的SDK应用开发,请先确保远端环境上MindX SDK软件包已安装完成,安装方式请参见《mxManufacture 用户指南》和《mxVision 用户指南》的“使用命令行方式开发”>“安装MindX SDK开发套件”章节。步骤2-本地CANN安装在Windows本地打开MindStudio,点击Customize > All settings…,如图2所示。图2 All Settings进入设置页面,点击Appearance & Behavior > System Settings > CANN进入CANN管理界面。界面中的Remote Connection为远程连接的用户及IP,Remote CANN Location为远端环境上CANN开发套件包的路径。单击“Change CANN”进入Remote CANN Setting界面,如图3。图3 Remote CANN Setting首先配置远程连接,点击右侧“+”,出现如图4的界面,表1是一些参数说明。图4 SSH Configurations参数说明Host远程服务器IP地址Port远程服务器端口号Username用户名Authentication type验证类型Password密码表1 SSH Configurations参数说明填写完毕后,点击“Test Connection”测试连接是否正常,若显示图5弹窗,则表示远程连接可用。即可一路点击“OK”按钮完成远程连接的配置。图5 远程连接测试成功然后配置远端环境上CANN开发套件包的路径,我们这里填写“/usr/local/Ascend/ascend-toolkit/5.1.RC1”。随后点击“Finish”按钮,等待同步完成即可,CANN安装成功后的CANN管理页面如图6所示。图6 CANN安装成功后的CANN管理页面步骤3-本地MindX SDK安装与步骤2开始一致,进入设置页面,点击Appearance & Behavior > System Settings > MindX SDK进入MindX SDK管理界面。界面中MindX SDK Location为软件包的默认安装路径,默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”。单击Install SDK进入Installation settings界面,如图7,表2为一些参数说明。图7 Remote MindX SDK Setup Wizard参数说明Remote Connection远程连接的用户及IPRemote CANN Location远端环境上CANN开发套件包的路径,请配置到版本号一级Remote SDK Location远端环境上SDK的路径,请配置到版本号一级。IDE将同步该层级下的include、opensource、python、samples文件夹到本地Windows环境Local SDK Location同步远端环境上SDK文件夹到本地的路径。默认安装路径为“C:\Users\用户名\Ascend\mindx_sdk”表2 Remote MindX SDK Setup Wizard参数说明填写完毕后,点击“OK”按钮,等待MindSrudio将远端服务器上的MindX SDK套件安装到本地电脑中。MindX SDK套件安装成功后的MindX SDK管理页面如图8所示。图8 MindX SDK套件安装成功后的MindX SDK管理页面最后点击“OK”按钮,结束MindX SDK在本地Windows上的全部配置流程。三、推理开发运行流程使用MindStudio开发和运行推理业务步骤如下:确定业务流程:根据业务功能如目标检测、图像分类、属性识别等,将业务流程进行模块化。寻找合适插件:根据已有SDK插件的功能描述和规格限制来匹配业务功能,当SDK提供的插件无法满足功能需求时,用户可以开发自定义插件。准备推理模型文件与数据:准备输入图片和下载模型,使用Model Convertor模型转换工具将模型转换为om格式。流程编排:以可视化的方式,开发数据流图,生成pipeline文件供应用框架使用,配置文件以json格式编写,必须指定业务流名称、元件名称和插件名称,并根据需要,补充元件属性和下游元件名称信息。业务集成:编写C++程序或Python程序,调用业务流管理的API(MxStreamManager),先进行初始化,再加载业务流配置文件(*.pipeline),然后根据stream配置文件中的StreamName往指定Stream获取输出数据,最后销毁Stream。编译与运行应用:若新建的工程为Python版本的应用工程,不需要执行编译应用工程,配置Python环境后,即可在远端服务器运行;若新建工程为C++版本的应用工程,则需要进行远端编译,远端编译时,会对工程文件夹进行目录拷贝到远端连接的环境,编译成功后即可运行。四、ShuffleNetV2Plus模型推理介绍ShuffleNetV2Plus是一个轻量化的图片分类网络,我们下载其可参考源代码进行深入学习,该源码使用Pytorch框架实现,推理采用ImageNet数据集验证集。在使用MindStudio进行MindX SDK应用开发前,我们已经完成了MindX SDK和MxBase的推理开发,且推理精度已达标。在进行推理开发的过程中,除了按需求编排流程外,最重要的就是图片的处理方式。根据源代码,我们发现在ShuffleNetV2Plus模型的验证部分中,图片的处理是基于PIL库的,为使推理精度达标,必须同样使用PIL库执行图片处理操作,而非opencv。因此,针对MindX SDK,图像的解码、缩放、裁剪等操作需要在pipeline流程编排之外进行,即送入Stream的数据是已经处理好且解码完成的;针对MxBase,送入可执行程序的数据应该是处理后图像的bin类型文件。这一操作准则也同样适用于使用MindStudio的MindX SDK应用开发。五、Python应用开发(可参考代码)1. 创建MindX SDK应用工程首先进入工程创建页面,若首次登录MindStudio,单击New Project;若非首次登录MindStudio,在顶部菜单栏中选择File > New > Project...。在New Project窗口中,选择Ascend App工程进行创建,创建工程配置如图9所示,一些参数说明如表3所示。图9 创建工程配置参数说明Name工程名称必须以字母开头,以字母或数字结尾Description工程信息描述,自行配置CANN Version当前CANN版本,单击“Change”可重新配置CANN包的路径(详见“环境搭建与配置”中的“本地CANN安装”部分)Project Location工程存储路径,可自定义表3 Ascend App工程创建参数说明信息填写完毕后,单击“Next”后进入工程模板类型选择页面,选择“MindX SDK Project (Python)”,如图10所示。随后点击“Finish”即可完成工程创建。图10 Python工程模板类型选择我们基于创建好的不含逻辑代码的空白工程进行Python应用开发,工程目录如图11所示。图11 Python应用工程目录如图11所示,除开发Python脚本和pipeline流程编排文件外,我们还需下载推理数据,即若干张ImageNet数据验证集图片,测试时可命名为“test.JPEG”,ImageNet标签文件也需要添加在“model”文件夹下。我们还需要准备ShuffleNetV2Plus模型的om文件,om模型文件由pth>onnx>om转换而来,pth模型文件可在ModelZoo网站上下载,并使用脚本转换为onnx格式,onnx>om转换流程在“模型转换”部分介绍。2. 模型转换步骤1在菜单栏选择“Ascend > Model Converter”,打开模型转换页面,在“Model Information”页签中上传模型文件,加载成功后,会自动填充下列参数信息,如图12,一些参数介绍如表4所示。图12 Model Information页参数说明Model Fileonnx模型文件地址,建议上传到CANN包所在的远端环境Model Name模型名称Target SoC Version模型转换时指定芯片版本,使用310芯片Input Format输入数据格式,使用默认NCHWactual_input_1转换ShuffleNetV2Plus模型时,输入Shape请使用1,3,224,224,输入Type请使用FP32Output Nodes指定输出节点信息,这里无需配置表4 Model Information页签参数介绍步骤2单击“Next”,进入“Data Pre-Processiong”页面,无需操作,如图13。图13 Data Pre-Processiong页步骤3单击“Next”,进入“Advanced Options Preview”页面,由于此模型在后期编写脚本时进行标准化处理,故不在此处的“Additional Arguments”参数中增加aipp文件命令,检查Command Preview有无错误即可,如图14。图14 Advanced Options Preview页步骤4单击“Finish”开始模型转换,在MindStudio界面下方,“Output”窗口会显示模型转换过程中的日志信息,如果提示**Model converted successfully**,则表示模型转换成功。“Output“窗口会显示模型转换所用的命令、所设置的环境变量、模型转换的结果、模型输出路径以及模型转换日志路径等信息,如图15。图15 模型转换输出信息步骤5转换完成的模型om文件生成在“$HOME/modelzoo”下,将其移动放置于“工程文件根目录/model”下。3. pipeline流程文件编排图片分类是推理应用开发中常见的功能,用户通过调用API,向推理业务发送图像,等待推理服务返回目标的坐标(目标检测插件输出)和图像分类结果。由于ShuffleNetV2Plus模型的推理图片处理需要PIL库而非opencv,故不在pipeline中执行图片解码、缩放、裁剪等操作,因此编排的业务流程可简化为五个步骤:初始化>图片数据获取>图片分类>序列化>结果发送。如图16所示。图16 pipeline可视化各个元件的属性配置参数及插件的使用详见pipeline文件的代码,如图17所示。图17 pipeline文件代码4. Python脚本编写Python脚本的编写是开发应用的重中之重,下面对main.py文件的代码详解。1) 引入相关库(图18)引入PIL库用于处理图片,引入StreamManagerApi包的相关方法,用于操作stream,引入MxpiDataType包,用于封装解码后的图片数据,便于送入pipeline。图18 引入相关库2) 初始化stream(图19)图19 初始化stream3) 根据pipeline文件创建stream(图20)图20 根据pipeline文件创建stream4) 构建stream输入数据首先使用PIL库的Image.open方法读取测试图片,并使用resize方法将图片等比例缩放,保持最短边为256,如图21。图21 图片缩放其次对图片执行中心裁剪操作,裁剪大小为224×224,如图22。图22 图片裁剪然后将图片数据归一化、标准化,并使用transpose方法调整图片的shape,将“高度、宽度、通道数”的shape转换为“通道数、高度、宽度”,与模型输入维度保持一致,如图23。图23 图片归一化与标准化接着,我们使用mxVision套件提供的MxpiDataType.MxpiVisionList()方法和InProtobufVector()方法构建向量protobuf_vec作为stream的输入数据,该向量包括了图片的尺寸(224×224)和图片的二进制数据的属性,如图24。这个向量时无需其他处理,可以直接送进stream走pipeline流程的。图24 构建向量protobuf_vec5) 根据stream名称和已经获得的图片数据向量,使用SendProtobuf()方法,将数据输入进特定的stream,即执行pipeline流程(图25)图25 根据stream名称将数据输入进特定的stream6) 通过stream名称和SendProtobuf()方法的返回值uniqueId获取图片推理结果,并输出到控制台(图26)图26 通过stream名称和SendProtobuf()方法返回值uniqueId获取图片推理结果7) 销毁stream,推理结束(图26)图27 销毁stream5. Python脚本应用运行1) 配置Python解释器在顶部菜单栏中选择File > Project Structure,在Project Structure窗口中,点击Platform Settings > SDKs,点击上方的“+”添加Python SDK,从本地环境中导入Python3.9,如图28。图28 添加Python SDK然后,点击Project Settings > Project,选择上一步添加的Python SDK,如图29。图29 添加Project SDK接着,点击Project Settings > Modules,选中此项目,点击“+”后选择Python,为Python Interpreter选择上述添加的Python SDK,如图30。图30 添加Module SDK点击OK完成应用工程Python SDK配置。2) 配置运行参数在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面。选择“Ascend App > 工程名”配置应用工程运行参数,图31为配置示例。配置完成后,单击“Apply”保存运行配置,单击“OK”,关闭运行配置窗口。图31 运行参数配置3) 运行应用图32 测试图片输入图33 分类结果输出(图片推理为猪)根据运行成功日志可见,图片分类结果与事实相符,应用输出结果正确。六、C++应用开发(可参考代码)1. 创建MindX SDK应用工程C++应用开发的创建工程步骤与Python应用基本一致,这里不再过多赘述。需要说明的是,在选择工程模板时,选择C++应用即可,如图34。图34 C++工程模板类型选择我们基于创建好的不含逻辑代码的空白工程进行C++应用开发,工程目录如图35所示。图35 C++应用工程目录如图35所示,在“src”文件夹下,我们不只开发了main.cpp主函数源文件,我们编写头文件Shufflenetv2plusClassify.h用于声明类和函数原型,编写源文件Shufflenetv2plusClassify.cpp实现头文件中已经声明的那些函数的具体代码,并在main.cpp主函数源文件中调用源文件Shufflenetv2plusClassify.cpp中的相关函数,从而实现模型的推理。除开发图片处理脚本以及“src”文件夹中的C++编译脚本、主函数实现文件和其他函数类文件外,我们还需下载推理数据,即若干张ImageNet数据验证集图片,测试时可命名为“test.JP EG”,ImageNet标签文件也需要添加在“model”文件夹下。我们还需要准备ShuffleNetV2Plus模型的om文件,在上面的“Python应用开发”部分,om模型文件的转换已经做了详细阐述,这里不做赘述,直接将已经生成好的om’模型文件拷贝到“model”文件夹下即可。2. 图片处理脚本preprocess.py由于ShuffleNetV2Plus模型的推理图片处理需要PIL库,且只有在Python脚本中才能调用此库,因此我们编写了一个Python脚本,作用是在运行可执行C++文件前对图片进行预处理,执行缩放、裁剪、解码等操作,并输出bin文件,供C++可执行文件读取。图片处理脚本preprocess.py主要分为以下几个步骤:步骤1:导入依赖库图36 导入依赖库步骤2:图片读取与缩放图37 图片读取与缩放步骤3:图片裁剪图38 图片裁剪步骤4:图片归一化、标准化与维度转换图39 图片归一化、标准化与维度转换步骤5:bin文件输出图40 bin文件输出上述preprocess.py脚本的图片处理步骤,与Python应用开发中main,py脚本中的图片处理部分基本一致,这里不做赘述。3. 头文件Shufflenetv2plusClassify.hShufflenetv2plusClassify.h头文件包含了类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等。其中,#include类及#define常数如图41所示;定义的初始化参数结构体InitParam如图42所示;类里面的成员和方法的声明如图43所示。图41 #include类及#define常数图42 初始化参数结构体InitParam图43 类里面的成员和方法的声明4. 源文件Shufflenetv2plusClassify.cppShufflenetv2plusClassify.cpp源文件的开头#include了要实现的头文件,以及其他要用到的头文件,如图44。图44 #include头文件Shufflenetv2plusClassify.cpp源文件的主体部分主要实现了头文件中已经声明的那些函数的具体代码,下面对这些函数的实现进行详解。1) Init初始化Init函数以在头文件中声明结构的InitParam为参数,初始化DeviceManager、ModelInferenceProcessor、Resnet50PostProcess等服务,为模型推理做准备,如图45、46。图45 Init(1)图46 Init(2)2) ReadTensorFromFile从bin文件读取数据(如图47)图47 ReadTensorFromFile3) ReadInputTensor生成输入张量调用ReadTensorFromFile函数,从图片的bin格式文件读取数据,根据输入数据的大小,在内存中分配合适的空间,并使用TensorBase方法生成输入张量inputs,如图48。图48 ReadInputTensor4) Inference推理声明输出outputs,将inputs作为参数,调用ModelInference方法执行推理过程,如图49.图49 Inference5) PostProcess后处理由于mxVision套件已经提供了Resnet50PostProcess后处理类,且Resnet50与本模型相近皆为图像分类模型,因此后处理过程调用Resnet50PostProcess后处理类中的方法即可,如图50。图50 PostProcess6) ShowResult结果展示(如图51)图51 ShowResult7) Process流程编排根据以上实现的源文件函数,按照“读取图片并生成输入张量>模型推理>后处理>输出结果”的流程编排编写Process函数,如图52.图52 Process8) DeInit终止模型推理结束后,终止DeviceManager、ModelInferenceProcessor、Resnet50PostProcess等服务,如图53。图53 DeInit5. 主函数源文件main.cpp完成Shufflenetv2plusClassify的头文件和源文件编码后,即可根据应用的整体推理流程编写main.cpp源文件。首先,#include头文件Shufflenetv2plusClassify.h和其他需要头文件,如图54。图54 #include头文件Shufflenetv2plusClassify.h和其他需要头文件其次,开始编写main函数,声明并赋值initParam变量,配置模型路径和图像标签路径等重要参数,如图55。图55 声明并赋值initParam变量接着,继续完善main函数,使用make_shared构造Shufflenetv2plusClassify数据对象,以此调用Init(以InitParam为参数)、Process(以图像bin文件路径为参数)、DeInit三个函数,执行模型推理操作,如图56。图56 执行模型推理操作至此,main.cpp主函数实现文件编写完成,下面即可展开编译和运行操作。6. C++应用编译1) 编写编译脚本在编译前,我们需要在“src”文件夹下编写CMakeLists.txt编译脚本。在编译脚本中,需要指定CMake最低版本要求、项目信息、编译选项等参数,并且需要指定特定头文件和特定库文件的搜索路径。除此之外,要说明根据main.cpp和Shufflenetv2plusClassify.cpp两个源文件生成ShuffleNetV2Plus_MxBase可执行文件,同时需要指定可执行文件的安装位置,即“out”文件夹下。2) 配置编译环境在MindStudio工程界面,依次选择“Build > Edit Build Configuration”,进入编译配置页面,如图57,配置完成后单击“OK”保存编译配置。图57 编译配置页面3) 执行编译单击“Build”编译工程。如果在编译过程中无错误提示,且编译进度到“100%”,则表示编译成功,如图58。图58 编译成功此时,编译成的可执行文件已经拷贝到了“out”文件夹下,用于应用运行。7. C++可执行文件应用运行1) 图像预处理脚本运行配置首先将测试图片拷贝到工程目录下,命名为“test.JPEG”,如图59。图59 test.JPEG其次,在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面。选择“Ascend App > preprocess”配置图像预处理Python脚本运行参数,图60为配置示例。配置完成后,单击“Apply”保存运行配置,单击“OK”,关闭运行配置窗口。图60 图像预处理脚本运行参数配置2) C++可执行文件运行配置首先,在MindStudio工程界面,依次选择“Run > Edit Configurations...”,进入运行配置页面。选择“Ascend App > 工程名”配置应用工程运行参数,图61为配置示例。需要注意的是,除添加C++可执行文件外,还需在下方的“Before Launch”界面,选择“+ > Run Another Configuration > preprocess”,即设置运行C++可执行文件前先运行preprocess图像预处理脚本。配置完成后,单击“Apply”保存运行配置,单击“OK”,关闭运行配置窗口。图61 C++运行参数配置3) 应用运行在MindStudio工程界面,依次选择“Run > Run...”,然后,在弹出框中选择已创建好的运行配置信息,运行应用。图62为图像预处理脚本输出结果,图63为C++应用运行的输出结果。图62 图像预处理结果输出图63 分类结果输出(图片推理为电话)根据运行成功日志可见,图片分类结果与事实相符,应用输出结果正确。七、FAQ1. MindStudio导入应用工程后,提示“No Python interpreter configured for the module”解决方案:在顶部菜单栏中选择“File > Project Structure”,点击“Project Settings > Modules”,在“Dependencies”配置中配置“Module SDK”,选择一个Python 3.9的本地环境,如图64。图64 FAQ-12. SDK版本获取失败解决方案:SDK远端地址为“usr/local/Ascend/mindx_sdk/mxVision_3.0.RC1/linux-x86_64/mxVision-3.0.RC1”,若选择同名父路径,则会报错“Get mindx sdk version failed!”,如图65。图65 FAQ-23. om模型文件运行报错解决方案:在模型转换的时,模型的输入Type默认值为FP16,我们需要将其修改为FP32,如图66。图66 FAQ-34. 相对路径非法,找不到相关文件解决方案:针对Python应用,在pipeline流程编排中,相对路径需要使用相对main.py脚本文件位置的相对路径,而不是相对于pipeline文件的相对路径;针对C++应用,相对路径需要使用相对可执行文件生成位置的相对路径,修改cpp文件或h文件后,需要重新编译成可执行文件,修改才能生效。八、从昇腾社区获得更多帮助开发者在使用MindStudio进行应用开发过程中遇到任何问题,可以登录MindStudio昇腾论坛获得更多的帮助。
  • [经验分享] 基于MindStudio完成deepmar模型推理全流程
    DeepMar-基于 MindStudio 的 MindX SDK 应用开发MindX SDK 简介MindX SDK应用开发是使用华为提供的开发套件完成模型的迅速开发以及部署人工智能应用。本文将通过一个利用MindStudio开发应用的例子来向大家展示如何通过现有的插件构建业务流并实现对接,将业务单元封装起来,通过封装好的插件进行推理流程业务。本文基于MindStudio昇腾论坛上的教程《MindX SDK 应用开发全流程》,并将我自己的个人经验整理成图文形式记录下来。DeepMar模型简介论文中为了更好地利用属性间的关联性,提出了统一多属性联合学习模型(DeepMar)来同时学习所有属性,该论文的基本模型结构由一个输入图像、一个共享网络和35个输出节点组成。利用数据集PETA来训练网络和进行精度测试。PETA是目前最具挑战性的行人属性数据集。它包含19000张行人图像,由真正的摄像头拍摄。目前广泛采用的实验协议是将数据集随机分成三部分:9500用于训练,1900用于验证,7600用于测试。环境配置本文的示例所处环境为Windows10,针对DeepMar多分类模型,并基于MindStudio的MindX应用开发。在Windows操作系统上安装MindStudioMindStudio可以单独安装在Windows上,我们可以在MindStudio下载官网地址下载该软件。不过,在安装前,我们需要现在电脑上安装好相关依赖。比如Python3.7.5、MinGW、Cmake等,具体安装目录以及安装方式参考《Windows安装MindStuido》。在安装MindStudio前需要在Linux服务器上安装部署好Ascend-cann- toolkit开发套件包,之后在Windows上安装MindStudio,安装完成后通过配置远程连接的方式建立 MindStudio所在的Windows服务器与Ascend-cann-toolkit开发套件包所在的Linux服务器的连接,实现全流程开发功能。如下图所示:SSH连接远端环境在本地打开MindStudio,依次点击CustomizeAll Settings,如下图所示:打开设置页面之后,依次点击Appearance & Behavior  System Settings  CANN就可以进入CANN管理页面。如下图所示(由于我这里已经配置好了CANN,第一次打开的同学看不到图中关于CANN的信息,不用担心):之后单击Change CANN就可以进行CANN的配置了。如下图所示:点击右侧“+”号,出现如下图所示的界面:参数说明:参数说明Host远程服务器IP地址Port远程服务器端口号Username用户名Authentication type验证类型Password密码把所需信息填写完毕后,记得点击一下“Test Connection”测试连接是否正常,如果显示下图所示界面,即表示配置成功。接着我们就可以配置远端CANN开发套件包的路径了,在这里我填写的是“/usr/local/Ascend/ascend-toolkit/5.1.RC1”,然后点击“Finish”按钮,等待同步完成即可。本地MindX SDK 安装与上一步类似,先进入设置页面,依次点击Appearance & Behavior  System Settings  MindX SDK就可以进入MindX SDK管理页面。页面中“MindX SDK location”是本地的安装路径,默认为C:\Users\用户名\Ascend\mindx_sdk”,接下来我们单击“Install SDK”进入如下图所示的管理界面:参数说明:参数说明Remote Connection远程连接的用户及IPRemote CANN Location远端环境上 CANN 开发套件包的路径,记得配置到版本号Remote SDK Location远端环境上SDK的路径,记得配置到版本号。Local SDK Location本地的SDK 路径。默认安装路径为“C:\Users\ 用户名\Ascend\mindx_sdk”安装完毕后的界面如下图所示:安装完毕后的界面如下图所示:点击“OK”,即可完成配置安装流程。在上面的安装过程中可能会出现SDK安装失败的错误,那是因为选错了路径,如下图所示:出现这个错误,很可能是因为选到了版本号的父级文件夹,如下图所示:记得要选择下方的那个。推理开发运行流程使用 MindStudio 开发和运行推理业务步骤如下:1) 确定业务流程:根据业务功能如目标检测、图像分类、属性识别等,将业务流程进行模块化。2) 寻找合适插件:根据已有SDK插件的功能描述和规格限制来匹配业务功能,当 SDK 提供的插件无法满足功能需求时,用户可以开发自定义插件。3) 准备推理模型文件与数据:准备输入图片和下载模型,使用 Model Convertor 模型转换工具将模型转换为 om 格式。4) 流程编排:以可视化的方式,开发数据流图,生成pipeline文件供应用框架使用,配置文件以 json 格式编写,必须指定业务流名称、元件名称和插件名称,并根据需要,补充元件属性和下游元件名称信息。5) 业务集成:编写 C++程序或 Python 程序,调用业务流管理的 API (MxStreamManager),先进行初始化,再加载业务流配置文件 (*.pipeline),然后根据 stream 配置文件中的 StreamName 往指定 Stream获取输出数据,最后销毁 Stream。6) 编译与运行应用:若新建的工程为Python版本的应用工程,不需要执行 编译应用工程,配置 Python 环境后,即可在远端服务器运行;若新建工 程为 C++版本的应用工程,则需要进行远端编译,远端编译时,会对工程文件夹进行目录拷贝到远端连接的环境,编译成功后即可运行。DeepMar模型推理开发创建一个新MindX SDK Project,如下图所示:单击“Next”,进入模版选择界面:如上图蓝框所示,我们选择Python版本的,之后点击“Finish”即可完成项目创建。上图是我的文件层级,仅供参考。模型转换先把下载好的DeepMar_npu.onnx放到models目录下,然后在菜单栏选择“Ascend  Model Converter”,进入模型转换页面,选择模型文件路径后,会进入“Model Parsing”界面,如下图所示,等待即可。等待加载完参数信息后会显示如下图所示的界面:记得要选FP32。之后点击Next和Finish就可以开始模型转换了。稍等片刻,等到出现以下界面就表示转换完成:将生成好的om文件移动到models文件夹下就可以开始下一步了。pipeline流程编排pipeline编排分为如下步骤:初始化分类序列化产出结果可视化如下图所示:我们只需要将下载下来的pipeline文件稍加修改就可以为我所用:单击上图中的“Text”即可进入文字修改界面:我们只需要将上图中的模型路径修改为我们的路径即可,修改后如下图所示:接下来我们就可以开始编写main.py文件了。main.py编写通过下载好的文件,我们不难将数据处理流程抽象成如下几个函数:上述的几个函数分别对传入的图片进行了缩放、归一化等处理,并生成将要送人推理流程的protobuf。于是我们可以得到如下详细的main文件流程:引入相关库初始化stream创建stream使用前文提到的函数处理输入的图片数据将数据送入stream并开始推理流程获取推理结果并打印到控制台销毁stream,结束推理配置python环境配置python interpreter在顶部菜单栏中选择 File  Project Structure,在 Project Structure 窗口中,点 击 Platform Settings  SDKs,点击上方的“+”添加 Python SDK,从本地环境中 导入 Python3.9,如下图所示:然后点击Project Settings  Project,选择上一步添加的Python SDK,如下图所示:接着,点击 Project Settings  Modules,选中此项目,点击“+”后选择 Python:点击OK即可完成配置。配置运行参数依次点击“Run > Edit Configurations”,选择Ascend App并配置可执行文件路径,下图为我的示例:单击Apply后点击OK退出配置界面。推理运行测试输入的图片如下:测试输出如下:与peta.mat对比后发现结果一致,推理结果正确!下图为peta.mat中的ground truth:由于屏幕显示有限,只能截取这么多,我做对比之后是一样的。获取帮助如果有任何疑问,都可以前往MindStudio昇腾论坛获取更多信息。
  • [基础介绍] 卷积神经网络表征可视化研究综述(4)
    转人工智能技术与咨询源自:自动化学报 作者:司念文 张文林 屈丹 罗向阳 常禾雨 牛铜摘要近年来, 深度学习在图像分类、目标检测及场景识别等任务上取得了突破性进展, 这些任务多以卷积神经网络为基础搭建识别模型, 训练后的模型拥有优异的自动特征提取和预测性能, 能够为用户提供“输入–输出”形式的端到端解决方案. 然而, 由于分布式的特征编码和越来越复杂的模型结构, 人们始终无法准确理解卷积神经网络模型内部知识表示, 以及促使其做出特定决策的潜在原因. 另一方面, 卷积神经网络模型在一些高风险领域的应用, 也要求对其决策原因进行充分了解, 方能获取用户信任. 因此, 卷积神经网络的可解释性问题逐渐受到关注. 研究人员针对性地提出了一系列用于理解和解释卷积神经网络的方法, 包括事后解释方法和构建自解释的模型等, 这些方法各有侧重和优势, 从多方面对卷积神经网络进行特征分析和决策解释. 表征可视化是其中一种重要的卷积神经网络可解释性方法, 能够对卷积神经网络所学特征及输入–输出之间的相关关系以视觉的方式呈现, 从而快速获取对卷积神经网络内部特征和决策的理解, 具有过程简单和效果直观的特点. 对近年来卷积神经网络表征可视化领域的相关文献进行了综合性回顾, 按照以下几个方面组织内容: 表征可视化研究的提起、相关概念及内容、可视化方法、可视化的效果评估及可视化的应用, 重点关注了表征可视化方法的分类及算法的具体过程. 最后是总结和对该领域仍存在的难点及未来研究趋势进行了展望.。。。。。(接上)4. 可视化的应用4.1理解与解释模型表征可视化是理解CNN模型的一种重要途径,在图像领域应用广泛, 常见于图像分类、场景识别等任务的可视化解释. 本文第3节所述的表征可视化方法常用于对基于CNN的图像分类器的解释, 例如, AM方法用于可视化网络对输入图像的偏好, 从另一种角度揭示了网络对何种输入模式的依赖性较强. 注意力掩码能够告诉设计者网络的关注点, 这使其自身具有一定的可解释特性, 因此, 基于注意力掩码的可视化方法不仅可以验证注意力机制自身的有效性, 也常用于观察网络的训练效果.此外, 表征可视化方法也可以应用在其他类型的数据, 例如, CAM这类方法具有较好的类别区分性, 能够用来确定与特定输出类别相关联的图像区域, 可在视觉问答模型中帮助定位与问题最相关的图像区域. LRP方法在制定反向传播规则时依靠网络的权重与激活值, 而非特征图和通道等图像领域的概念. 因此, 它不仅适应于图像识别任务的解释, 还可以用于可视化机器翻译、语音识别[94]等任务中, 为这些领域的研究者提供了另一种理解模型的途径.4.2 诊断与优化网络在CNN学习效果诊断和结构优化上, 基于反卷积的可视化能够观察任意层的神经元的激活, 从而分析CNN的学习率、卷积核尺寸及步长等重要参数的设计是否达到最优. 文献[13]使用基于反卷积的可视化方法对AlexNet内部激活进行分析与改进, 进而提出了ZFNet, 获得了2013年ImageNet数据集图像分类任务冠军. 这种基于表征可视化的针对性分析和诊断方式, 很大程度上避免了盲目的参数调优. 文献[95]利用基于梯度的可视化方法指导单像素的对抗性扰动和对抗性分析, 帮助模型进行对抗性学习. 文献[88]则使用显著性方法检测对抗样本, 避免模型受到对抗攻击. 文献[72]使用Grad-CAM产生的类激活图来观察网络中间层表征, 分析对比不同结构设计对模型训练效果的影响. 此外, CAM这类方法还可用于提供自注意力, 优化CNN的结构设计. 例如, 文献[73]和文献[77]使用Grad-CAM生成自注意力的掩码作为图像蒙版, 用于去除图像中的非重要区域, 并将处理后的图像应用于下阶段的模型训练和推理. 文献[96]将CAM方法集成到图像转换模型的自注意力模块中, 引导模型关注源域与目标域之间的判别性区域, 从而提升图像转换模型对细节的关注能力.4.3 其他方面除了对CNN本身的理解与诊断, 可视化方法在其他任务上也有不断拓展与延伸, 例如CAM和Grad-CAM方法在弱监督目标定位任务上取得了非常好的效果. 文献[93]进一步探索了将显著性归因方法产生的显著图作为先验, 应用于弱监督的分割任务上. 在应用领域方面, 可视化方法能够提升对推荐系统决策结果的理解[97], 以及与知识图谱的结合来实现可解释的推荐算法[98]. 对于自动驾驶[99-100]以及智能医疗[101]等领域, 由于这些领域对于决策风险的承受能力较低, 可视化方法对这些领域应用的现实落地至关重要.5. 存在的难点及发展趋势5.1 难点分析与趋势展望近年来, CNN表征可视化相关研究越来越多, 研究者们提出了各种可视化方法, 极大推动了该领域的进展, 但仍存在一些难点问题有待解决, 本节对其进行了归纳, 并分析了未来可能的研究趋势.1)对于可视化方法, 仍存在噪声、稳定性、解释能力有限等问题.通过对多种可视化方法的实验比较发现, 多数可视化方法生成的热力图含有一定的噪声, 噪声产生的原因仍没有权威统一的解释. 同时, 面对不同图像时的可视化效果不尽相同, 有些图像可能直接导致可视化方法的失效, 而失效的原因尚不清楚, 仍有待进一步的探究. 此外, 面对复杂背景条件的图像、多目标场景、小目标图像等, 受限于模型本身在面对这些情形时的性能约束, 可视化方法的解释效果并不一定好. 未来可能的研究趋势是将可视化方法与其他解释方法的结合, 从不同侧面不同角度解释模型, 从而缓解单一可视化方法解释效果受限的问题.2)对于可视化效果的评估, 仍欠缺标准统一的评估方法.目前很难找到适用于大多数可视化方法的评估标准, 原因在于许多方法的目标并不相同, 也即每种方法对“可解释性”的理解并不相同, 导致各种可视化方法的解释结果差别较大. 同时, 很多可视化方法自身同样缺乏清晰明确的数学与逻辑机理, 导致结果难以量化比较. 如果可以从“可解释性”的概念出发, 统一数个可解释性的标准, 那么对于可视化结果的评估也就有了依据. 同时, 还可以根据可视化方法产生的热力图的特点进行分类评价, 每类热力图使用与之适应的评价标准, 提升其侧重解释某方面的能力.3)对于可视化的对象, 细粒度的识别模型难以可视化解释.可视化方法多应用于对图像分类、目标定位及场景识别等任务的解释, 能够实现对多目标图像中语义级目标的区分. 例如,“Cat”和“Dog”虽然同属动物, 但是在语义级上属于明显不同的两种动物. 而单独对于“Cat”这一动物, 实现的不同品种猫的细粒度图像分类, 受限于分类网络自身准确性, 可视化方法很难找到用于区分目标的细节特征, 此时的解释效果非常有限, 甚至对于不同的目标可视化效果始终相同. 与人们的视觉观察及解释能力相差较远. 这一问题或许可以通过视觉解释与语言解释相结合的途径来改善解释效果. 对可视化解释难以描述的细微之处, 辅助加以自然语言描述形式的解释(比如对猫的颜色、猫耳形状的描述), 能够实现更好的解释效果.4)对于可视化解释的完备性, 现有研究中的解释结果与预测结果无法相互印证.理论上看, 一个完备可靠的解释可以使用户从中推理并得到被解释的预测结果, 而目前的可视化方法仍不具备这一能力, 仅能从预测结果中得到解释结果, 而无法根据解释来推断出模型的预测, 即两者之间的相互印证关系没有被建立起来. 例如, 如果可视化方法给出了错误的解释, 但这一解释恰好符合用户根据预测结果推测的预期解释, 进而使得用户相信了解释的可靠性, 这将对其形成误导. 此时, 若能根据解释结果推断预测结果, 发现推断出的预测结果和实际预测结果不相符合, 则可通过进一步分析发现其中存在的问题, 从而提升用户对可视化方法的信任.5.2 学界近年来的关注近年来, 众多人工智能领域顶级会议关注人工智能和深度学习可解释问题, 其中许多涉及到表征可视化方面的前沿研究, 如[102]:1) IJCAI 2020 Tutorial on Trustworthiness of Interpretable Machine Learning;2) CVPR 2020 Tutorial on Interpretable Machine Learning for Computer Vision;3) ICCV 2019 Workshop on Interpretating and Explaining Visual Artificial Intelligence Models;4) ICLR 2019 Workshop on Safe Machine Learning;5) CVPR 2019 Workshop on Explainable AI;6) AAAI 2019 Workshop on Network Interpretability for Deep Learning;7) IJCAI 2018/2017 Workshop on Explainable Artificial Intelligence;8) ICML 2018 Workshop on Human Interpretability in Machine Learning;9) NIPS 2017 Interpretable Machine Learning Symposium.表4列举了可解释性深度学习研究领域的部分综述文献, 对各文献的内容侧重作了简要介绍, 其中包含CNN表征可视化的相关内容.表 4 CNN表征可视化相关的综述文献统计Table 4 Review literature statistics related to CNN representation visualization5.3 开源工具CNN可视化的相关开源工具, 一些研究人员在GitHub等网站开源了多种方法综合的代码包,这对于表征可视化研究及迁移到其他任务使用具有重要价值.文献[103]对2016年以前的可视化方法作了详细调研和分类整理, 将其中主流方法分为修改输入的方法(如基于扰动的方法)、反卷积类方法和重建输入的方法(如激活最大化方法)三类. 根据这些方法开发了基于MatConvNet框架[112]的CNN可视化工具包FeatureVis, 适用于Matlab平台上的CNN可视化.Ozbulak[83]发布了一个内容丰富的开源代码包, 实现了10余种可视化方法, 包括梯度方法(如VBP、GAP、Smooth gradient、Integrated gradient等)和类激活映射方法(如Grad-CAM、Score-CAM等). 该源码包基于PyTorch框架, 已经被许多研究人员关注和使用, 受到领域内好评, 目前仍在更新与拓展中.韩国科学技术院的Kim[113]发布了基于Tensorflow框架的可视化源码包, 该源码包含有梯度类方法、CAM类方法、激活最大化方法等, 配有详细的使用教程, 对各种方法的原理及实现过程的介绍细致, 适合初学者使用.此外, 佐治亚理工学院的Wang等[114]实现了对CNN网络的交互式可视化, 可对CNN网络各层的卷积、激活和池化操作的数据流向及中间层特征图进行实时展示, 支持交互式的选择输入图像, 实时观察各层的数据流向及表征情况. 虽然该工具更多关注于CNN网络中数据流的走向, 而非解释CNN中间层特征的语义, 但也非常有利于理解CNN的内部表征.6. 结束语本文围绕CNN表征可视化研究, 详细梳理了该领域近年来相关的文献, 从基础概念及内容、常见方法的分类与比较、效果的评估及应用等方面进行了详细介绍. 其中, 对常见的可视化方法的分类和介绍是本文的重点内容, 该部分详细分析了各种算法的过程, 归纳了每一类方法的特点, 并对它们的效果进行了比较. 最后, 对该领域仍存在的难点和未来的研究趋势作了总结和展望.随着表征可视化研究的深入, 人们对CNN的特征学习和预测机制的理解也会更加深刻. 同时, 其他类型的可解释性方法也在不断发展中, 在它们的共同作用下, 不断推动可解释性深度学习的发展. 期待未来实现可理解的、透明的和高效的深度学习方法.登录中国人工智能培训chinaai查看更多信息