• [执行问题] 基于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昇腾论坛获取更多信息。
  • [热门活动] 【CANN训练营】【2022第二季】昇腾CANN算子精讲课
    跟着教学视频和文档写的AICPU算子开发过程,但是时间不够未验证。
  • [基础介绍] 卷积神经网络表征可视化研究综述(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查看更多信息
  • [API使用] 关于算子mindspore.nn.Conv2dTranspose没有output_padding参数
    【功能模块】pytorch中的反置卷积torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1, padding_mode='zeros')对应mindspore是mindspore.nn.Conv2dTranspose(in_channels, out_channels, kernel_size, stride=1, pad_mode="same", padding=0, dilation=1, group=1, has_bias=False, weight_init="normal", bias_init="zeros")其中pytorch算子中有一个output_padding参数表示对输出的特征图的某一边进行padding,然而mindspore算子中没有,那么如何实现对特征图的某一边进行padding呢,有替代的方案吗
  • [行业资讯] 浅析UHF Gen 2 RFID和HF RFID的那些区别
    目前,UHF Gen 2RFID在高速生产线上的小型单体上的表现已经和货运中心周转的箱体托盘上的表现相媲美。由于成本低,UHF RFID已导致旧式的,速度慢,成本又高的HF 13.56 MHz RFID技术濒于淘汰。在决定究竟部署那种射频识别技术之前,需要理解UHF和HF的基本概念。射频波中含有两种成分:即磁波和电波。通常,HF RFID 13.56 MHz依赖的是电磁场中的“近场”磁场,而UHF RFID 860-960 MHz则是远场辐射,既包含磁场有包含电场。而在UHF标签中响应的究竟是那种波则取决于两个方面:即RFID标签天线和RFID读写器之间的距离。由于波中的磁场分量的强度将随距离快速地减小,故只能在近场方起作用。其有效范围被天线结构限制到大约一两个波长。由于HF标签为了接收能量而利用电感耦合来感应该磁场。HF标签天线通常是有点像线圈的电感型天线,因此需要更多的传导材料以及比等效的UHF标签天线更复杂的制造工艺。所幸的是,HF标签在磁场上方没有死角,使用合适的天线,UHF标签就能够很容易地获取相同的近场能量,并且效率和成本效益更高。麦克斯韦的四个方程是电磁场分析和设计的基础。法拉第定律是这四个方程之一:“磁场中线圈感应的电压正比于磁场的强度和频率”。这就揭示了一个极其简单的概念:即频率越高,效率越高。UHF的频率是HF的60倍,这意味着对于RFID标签和RFID读写器天线之间的能量耦合效率来说,UHF是HF的大约60倍。传统的概念是超高频RFID不适合于单品级标签:标签太大,超高频RFID不能工作于液体,金属以及彼此靠近的小型单品包装。而且UHF的距离太远,所有这些都忽视了一个事实,即UHF Gen 2可以比HF更容易和更高效地用于近场。这意味着UHF系统能够读取HF能够读取更多的东西,包括液体和金属含量高的物品。更重要的是,这意味着单品级应用已经能够平衡UHF Gen 2标准为供应链多带来的各种利益。关键是如何控制UHF的近场,射频波中的这个分量特别适合于距离很近的单品级RFID工作。采用近场UHF Gen 2方案的各类应用正在增长。2004年12月,EPC global批准了UHF Gen 2协议,从而产生出第一个全球性的RFID标准。从此,市场上看到了许多符合该标准的产品。这一普及证明了从单品,容器到托盘的普适性,所用的对象有近场也有远场,材料覆盖了液体、金属、紧密堆积的和包装的物品等。三年后,HF产品开发商不得不认可该标准。相反,最新的HF规范已经使起草者的幻想破灭。根据HF“V2”(UHF Gen 2的HF版本)的标准编纂人员- Ken Laing的说法,迄今为止工作进展有限,仅有的进展是对现有标准的有限改进以及出现了一些商用产品。相对于在目前流行的HF标准ISO 15693上对EPC进行编码,Laing认为在Gen 2 HF标签上对EPC进行编码的公司将会看到性能方面的改善。他说,据RFID Update的结果,虽然改善并非惊天动地,但还是比现在市场上的HF产品好很多。也许重要的一点是,即便是标准已经得到批准,但一开始所谓合格的V2产品并不会符合它。这需要一段很长的时间,即便是现在可以使用,也达不到UHF Gen 2目前的性能。
  • [其他] 张量卷积神经网络的统一权值初始化范式
    张量卷积神经网络(Tensorial Convolutional Neural Networks, TCNNs)因其在减小模型参数或提高泛化能力方面的优势而受到广泛的研究。然而,甚至权重初始化方法也阻碍了tcnn的探索。具体来说,一般的初始化方法,如Xavier或Kaiming初始化,通常无法为TCNN生成合适的权值。同时,虽然有针对特定架构的特别方法(如张量环网),但它们不适用于具有其他张量分解方法的TCNN(如CP或Tucker分解)。为了解决这一问题,我们提出了一种通用的权值初始化范式,推广了Xavier和Kaiming方法,可广泛应用于任意的TCNN。具体来说,我们首先提出了再现变换,将TCNNs中的逆向过程转换为等效的卷积过程。然后,基于前向和后向过程中的卷积算子,构建统一的范式来控制TCNN中的特征和梯度方差。因此,我们可以推导出各种TCNN的扇入和扇出初始化。我们证明,我们的范式可以稳定TCNNs的训练,导致更快的收敛和更好的结果。
  • [API使用] 程序问题
    【功能模块】我的运行环境:win10  64bit; mindspore 1.8; cpu; python 3.7 【操作步骤&问题现象】专家好,我想要训练一个非常简单的全连接神经网络。神经网络只有5层。输入层是v和p。3个隐藏层,每层100个神经元,激活函数relu。输出层是DP,UU,DU。构建一个从u v到DP UU DU的映射关系。70%的数据用于训练,30%的数据用于验证。损失函数用MSE,求解器用Adam。我的程序如图1-3所示。目前遇到了几个问题。1、神经网络的输出层有3个,分别为DP,UU,DU。但是我在将神经网络的输出分开的时候出现了报错,如图4.2、我尝试把神经网络的输入和输出都变成1个,因此只将v作为输入,DP作为输出,如图5. 希望这样可以把程序走通。但是在将神经网络的预测值与标签求MSE的时候又出现了报错,如图6.请问我应该如何调整我的程序,谢谢。【截图信息】我自己尝试写的神经网络训练程序全图图1图2图3图4图5图6【日志信息】(可选,上传日志内容或者附件)
  • [算子使用] MindSpore易点通·精讲系列–网络构建之Conv2d算子
    # Dive Into MindSpore -- Conv2d Operator For Network Construction > MindSpore易点通·精讲系列–网络构建之Conv2d算子 本文开发环境 - Ubuntu 20.04 - Python 3.8 - MindSpore 1.7.0 本文内容摘要 - 先看文档 - 普通卷积 - 深度卷积 - 空洞卷积 - 数据格式 - 填充方式 - 输出维度 - 本文总结 - 本文参考 ## 1. 先看文档 老传统,先看官方文档。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/1/1659339781533424313.png) 参数解读: - in_channels -- 输入通道数 - out_channels -- 输出通道数 - kernel_size -- 二维卷积核的高度和宽度。值应该为整型(代表高度和宽度均为该值)或两个整型的tuple(分别代表高度和宽度值) - stride -- 二维卷积的移动步长 - pad_mode -- 填充模式 - padding -- 填充数量 - dilation -- 二维卷积核膨胀尺寸,输入值同kernel_size。空洞卷积参数 - group -- 将过滤器拆分为组。深度卷积参数 - has_bias -- 是否添加偏置 - data_format -- 输入数据的数据格式,`NCHW`或`NHWC` ## 2. 普通卷积 普通卷积,又可以称为常规卷积。由于是在深度学习相关课程中最先接触到的`CNN`卷积方式,本文不再对其原理展开介绍。下面通过一个实例来介绍`MindSpore`中的用法。 例如: 对于二维的8×8原始图像,图像格式为RGB(即通道数为3),可以认为这是一个3维图片,数据维度为 3×8×8(NCHW)或8×8×3(NHWC)。 假设我们对上述图片进行普通卷积操作,卷积核大小为3×3,步长为1,卷积后的输出通道数为4,`padding`方式为`same`,即输入和输出的高和宽一致。 其示意图如下所示: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/1/1659339802936581433.png) 如何用`MindSpore`来定义这样的普通卷积呢,示例代码如下: > 这里的批数为2 ```python import numpy as np from mindspore import nn from mindspore.common import dtype as mstype from mindspore.common import Tensor def common_conv_demo(): img_data = np.random.rand(2, 3, 8, 8) ms_in = Tensor(img_data, dtype=mstype.float32) conv_op = nn.Conv2d(3, 4, 3, 1) ms_out = conv_op(ms_in) print("in shape: {}".format(ms_in.shape), flush=True) print("out shape: {}".format(ms_out.shape), flush=True) def main(): common_conv_demo() if __name__ == "__main__": main() ``` 代码解读: > 核心代码为`nn.Conv2d(3, 4, 3, 1)` > > - 参数数字3表示输入通道 > > - 参数数字4表示输出通道。 > > - 参数数字3表示卷积核大小,这里因为高&宽的卷积值相等,所以使用整型表示。 > > - 参数数字1表示卷积移动步长。 > > - `nn.Conv2d`默认卷积方式为`same`,故没有在这里的参数中体现。 将上述代码保存到`common_conv2d.py`文件,使用如下命令运行: ```shell python3 common_conv2d.py ``` 输出内容为: > 可以看到输出的通道为4,因为填充方式为`same`,输出的高度和宽度与输入数据相同。 ```shell in shape: (2, 3, 8, 8) out shape: (2, 4, 8, 8) ``` ## 3. 深度卷积 深度卷积(Depthwise Convolution)的一个卷积核负责一个通道,一个通道只被一个卷积核卷积,可以看出其卷积方式与普通卷积明显不同。深度卷积一般与逐点卷积(Pointwise Convolution)结合,组成深度可分离卷积(Depthwise Separable Convolution),当然也可以单独使用,比如,经典的MobileNet网络就用到了深度可分离卷积。 那么在MindSpore中如何实现深度卷积呢,我们先从文档说起。 > - **group** ([*int*](https://docs.python.org/library/functions.html#int)) – Splits filter into groups, in_channels and out_channels must be divisible by group. If the group is equal to in_channels and out_channels, this 2D convolution layer also can be called 2D depthwise convolution layer. Default: 1. > - **group** (int) – 将过滤器拆分为组, in_channels 和 out_channels 必须可被 group 整除。如果组数等于 in_channels 和 out_channels ,这个二维卷积层也被称为二维深度卷积层。默认值:1. 从文档可以看出,当`in_channels`、`out_channels`、`group`三个参数的值相等时,可以认为即为2D的深度卷积。下面通过一个案例来进一步讲解。 例如: 对于二维的8×8原始图像,图像格式为RGB(即通道数为3),可以认为这是一个3维图片,数据维度为 3×8×8(NCHW)或8×8×3(NHWC)。 假设我们对上述图片进行深度卷积操作,卷积核大小为3×3,步长为1,卷积后的输出通道数为3(与输入通道一致),`padding`方式为`same`,即输入和输出的高和宽一致。 其示意图如下所示: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/1/1659339830503286857.png) MindSpore示例代码如下: ```python import numpy as np from mindspore import nn from mindspore.common import dtype as mstype from mindspore.common import Tensor def depthwise_conv_demo(): img_data = np.random.rand(2, 3, 8, 8) ms_in = Tensor(img_data, dtype=mstype.float32) conv_op = nn.Conv2d(3, 3, 3, 1, group=3) ms_out = conv_op(ms_in) print("in shape: {}".format(ms_in.shape), flush=True) print("out shape: {}".format(ms_out.shape), flush=True) def main(): depthwise_conv_demo() if __name__ == "__main__": main() ``` 代码解读: > 核心代码为`nn.Conv2d(3, 3, 3, 1, group=3)` > > - 参数数字3表示输入通道。 > > - 参数数字4表示输出通道。 > > - 参数数字3表示卷积核大小,这里因为高&宽的卷积值相等,所以使用整型表示。 > > - 参数数字1表示卷积移动步长。 > > - `nn.Conv2d`默认卷积方式为`same`,故没有在这里的参数中体现。 > - **参数`gropu=3`与前面的输入通道3和输出通道3一致,是这里实现深度卷积的关键参数。** 将上述代码保存到`depthwise_conv2d.py`文件,使用如下命令运行: ```shell python3 depthwise_conv2d.py ``` 输出内容为: > 可以看到输出的通道为3(与输入数据通道数一致),因为填充方式为`same`,输出的高度和宽度与输入数据相同。 ```shell in shape: (2, 3, 8, 8) out shape: (2, 3, 8, 8) ``` **一点补充** 细心的读者可能会问,逐点卷积如何实现呢?这里逐点卷积可以看成普通卷积的特例,即卷积核为1×1的普通卷积(其他参数视具体而定),再参考第2节的内容,就可以很容易的实现出来了。 ## 4. 空洞卷积 空洞卷积(Dilated Convolution),又称扩张卷积、膨胀卷积,是在标准的卷积核中注入空洞,以此来增加模型的感受野(reception field)。相比原来的正常卷积操作,扩张卷积多了一个参数: dilation rate,指的是卷积核的点的间隔数量,比如常规的卷积操作dilatation rate为1。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/1/1659339852192767331.jpg) (a)图对应3x3的1-dilated conv,和普通的卷积操作一样,(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,也就是对于一个7x7的图像patch,只有9个红色的点和3x3的kernel发生卷积操作,其余的点略过。也可以理解为kernel的size为7x7,但是只有图中的9个点的权重不为0,其余都为0。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv),(c)图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。 空洞卷积的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。在图像需要全局信息或者语音文本需要较长的sequence信息依赖的问题中,都能很好的应用Dilated Convolution,比如语音合成WaveNet、机器翻译ByteNet中。 **一点补充** - 在上图的(b)中,对于`kernel_size`为3×3,`dilation rate=2`的情况,其实际`kernel_size`大小为7×7。 - 但是在`MindSpore(Pytorch)`框架内,其计算公式为`dilation∗(kernelsize−1)+1`,即实际`kernel_size`大小为5×5。 - 可以看出,上图中对卷积核的周边做了同样的膨胀,而框架在具体实现时,只对卷积核内部做膨胀。 下面通过一段代码示例,来看看MindSpore中的具体实现。代码如下: > 为了方便观察输出数据的高度和宽度,这里将`padding`方式设置为`valid`。 ```python import numpy as np from mindspore import nn from mindspore.common import dtype as mstype from mindspore.common import Tensor def dilated_conv_demo(): img_data = np.random.rand(2, 3, 8, 8) ms_in = Tensor(img_data, dtype=mstype.float32) common_conv_op_0 = nn.Conv2d(3, 4, 3, 1, pad_mode="valid") common_conv_op_1 = nn.Conv2d(3, 4, 5, 1, pad_mode="valid") dilated_conv_op = nn.Conv2d(3, 4, 3, 1, pad_mode="valid", dilation=2) common_out_0 = common_conv_op_0(ms_in) common_out_1 = common_conv_op_1(ms_in) dilated_out = dilated_conv_op(ms_in) print("common out 0 shape: {}".format(common_out_0.shape), flush=True) print("common out 1 shape: {}".format(common_out_1.shape), flush=True) print("dilated out shape: {}".format(dilated_out.shape), flush=True) def main(): dilated_conv_demo() if __name__ == "__main__": main() ``` 代码解读: > - `common_conv_op_0`和`common_conv_op_1`皆为普通卷积,其卷积核大小分别为3×3和5×5。 > - `dilated_conv_op`为空洞卷积,卷积核为3×3,但dilation设置为2。 > - 根据公式`dilation∗(kernelsize−1)+1`可知,`dilated_conv_op`就卷积核大小来看,效果类似于5×5普通卷积。验证参见输出数据的数据维度。 将上述代码保存到`dilated_conv2d.py`文件,使用如下命令运行: ```shell python3 dilated_conv2d.py ``` 输出内容为: > 可以看出`common out 1 shape`和`dilated out shape`相等,验证了代码解读的第三条。 ```shell common out 0 shape: (2, 4, 6, 6) common out 1 shape: (2, 4, 4, 4) dilated out shape: (2, 4, 4, 4) ``` ## 5. 数据格式 > 特别注意:`NHWC`数据格式目前只支持在`GPU`硬件下使用。 在`Conv2d`中,输入数据的数据格式可选值有`NHWC`和`NCHW`,默认值为`NCHW`。其中各个字母的含义如下: - N -- 批数 - C -- 通道数 - H -- 高度 - W -- 宽度 那么两种数据格式又有什么区别呢,先从一段错误代码讲起: > 在下面的代码中,我们创建数据img_data,并且将通道放置到了最后一个维度,即数据格式为`NHWC`。但是`Conv2d`中默认的数据格式为`NCHW`,那么运行起来如何呢? ```python import numpy as np from mindspore import nn from mindspore.common import dtype as mstype from mindspore.common import Tensor def data_format_demo(): img_data = np.random.rand(2, 8, 8, 3) ms_in = Tensor(img_data, dtype=mstype.float32) common_conv_op = nn.Conv2d(3, 4, 3, 1) ms_out = common_conv_op(ms_in) print("common out shape: {}".format(ms_out.shape), flush=True) def main(): data_format_demo() if __name__ == "__main__": main() ``` 将上述代码保存到`format_conv2d.py`文件,使用如下命令运行: ```shell python3 format_conv2d.py ``` 会输出报错信息,报错内容如下: > 错误信息中并没有显式提示是数据格式问题,所以对于新手来说这个问题可能具有迷惑性。 ```shell WARNING: Logging before InitGoogleLogging() is written to STDERR [CRITICAL] CORE(29160,0x102270580,Python):2022-07-31-16:35:26.406.143 [build/mindspore/merge/mindspore/core/ops_merge.cc:6753] Conv2dInferShape] For 'Conv2D', 'C_in' of input 'x' shape divide by parameter 'group' should be equal to 'C_in' of input 'weight' shape: 3, but got 'C_in' of input 'x' shape: 8, and 'group': 1 [WARNING] UTILS(29160,0x102270580,Python):2022-07-31-16:35:26.409.046 [mindspore/ccsrc/utils/comm_manager.cc:78] GetInstance] CommManager instance for CPU not found, return default instance. Traceback (most recent call last): File "/Users/kaierlong/Codes/OpenI/kaierlong/Dive_Into_MindSpore/code/chapter_02/01_conv2d.py", line 74, in main() File "/Users/kaierlong/Codes/OpenI/kaierlong/Dive_Into_MindSpore/code/chapter_02/01_conv2d.py", line 70, in main data_format_demo() File "/Users/kaierlong/Codes/OpenI/kaierlong/Dive_Into_MindSpore/code/chapter_02/01_conv2d.py", line 64, in data_format_demo ms_out = common_conv_op(ms_in) File "/Users/kaierlong/Pyenvs/env_mix_dl/lib/python3.9/site-packages/mindspore/nn/cell.py", line 586, in __call__ out = self.compile_and_run(*args) File "/Users/kaierlong/Pyenvs/env_mix_dl/lib/python3.9/site-packages/mindspore/nn/cell.py", line 964, in compile_and_run self.compile(*inputs) File "/Users/kaierlong/Pyenvs/env_mix_dl/lib/python3.9/site-packages/mindspore/nn/cell.py", line 937, in compile _cell_graph_executor.compile(self, *inputs, phase=self.phase, auto_parallel_mode=self._auto_parallel_mode) File "/Users/kaierlong/Pyenvs/env_mix_dl/lib/python3.9/site-packages/mindspore/common/api.py", line 1006, in compile result = self._graph_executor.compile(obj, args_list, phase, self._use_vm_mode()) RuntimeError: build/mindspore/merge/mindspore/core/ops_merge.cc:6753 Conv2dInferShape] For 'Conv2D', 'C_in' of input 'x' shape divide by parameter 'group' should be equal to 'C_in' of input 'weight' shape: 3, but got 'C_in' of input 'x' shape: 8, and 'group': 1 The function call stack (See file '/Users/kaierlong/Codes/OpenI/kaierlong/Dive_Into_MindSpore/code/chapter_02/rank_0/om/analyze_fail.dat' for more details): # 0 In file /Users/kaierlong/Pyenvs/env_mix_dl/lib/python3.9/site-packages/mindspore/nn/layer/conv.py(286) if self.has_bias: # 1 In file /Users/kaierlong/Pyenvs/env_mix_dl/lib/python3.9/site-packages/mindspore/nn/layer/conv.py(285) output = self.conv2d(x, self.weight) ^ ``` 那么如何才能正常运行呢,有两种做法,一种是修改输入数据的数据格式;一种是对算子中的`data_format`参数进行调整。展开来说,可以有三种方案。 方案1: - 在数据预处理部分就将输入数据的数据格式规范成`NCHW`。 方案2: - 对`ms_in` 数据做一次转置操作(Transpose),将数据调整为`NCHW`。 方案3: - 将`data_format`设置为`NHWC`。特别注意,这一设置只在`GPU`下可用,`CPU`和`Ascend`下目前不可用。 ## 6. 填充方式 在`Conv2d`中,填充模式(`pad_mode`)可选值为`same`、`valid`、`pad`,默认值:`same`。下面来介绍这三种填充方式。 ### 6.1 same 对于`same`填充方式,官方描述如下: > 输出的高度和宽度分别与输入整除 stride 后的值相同。若设置该模式,`padding` 的值必须为0。 具体示例代码参见第2小节。 **特别注意** 1. 和`Pytorch`中`Conv2d`的区别,在`Pytorch`中,填充方式为`same`时,只允许`stride`为1,而`MindSpore`可以允许大于1的整数值。 2. 由于`stride`允许1之外的整数,所以`same`模式下输出数据的高度和宽度未必和输入数据一致,这一点一定要谨记,至于输出数据的高度和宽度请参考第7小节。 ### 6.2 valid 对于`valid`填充方式,官方描述如下: > 在不填充的前提下返回有效计算所得的输出。不满足计算的多余像素会被丢弃。如果设置此模式,则 `padding `的值必须为0。 具体示例代码参见第4小节。 ### 6.3 pad 本节重点来讲解一下`pad`填充方式,对于`pad`填充方式,官方描述如下: > 对输入进行填充。在输入的高度和宽度方向上填充 `padding` 大小的0。如果设置此模式, `padding` 必须大于或等于0。 与`pad`填充方式配合使用的,还有`padding`参数。下面来看一下官方对`padding`参数的描述: > 输入的高度和宽度方向上填充的数量。数据类型为int或包含4个整数的tuple。如果 padding 是一个整数,那么上、下、左、右的填充都等于 padding 。如果 padding 是一个有4个整数的tuple,那么上、下、左、右的填充分别等于 padding[0] 、 padding[1] 、 padding[2] 和 padding[3] 。值应该要大于等于0,默认值:0。 padding参数解读: - 允许两种数据形式 - 一个整数 -- 此时表示上下左右填充值皆为padding - tuple,且tuple内含四个整数 -- 此时表示上、下、左、右的填充分别等于 padding[0] 、 padding[1] 、 padding[2] 和 padding[3] - 这里的上、下、左、右表示的高和宽,通俗解释即为上高、下高、左宽、右宽。 下面通过两个示例来讲解两种数据形式。 #### 6.3.1 padding为一个整数 例如,对于二维的8×8原始图像,图像格式为RGB(即通道数为3),可以认为这是一个3维图片,数据维度为 3×8×8(NCHW)或8×8×3(NHWC)。 假设我们对上述图片进行普通卷积操作,卷积核大小为3×3,步长为1,卷积后的输出通道数为4,要求输出数据的高度和宽度与输入数据一致。 其示意图如下所示: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/1/1659339896685817106.png) 简单分析:上面的案例要求第2节中的代码就可以实现,在第2节中采用的`pad_mode`为`same`,那么如果采用`pad_mode`为`pad`呢,代码如下: ```python import numpy as np from mindspore import nn from mindspore.common import dtype as mstype from mindspore.common import Tensor def pad_demo_01(): img_data = np.random.rand(2, 3, 8, 8) ms_in = Tensor(img_data, dtype=mstype.float32) conv_op = nn.Conv2d(3, 4, 3, 1, pad_mode="pad", padding=1) ms_out = conv_op(ms_in) print("in shape: {}".format(ms_in.shape), flush=True) print("out shape: {}".format(ms_out.shape), flush=True) def main(): pad_demo_01() if __name__ == "__main__": main() ``` 代码解读: > - 在卷积核大小为3×3,卷积步长为1的情况下,要想保证输出数据的高宽值与输入数据一致,在`pad_mode`为`pad`模式下,`padding`的值应该设置1。 > - 这里计算`padding`数值的公式参加第7小节输出维度部分。 将上述代码保存到`pad_conv2d_01.py`文件,使用如下命令运行: ```shell python3 pad_conv2d_01.py ``` 输出内容为: ```shell in shape: (2, 3, 8, 8) out shape: (2, 4, 8, 8) ``` #### 6.3.2 padding为四个整数tuple "padding为四个整数tuple"是"padding为一个整数"的一般情况。下面我们通过一个示例进行讲解。 例如:输入数据仍然保持同`6.3.1`中一致,但是这次我们输出数据的高度和宽度要求有所变化,要求高度与输入数据一致,宽度为7(输入数据为8),这种情况下应该如何设定padding呢? 实例代码如下: ```python import numpy as np from mindspore import nn from mindspore.common import dtype as mstype from mindspore.common import Tensor def pad_demo_02(): img_data = np.random.rand(2, 3, 8, 8) ms_in = Tensor(img_data, dtype=mstype.float32) conv_op = nn.Conv2d(3, 4, 3, 1, pad_mode="pad", padding=(1, 1, 1, 0)) ms_out = conv_op(ms_in) print("in shape: {}".format(ms_in.shape), flush=True) print("out shape: {}".format(ms_out.shape), flush=True) def main(): pad_demo_02() if __name__ == "__main__": main() ``` 代码解读: > - 还记得padding[0] 、 padding[1] 、 padding[2] 和 padding[3] 这四个参数的意义,不记得没关系,再来一遍:通俗解释即为上高、下高、左宽、右宽。 > > - 这里的要求是输出数据的高度与输入数据一致,宽度为7(输入数据为8)。所以上高、下高的`padding`与`6.3.1`中一致,即1;左宽、右宽加起来的padding为1,因为不能存在非整数,这里我们分别设置为1、0(这里没有特别要求,也可以设置为0、1)。 > - 这里计算`padding`数值的公式参加第7小节输出维度部分。 > - 最终的核心代码即为`nn.Conv2d(3, 4, 3, 1, pad_mode="pad", padding=(1, 1, 1, 0))`。 将上述代码保存到`pad_conv2d_02.py`文件,使用如下命令运行: ```shell python3 pad_conv2d_02.py ``` 输出内容为: > 可以看到输出数据的高度和宽度符合我们的上面的要求。 ```shell in shape: (2, 3, 8, 8) out shape: (2, 4, 8, 7) ``` ## 7. 输出维度 本节来单独介绍一下`Conv2d`中数据输出维度的计算,在前面的6小节中,我们已经对部分做了铺垫。 各种情况下的输出维度见下图公式。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/1/1659339923554171124.png) 在面对具体情况时,将相关参数带入公式即可算到要计算的部分。这里不再对公式展开解释。 ## 本文总结 本文重点介绍了`MindSpore`中的`Conv2d`算子。通过几种不同卷积模式(普通卷积、深度卷积、空洞卷积)的具体实现,以及数据格式、填充方式、输出维度多个角度来深入讲解`Conv2d`算子的具体应用。 ## 本文参考 - [Conv2d官方文档](https://www.mindspore.cn/docs/zh-CN/r1.7/api_python/nn/mindspore.nn.Conv2d.html#mindspore.nn.Conv2d) - [普通卷积与深度可分离卷积的区别](https://blog.csdn.net/m0_37799466/article/details/106054111) - [卷积网络基础知识---Depthwise Convolution && Pointwise Convolution && Separable Convolution](https://cloud.tencent.com/developer/article/1453992) - [Depthwise卷积与Pointwise卷积](https://zhuanlan.zhihu.com/p/80041030) - [Depthwise Convolution与普通卷积的区别以及其他卷积方法](https://zhuanlan.zhihu.com/p/339835983) - [如何理解空洞卷积(dilated convolution)?](https://www.zhihu.com/question/54149221/answer/192025860) - [如何理解扩张卷积(dilated convolution)](https://blog.csdn.net/chaipp0607/article/details/99671483) 本文为原创文章,版权归作者所有,未经授权不得转载!
  • [技术干货] 人工智能对军事防御与安全的影响
    作者:Cismag1.以人工智能为代表的新兴颠覆性技术正在开创一个新时代从人工智能、机器人技术到分布式记账技术(Distributed Ledger Technologies,DLT)、物联网(Internet of Things,IoT),新兴的颠覆性技术开辟了商用创新的新时代。技术变革引发的社会和经济变革,对加拿大军事力量的发展有着巨大影响。这些技术包括人工智能与机器学习、量子技术、数据安全及计算机辅助硬件等。人工智能作为一种力量倍增器,能够重塑战争规则。在大国竞争和世界多极化的背景下,人工智能正在成为竞争焦点。正如北大西洋公约组织(以下简称“北约”)的指导意见称,“人工智能技术对于加拿大及其盟国的军事防御和安全至关重要。”当前,数据和数据驱动技术占据了全球经济的制高点,全球数据经济的竞争与大国竞争密不可分。中国、俄罗斯、美国和许多其他国家都在积极探索人工智能及其应用,并把重点聚焦于国防和国家安全。目前,北约仍然是人工智能领域的领头羊,具有较强的技术优势,中国正在迅速追赶。中国政府希望到 2030 年能够在人工智能领域引领世界,并通过充分利用大量数据,扩大其在人工智能产业化方面的领先地位。虽然美国在人工智能方面已经确立领先地位,但是预计中国今后将主导人工智能的产业化。因为中国不仅具有先进的商业能力,而且还具有持续的国家战略。2.人工智能是一种动态创新关于人工智能的概念,人们已经讨论了很多,准确来说,人工智能不仅是一种动态、特定的技术和创新,更是先进技术的组合。目前,人工智能技术已成为许多重要应用的基础,包括网络搜索、医疗诊断、算法交易、工厂自动化、拼车和自动驾驶等。人工智能研究始于 20 世纪 40 年代,随着机器学习和计算机处理能力的提高,引发了人们对它的极大兴趣。人工智能的发展与人脑的多级学习和推理能力相似。当与大数据和云计算相结合时,人工智能就可以通过将“智能”的系统连接到 5G 网络的系统和设备来“认知”数字技术。作为人工智能的一个子集,机器学习是人工智能最典型的应用。机器学习利用统计技术,使机器能够在没有明确指令的情况下“学习”,驱动应用程序和服务,提高分析的自动化程度。这种通过数据来自动提高性能的过程被称为“训练模型”。机器学习最常见的应是深度学习,即利用多层的人工神经网络来复制人工智能。深度学习架构,例如深层神经网络、递归神经网络和卷积神经网络能够为计算机在视觉、语音识别、机器翻译以及自然语言处理等广泛的研究领域提供支持。3.美国、加拿大重金打造人工智能人工智能是新兴颠覆技术的核心。目前,美国仍然是人工智能领域的全球领先者。美国国家科学基金会(National Science Foundation,NSF)每年对人工智能研究的投资为 1 亿多美元,美 国 国 防 高 级 研 究 计 划 局(Defense Advanced Research Projects Agency,DARPA)最近提出了“下一代人工智能”项目,计划投入 20 亿美元,目标是提高情景式推理和自适应推理能力。加拿大也一直是人工智能领域的领头羊,在 2017 年 “人工智能战略”的指导下,加拿大的人工智能生态系统发展迅猛,而且政府每年都将增加国防开支,并将重点放在新兴颠覆技术上。目前加政府已经承诺将投入大量资金研发人工智能,在过去 10 年里,加政府投入了 4.438亿美元。根据加政府 2021 年的预算报告,其中1.85 亿美元用于支持人工智能研究的商业化;1.622 亿美元用于在全国范围内招聘顶尖学术人才;0.48 亿美元用于研究所;0.4 亿美元用于增强埃德蒙顿、多伦多和蒙特利尔国家人工智能研究所研究人员的计算能力;0.086 亿美元用于促进与人工智能有关的标准的制定和采用。与传统军事技术的发展不同,没有哪个国家能够垄断人工智能的军事应用。研究人员和企业之间广泛的合作意味着人工智能和机器学习将进一步在全球应用,因此,未来的许多军事应用很可能直接采用针对商用开发的技术。4.人工智能的军事应用人工智能是一个能够对商业和军事技术领域产生广泛影响的领域。人工智能的广泛应用意味着该技术能够重新调整现代化部队的发展速度和组织结构。从整体上看,人工智能代表着国家安全性质的结构性转变。因此,未来的军事应用重点是研发、采办以及整合先进和变革性技术(包括网络和自主系统)。4.1 提升情报能力作为一种战争工具而出现的人工智能,能够确保加拿大的国家安全,特别是提升其情报能力。数字时代的战争正日益变得以知识为基础。当冲突进入信息领域,军事规划将侧重于信息 /虚假信息行动、网络行动、情报行动以及政治或经济影响行动。事实上,混合战争很早之前就作为一种战争工具,其目的是利用网络宣传、破坏、欺骗其他非军事行动,从内部削弱敌人。网络一直是敌人、国家、犯罪组织和非国家行为者攻击的主要目标,其中涉及监视和侦察、情报和敏感信息。技术的发展极大地拓宽了数据和信息的获取范围,目前推动战略情报的大多数信息是开源情报(Open Source Intelligence,OSINT)或公共资源。现代战争极其依赖于安全、及时和准确的信息。随着信息呈指数增长,数据分析变得愈加困难,促使人们采用新的分析模式和网络工具。在数字时代,情报人员迫切需要新的平台、新的工具和跨领域的 OSINT,而人工智能正好能够满足这种需求。人工智能和机器学习通过筛选大量的数据,能够极大地提高加拿大的国家情报能力。虽然人工智能系统不能提供因果分析,但是可以极大地提高在数据管理和数据驱动分析方面的智能性。4.2 重塑军事指挥控制系统人工智能改变了旧的军事冲突模式,面对数据驱动的战场,决策者应该及时调整其安全态势,目前,加拿大国防部和军队面临的一个重要挑战是数据驱动网络正以极快的速度重塑军事指挥控制系统。集成化系统的优势是能够高效地协同军事行动,在军事指挥控制系统中,人、传感器执行威胁检测,将信息推送至决策栈,使决策者能够准确地响应,但集成的指挥控制系统也意味着单点故障将成为薄弱环节而遭受攻击,“自上而下”的决策难以适应在复杂情况下的紧急挑战,而人工智能的应用又将使决策进程进一步加快,因此对传统的军事指挥控制系统提出了挑战。神经计算、生成式对抗性网络、人工智能决策支持、数据和情报分析方面的创新将对军事行动产生巨大影响。在平台、技术和应用集成化的数字时代,人工智能和机器学习对于巩固和加强军事力量至关重要。人工智能并不是一种单一的技术,而是由一系列技术构成的,可以集成到各种军事和商业应用中,而数据是这些技术不断发展的基础。数字技术受到数据的推动,并进一步推动人工智能的发展。数据是人工智能和先进机器学习算法训练的基础,数据正驱动着机器“自主”发展。数据驱动技术支撑着现代社会的核心和经济功能,随着全球 5G 网络的推出,全球信息网络将产生、收集、处理和存储大量数据。因此,加拿大国防部和军队将数据提升到国家级资产是明智之举,对经济增长和加拿大国防都至关重要。保护和利用数据意味着要重新思考当下的集中式数字基础设施,网络时代的数据安全应该既是分散的,又是聚合的,这样才能避免出现集中式系统漏洞风险。4.3 推动自主武器系统的发展人工智能的武器化加剧了全球军备竞赛,它可能重塑加拿大的国防战略。目前,由于人工智能的引入,军事系统自动化、设备维护和监视以及无人机和机器人的部署都取得了巨大进展。美国、俄罗斯、以色列等国家正在研究将人工智能嵌入到网络安全和支持作战模拟、数据处理的机器人系统中。先进的后勤保障、半自动驾驶、智能的供应链管理和可预测的维护系统代表了当前人工智能的军事应用。自主武器无须人类的参与,可以在陆、海、空、天和网络多疆域执行目标识别、打击和摧毁活动。其基于监测周围环境的传感器系统、识别潜在目标、决定是否发起攻击的人工智能系统,以及能够摧毁目标的武器的组合。在亚美尼亚和阿塞拜疆的冲突中,自动和半自动无人机被用来破坏常规的军事系统,导致一系列军事平台直接失效。最近,对沙特阿拉伯国家石油加工设施的袭击行动也证实了军用无人机正越来越多地应用于各种战场环境。随着自主武器系统和数据驱动技术的成熟和普及,它们可能会为国家和非国家行为者提供平台和工具,以新的破坏性方式来运用人工智能和机器学习。4.4 打造先进的网络平台对许多北约国家而言,网络平台对于多疆域作战至关重要。网络平台使复杂环境中的可视化和协调资源成为可能。在 5G 和云计算的支持下,信息系统能有效地收集、传输和处理大量战场数据,提供实时数据分析。设备互联对于协调空袭行动、无人机驾驶、实时战场空间分析、管理高度复杂的供应链至关重要。从战略、通信到后勤、情报,数字平台成为指挥复杂军事行动的基础,其数据是所有作战领域的命脉。在数字化战场空间中,每一个官兵、平台和资源都是复杂军事网络的一个节点。从 20 世纪 90 年代以网络为中心的美军军事行动开始,数字技术就是先进武器、战术和战略的基础。从战场态势感知、自主无人机到精确制导弹药和机器驱动的心理战,网络正在将战争带入网络时代。人工智能本质上是一种“自下而上”的技术,它依赖于大量数据的不断“输入”,以支持机器学习为“学习引擎”。随着数字生态系统的激增,它们所依赖的网络平台和数据管理系统对于管理不断扩大的资源和人员变得至关重要。DLT 提供的高度分散的验证系统,可以在确保所有通信和数据传输不受对手攻击的同时,消除集中式节点可能存在的故障。因此,加拿大国防部应该依靠 DLT(例如区块链)来加速加拿大军方的数字转型。通过在分散的网络中横向分配数据的手段,克服原有系统固有的局限性和脆弱性的缺点。4.5 促进无人机群与机器人迅速发展随着人工智能在军事应用领域的迅速推进,许多国家在无人机和机器人的部署方面取得了很大进展,其中,以美国和以色列的军用无人机的发展为代表。美军军用无人机种类齐全、技术先进、用途广泛,主要有无人侦查机,察打一体攻击型无人机、诱饵无人机和货运无人机,用于战场监视、通信中断、军事打击活动等,其在全球市场份额占据领先地位。无人机群技术可用于微型、小型无人机以及无人驾驶飞行器(Unmanned Aerial Vehicle,UAV),利用基于共享的信息进行自主决策。现代军用无人机已经能够在无人的情况下定位、识别和攻击目标。无人机“蜂群技术”可以使数以百计的无人驾驶飞机从战场收集信息,为各种武器系统提供支持。人脸识别和决策算法使得国家和非国家行为者都能够利用致命的自主武器系统执行定点清除任务,在数千架无人机上装备爆炸弹头就能够击垮防空力量,攻击基础设施、城市、军事基地等。4.6 使“马赛克战”应运而生无人机的军事威胁势不可挡,关键基础设施的网络攻击事件不时发生,为了应对不断变化的环境,DARPA 提出“马赛克战”概念。“马赛克战”的核心思想是利用廉价而灵活的模块化系统应对高度复杂的网络化环境,其中个人作战平台可以被设计成可配置的,利用数字网络加快动态响应。在 DARPA 举办的“阿尔法狗斗”(AlphaDogfight)挑战赛中(2019—2020 年),使用先进的 F-16 飞行模拟器,让计算机与有经验的飞行员对抗,结果飞行员根本无法匹敌人工智能的自主攻击和精确性。在“马赛克战”中,人工智能、无人机、传感器、数据和人员相互结合,为作战指挥官提供情报、资源和后勤支持。模块化系统表明,未来战争将越来越多地利用计算、数据分析和算法。人工智能系统将驱动高度变化、不可预知的战场环境,加快战争进程。4.7 对抗性攻击不可避免人工智能的武器化也引发了针对人工智能系统的新战略和新方法。正如网络行动可以让计算机网络或机器以某种方式运行一样,对手也可以对人工智能系统使用同样的策略,这个过程被称为对抗性机器学习,它试图找出机器学习模型中的弱点并加以利用。攻击行为可能发生在开发或部署阶段,包括通过提供欺骗性“输入”或以模型本身为目标来误导模型。随着人工智能系统变得愈加普及,对抗性攻击行为会越发具有吸引力。此外,攻击者往往会通过创建对抗性示例来修改训练数据或测试数据,这些例子被故意“扰乱”或修改,从而导致数据错误。在国家安全方面,对手可能会试图使用同样的技术来影响武器系统。如果只是孤立发生的事件,则很可能很快解决这一问题。如果在一段时间内频发,则可能对情报收集系统带来巨大挑战并影响其信任度。高价值人工智能系统并非对手攻击的唯一目标,其中包括生物特征识别和假生物特征被利用来冒充合法用户。在语音识别中,攻击者通过添加低量级噪声来破坏系统和计算机安全。目前,加拿大国防部在其军舰上部署了“语音助手”,期望通过部署人工智能系统来提高作战效率。5.加强人工智能的全球治理从无人机、人机对话到军事决策,人工智能技术能够使战斗力倍增。数据驱动下的战争速度和范围表明,我们正在进入一个致命自主武器系统将极大改变全球力量平衡的新时代。随着低地轨道日益成为军事监视、遥感、通信、数据处理和弹道导弹的作战环境,人工智能武器化与太空武器化也相互交叉融合。人工智能、低地轨道和自主武器系统代表着全球安全的重要转折点,世界各国的研究人员对此所带来的威胁表示担忧,认为如果在人工智能应用和发展的规范方面缺乏国际共识,就有可能导致危机的出现。因此,人工智能和其他数字技术的法律条约将塑造未来几十年战争和冲突的轮廓。在人工智能军事化的发展中,构建法律条约对于减少未来冲突至关重要。目前,欧洲国家呼吁欧盟成员国制定使用人工智能新技术的战略,美国邀请盟友讨论人工智能使用的法律问题。北约正在启动一个鼓励成员国达成协议的进程,同时认识到人工智能等新兴技术对全球安全的深远影响,并于 2019 年 12 月启动了新兴和颠覆性技术(Emerging and Disruptive Technologies,EDT)路线图。加拿大及其盟国正寻求促进、参与和建立合作的机会,提出制定一个基本框架,支持人工智能和其他新兴技术。联合国秘书长安东尼奥·古特雷斯(António Guterres)也强调了人工智能和其他数字技术的风险和机遇,并呼吁制定保护性法律。人工智能是一个影响商业和军事应用的技术领域。鉴于在对人工智能实行全面监管方面存在概念模糊和政治障碍等问题,治理问题在很长一段时间内都将是一项艰巨的挑战。6.结语人工智能已经从一个神秘的学术领域发展成为社会和经济转型的强大动力。人工智能汇集了先进的数据、算法和计算能力,能为军队提供安全、及时和准确的信息。加拿大要想构建一支适合数字时代的军队,政府、工业界和学术界必须要以一体化的方式进行合作,建立一个健全的创新性生态系统。除了大力发展新兴技术,加拿大政府和军队还需要平衡不断变化的地缘政治格局,利用信息共享、专家会议和多边对话的方式加强国际合作。责任编辑:华轩      来源: 信息安全与通信保密杂志社
  • [基础知识] 【MindSpore易点通】MindSpore实践图神经网络01开篇
    ### 图 - 图是一种结构化数据类型,由节点(nodes)和边(edges)组成,同时图本身也可以作为数据点。 ![image-20220730211159482.png](https://bbs-img.huaweicloud.com/blogs/img/20220730/1659187339048522001.png) - 图是一种非欧几里得数据,这也意味着它们可以存在于3D中。与图像、文本和音频等其他数据类型不同,图数据具有不规则性和高复杂的邻接关系。 ![image-20220730160014667.png](https://bbs-img.huaweicloud.com/blogs/img/20220730/1659187352137123531.png) CV里的图像数据(左)和GNN中图数据(右) - 欧式空间中的卷积操作实际上是用固定大小可学习的卷积核来抽取像素的特征 - 而图上邻居结点不固定,所以传统的卷积核不能直接用于抽取图上结点的特征 ### 图神经网络 人工神经网络(简称NN)及其扩展族,包括卷积神经网络(CNN)、递归神经网络(RNN),以及现在的图神经网络(GNN)。CNN与RNN的操作数据是规则的序列(文本)和网格(图像)数据,应用对象单一且固定。 但是,现实世界中存在许多复杂系统,这些系统常常表现为复杂网络的形式,如社交网络,交通网络,蛋白质交互网络,由于这些复杂网络的不规则性,传统的神经网络很难直接应用于图数据。而GNN的出现,使得深度学习能够更好地处理图数据。GNN可以实现节点分类,链路预测,图分类等图相关的任务。 ![image-20220730155905239.png](https://bbs-img.huaweicloud.com/blogs/img/20220730/1659187385543115569.png) 图神经网络框架 几何深度学习揭示了如何在图形上使用深度学习。图神经网络GNN是几何深度学习的一部分,研究具有结构属性、拓扑性质的数据的学习和预测任务。图神经网络的每一个特征提取层都会对节点的特征和连接的特征进行更新,这种更新模式被叫作消息传递机制。 消息传递机制指的是要更新某一个点的特征,需要考虑周边和它相连的点的特征,这里就要用到消息函数。消息函数通常是由一个网络对节点和周边节点关系的刻画。然后用另一个网络整合周边节点信息,接着加和到这个节点本身的特征中,这两步更新模式就构成了一个基本的消息传递机制。其核心在于**聚合邻居结点的信息**。 ![image-20220730160746386.png](https://bbs-img.huaweicloud.com/blogs/img/20220730/1659187394928545667.png) 消息传递机制示意图 ### MindSpore及环境配置(Windows11) #### (1)安装Minicanda - 安装Minicanda,创建Python环境 ``` # 创建环境 conda create --name py39_ms18 python=3.9.0 # 输入y ``` ![image-20220730205431024.png](https://bbs-img.huaweicloud.com/blogs/img/20220730/1659187416852916717.png) ``` # 切换到环境 conda activate py39_ms18 # 查看安装版本 python --version # 3.9.0 # 更新环境 pip install --upgrade pip ``` ![image-20220730210338217.png](https://bbs-img.huaweicloud.com/blogs/img/20220730/1659187424598196697.png) #### (2)安装MindSpore - 获取环境安装命令: https://www.mindspore.cn/install ![image-20220730210505305.png](https://bbs-img.huaweicloud.com/blogs/img/20220730/1659187434621559700.png) - Windows11+CPU+Python39+MindSpore18 ``` pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.8.0/MindSpore/cpu/x86_64/mindspore-1.8.0-cp39-cp39-win_amd64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple ``` ![image-20220730210621933.png](https://bbs-img.huaweicloud.com/blogs/img/20220730/1659187458104641807.png) - Linux版本(可选): Linux+CUDA101+Python39+MindSpore18 ``` # CUDA101 pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.8.0/MindSpore/gpu/x86_64/cuda-10.1/mindspore_gpu-1.8.0-cp39-cp39-linux_x86_64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple # CPU pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.8.0/MindSpore/cpu/x86_64/mindspore-1.8.0-cp39-cp39-linux_x86_64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple ``` #### (3)验证是否安装成功 ``` python -c "import mindspore;mindspore.run_check()" ``` ![image-20220730210946320.png](https://bbs-img.huaweicloud.com/blogs/img/20220730/1659187470875130691.png) ### 小结 本文首先介绍了图和图神经网络的基础概念,带领大家简单入门图学习相关的基本概念。图神经网络的出现使得深度学习能够在图结构数据上进行表征学习,这一突破促进了图表示学习的快速发展,并在社交网络分析,交通预测,推荐系统等领域得到广泛应用。 其次,针对实践所需的环境进行了安装和配置,主要是MindSpore的环境安装与配置。此次选择了在自己电脑上进行安装和搭建,MindSpore选择安装了最新1.8版本,正好也可以体验一下新功能特性。 本系列实践内容主要包含MindSpore的基础使用方法和GNN的实践两部分,第一部分主要介绍MindSpore的基本使用,第二部分主要是基于MindSpore实现一些基础的图神经网络模型。
  • [技术干货] (转)2022年最新深度学习入门指南
    概述深度学习是用于处理视觉相关任务的强大的方法。卷积神经网络是一种深度学习模型,我们用它来处理与计算机视觉相关的应用程序。在本指南中,我们将探索 CNN 的工作原理以及它们如何应用于图像分类任务。我们还将构建一个 CNN 模型,并使用 Keras 从头开始在训练数据集上对其进行训练。介绍我一直着迷于深度学习模型的潜力和力量,以及它们如何理解执行图像分类、图像分割、对象检测等任务。我们还遇到了一些分割算法,例如来自 X-的肿瘤/异常检测,他们在这方面的表现甚至优于医生。在本指南中,我们将全面介绍 CNN 及其在图像分类任务中的应用。我们将首先介绍卷积神经网络 (CNN) 背后的基本理论、它们的工作原理以及它们如何成为用于任何计算机视觉任务的最流行的模型之一。现在让我们开始吧……卷积神经网络CNN 或卷积神经网络是将图像作为输入并通过使用卷积运算学习图像中的局部模式的算法。而密集层/全连接层则从输入中学习全局模式。CNN 的学习局部模式具有两个特性:CNN 学习的模式是不变的,即在学习识别图像左下角的特定模式后,CNN 可以识别图像中的任何位置。但是,如果密集连接的网络出现在新位置的任何位置,则必须重新学习该模式。这使得 CNN 在处理和理解图像时具有数据效率。CNN 可以学习模式的空间层次,即第一个卷积层学习一个小的局部模式,如边缘或线,第二个卷积层学习由第一个卷积层学习的特征组成的更大的模式,依此类推。通过这种方式,CNN 学习和理解了越来越复杂和抽象的视觉概念。让我们看看下面的猫图,在这里我们可以看到,在第一个卷积层中,学习了边缘、曲线等模式。但在第二层 CNN 中,眼睛、鼻子或耳朵等特征是通过使用第一层的模式来检测的。通过这种方式,CNN了解图像并了解图像中的对象。 参考特征提取现在让我们探索并了解它是如何工作的。卷积运算卷积是应用于 3D 张量的操作,称为特征图。这些特征图由两个空间轴(高度和宽度)和一个深度轴(或通道轴)组成。如果我们考虑 RGB 图像的示例,高度和宽度构成空间轴,3 个颜色通道表示深度轴。类似地,对于黑白图像,深度为 1。但在其他层的输出中,深度不是由颜色通道表示,而是代表过滤器。过滤器对输入数据的特定方面进行编码,即过滤器可以对“面部存在”或“汽车结构”等概念进行编码。卷积运算由两个关键参数组成,内核大小:应用于图像的过滤器的大小。这些是典型的 3×3 或 5×5。输出特征图的深度:这是卷积计算的输出滤波器的数量。卷积操作只是在输入特征图上乘加加权滤波器,以生成另一个具有不同宽度、高度和深度的 3D 张量。卷积操作通过在 3D 输入特征图上滑动这些大小为 3×3 或 5×5 过滤器的窗口,在每个可能的位置停止,然后计算特征。我们可以在下面的 gif 中看到操作,3×3 内核在 5×5 输入特征图上运行以生成 3×3 输出。 参考卷积重要的是要注意网络从给定数据中学习所需的最佳过滤器。CNN 模型的权重是过滤器。现在让我们看看边框效果、填充和步幅。了解边框效果和填充现在再次让我们考虑 5×5 特征图(参考上面的 gif)。过滤器的大小为 3×3,因此有 9 个图块。现在在卷积操作期间,3×3 滤波器只能通过 5×5 特征图 9 次,因此我们的输出大小为 3×3。所以输出在这里从 5×5 缩小到 3×3,也就是说,在每个维度旁边缩小了两个图块。这里没有对输入特征图应用填充,因此称为有效填充。如果我们希望输出特征图与输入特征图的大小相同,我们需要使用填充。填充包括在输入特征图的每一侧添加适当数量的行和列,以使每个输入图块周围的中心卷积窗口成为可能。这种类型的填充称为相同的填充。以下 GIF 表示相同的填充。 源边框效果和填充现在我们可以看到,当我们向 5×5 特征图添加额外的填充并应用 3×3 过滤器时,我们将能够获得与输入特征图大小相同的输出特征图。如何找到要添加到给定过滤器大小和特征图的填充?当我们遇到不同大小的特征图和过滤器以及我们如何确定对于有效和相同的情况应该使用多少填充时,自然会出现这个问题。所以要回答这个问题,我们有确定填充的公式,即有效填充:因为有效填充意味着没有填充,所以padding的数量将为0。相同填充:我们使用相同的填充来保留输入特征图的大小。但是卷积的输出主要取决于过滤器的大小,与输入大小无关。因此,可以根据过滤器大小确定填充,如下所示:相同填充 =(过滤器大小 - 1)/ 2现在让我们看看另一个可以影响输出大小的因素,即步幅。了解步幅步幅是影响输出特征图大小的因素之一。步幅是应用过滤器的两个连续窗口之间的距离。在上面的例子中,我们已经看到过滤器作为窗口被应用于输入特征图,并被移动一个单位或步幅。当这种转变大于1时,我们将其定义为跨步的CNN。下面的GIF是一个大步为2的CNN的例子。我们还可以观察到,当我们使用步幅的值为 2(或大于 1)时,与常规卷积(当 stride 的值 = 1 时)相比,输出特征图的大小减小(下采样因子为 2) . 因此我们可以说使用步幅是对输入特征图进行下采样的方法之一。但它们在实践中很少使用,但它仍然是 CNN 的重要概念之一,了解它是很好的。现在在开始 CNN 的实现之前,让我们看一下用于对输入特征进行下采样的另一个重要概念,即池化。理解池化池化操作可以定义为一种通过使用不同的策略(例如取平均值、最大值、总和等)来积极减小/下采样输入特征图的大小的方法。现在让我们看看不同类型的池化1.最大池化:最大池化是一种广泛使用的池化策略,用于对输入特征图进行下采样。在这一层中,确定大小的窗口通过输入特征图,然后获得最大值并计算为下一层或输出特征图。我们可以在下面的 GIF 中看到,当我们使用过滤器大小 2 执行最大池化时,输入特征被下采样因子 2 或减半。我们可以通过以下公式确定使用最大池化后输出的大小:输出大小=输入大小/(池化过滤器大小) 还有其他类型的池化策略,例如考虑窗口平均值的平均池化和考虑窗口权重总和的求和池化。但最大池化一直是最流行和最广泛使用的池化策略。这是因为当我们考虑过滤器窗口的最大值时,我们将能够将有关输入特征/当前特征图的大部分可用信息转移到下一个特征图。因此,当我们通过神经网络的层进行传播时,减少了数据的丢失。既然我们对 CNN 的工作原理有了一些了解,那么现在让我们从头开始实现一个 CNN。从头开始训练基于 CNN 的图像分类器现在让我们在 MNIST 数据集上训练一个 CNN 模型。MNIST 数据集由 0 到 9 的手写数字图像组成,即 10 个类。训练集由 60000 张图像组成,测试集由 10000 张图像组成。让我们使用 CNN 从头开始训练图像分类器。我们将在Keras框架中实现代码。Keras 是最受欢迎和使用最广泛的深度学习库之一。它是作为高级 API 构建的,可以轻松使用 TensorFlow。要完成以下代码实现,建议使用带有 GPU 的 Jupyter Notebook。可以通过Google Colaboratory访问相同的内容,该实验室提供基于云的 Jupyter Notebook环境和免费的 Nvidia GPU。现在让我们开始吧获取 MNIST 数据集在下载数据集之前,让我们进行必要的导入,from tensorflow.keras.datasets import mnistfrom tensorflow.keras.utils import to_categoricalfrom tensorflow.keras import layersfrom tensorflow.keras import modelsimport numpy as npimport matplotlib.pyplot as pltfrom matplotlib import pyplot现在让我们下载数据,(train_images, train_labels), (test_images, test_labels) = mnist.load_data()上面的代码下载数据并缓存。由于我们正在加载预定义的数据集,因此该数据集已经被预处理并以元组的形式打包。现在让我们探索我们解压出来的这些张量的形状,int("Shape of training dataset: ",train_images.shape)print("Shape of test dataset: ",test_images.shape)print("Shape of training dataset labels: ",train_labels.shape)print("Shape of test dataset labels: ",test_labels.shape)输出: 从上面的输出我们可以看到,训练数据集有 60000 张图片,每张图片的大小为 28×28。同样,测试数据集有 10000 张图像,图像大小为 28×28。我们还可以看到标签没有任何形状,即它是一个标量值。让我们看看一些标签,print(train_labels)print(type(train_labels))输出:我们可以看到标签都在一个 NumPy 数组中。现在让我们看看我们的一些训练图像,# plot first few imagesfor i in range(9):   # define subplot   pyplot.subplot(330 + 1 + i)   # plot raw pixel data   pyplot.imshow(train_images[i], cmap=pyplot.get_cmap('gray'))# show the figurepyplot.show()输出: 我们可以通过绘制它们来可视化训练样本。在我们继续模型训练之前,让我们对我们的数据进行一些预处理。基本预处理现在让我们将图像从 (60000, 28, 28) 重塑为 (60000, 28, 28, 1) 大小,其中最后一个维度表示图像的深度。我们之前已经看到,每个图像的特征图都有三个维度,即宽度、高度和深度。由于 MNIST 训练集由黑白图像组成,我们可以将深度定义为 1。接下来,我们应该对数据集进行归一化,即将输入的所有值都在 0 和 1 之间。由于图像层的最大值是 255,我们将整个数据集除以 255。train_images = train_images.reshape((60000, 28, 28, 1))train_images = train_images.astype('float32') / 255现在让我们也对测试集应用相同的预处理。test_images = test_images.reshape((10000, 28, 28, 1))test_images = test_images.astype('float32') / 255最后,让我们将标签转换为分类格式,即它们目前作为标量,但我们正在执行 One-Hot 编码以将每个标量唯一地映射到向量。train_labels = to_categorical(train_labels)test_labels = to_categorical(test_labels)train_labels[:10]输出: 我们可以看到训练标签是独热编码。现在让我们使用 Keras 创建一个基本的 CNN 模型。使用 Tensorflow-Keras 创建 CNN 模型现在让我们使用 Keras 库创建一个基本模型,model = models.Sequential()model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)))model.add(layers.MaxPool2D((2,2)))model.add(layers.Conv2D(64, (3,3), activation='relu'))model.add(layers.MaxPool2D((2,2)))model.add(layers.Conv2D(64, (3,3), activation='relu'))现在我们来分析一下上面的代码,首先,我们正在创建一个Sequential类型类的对象。Sequential 模型是一种模型,我们可以在其中添加和堆叠层以形成端到端模型。使用**.add**我们通过根据层指定各种参数来将层添加到我们的模型中。在上面的模型中,我们添加了一个卷积层(即 Keras 中的 Conv2D),它接受许多过滤器、内核大小和激活函数作为参数。接下来,添加最大池化层(即 Keras 中的 MaxPool2D)以启用池化操作。Keras 中提供了不同类型的层。模型的上述部分负责识别和检测输入数据中存在的模式。(我们上面讨论过的工作)现在最后让我们通过定义模型的输出数量来初始化头部。model.add(layers.Flatten())model.add(layers.Dense(64, activation='relu'))model.add(layers.Dense(10, activation='softmax'))现在我们的模型已经准备好了。我们可以使用**.summary()**方法查看模型中所有层的列表 。model.summary()输出: 现在让我们通过分配优化器、损失函数和模型训练时使用的指标来编译模型。model.compile(optimizer='rmsprop',             loss='categorical_crossentropy',             metrics=['accuracy'])现在让我们用训练数据和标签拟合模型并训练 5 个 epochsmodel.fit(train_images, train_labels, epochs=5, batch_size=64)结果: 从训练结果中我们可以看出,该模型能够达到高达 99% 的准确率,这真是令人印象深刻!!结论我们已经看到了卷积神经网络的底层功能以及它如何从图像中提取特征。因此,我们可以得出结论,卷积神经网络是在计算机视觉应用中产生最先进结果的技术之一。
总条数:945 到第
上滑加载中