• [其他] 神经网络中重要的算法:反向传播BP(Back Propagation)
    在很久以前,人工神经网络面临一个重大的挑战:增加神经网络的层数虽然可为其提供更大的灵活性,让网络能有更强的表征能力,也就是说,能解决的问题更多,但随之而来的庞大网络参数训练,一直是制约多层神经网络发展的一个重要瓶颈。 说到BP算法,我们通常强调的是反向传播。其实在本质上,它是一个双向算法: (1)正向传播输入信息,实现分类功能(所有的有监督学习,在本质都可以归属于分类); (2)反向传播误差,调整网络权值。 神经网络包含了前馈网络和反向传播两个主要过程。前者是多个函数的复合,如果你画出前馈神经网络的图结构,你会发现这个图结构形象地描述了函数的复合方式,最经典的是“链式结构”。而反向传播是目前用来训练神经网络的最常用并且也是最有效的方法。梯度下降因为基于反向传播的思想方法,而得以在神经网络训练过程中大施拳脚。 简化的说,反向传播是从错误出发层层究责的过程,究什么责?究那个部分导致最终训练结果误差的权重的责。究责是为了改正过失,这就是神经网络学习的本质——找到网络中神经元之间的最佳连接权值。换句话说,反向传播就是反向计算偏微分,将信息逆向从神经网络的高层向前层传播。 前向传播完毕后,我们得出了预测值,而这个输出结果与实际结果必然存在着误差。误差越大,说明模型越差,但是这种差可以改善。我们通过将误差转化规范成损失函数,通过训练模型将损失函数不断减小。怎么训练呢?你是否还记得梯度下降这个概念, 反向传播通过对链式函数构成的误差函数的梯度下降,在将这个误差从输出层向隐藏层传播的过程中,对每个权重进行更新,直至传播到输入层。 各个权重在不断迭代的反向传播过程中得以调整,直至收敛。 损失函数的最小化过程采取了对链式结构函数的梯度下降的求解,虽然计算深层的链式结构的梯度直接易懂,但是计算量很大,而反向传播有效地减小了梯度下降算法的计算量,我们也可以说反向传播是计算梯度的算法。
  • [其他] 联结主义人工智能的基本观点
    联结主义人工智能的基本观点是:人工智能必须能够模仿大脑的功能,更具体地强调机器应具有学习能力和认知能力,通过学习来解决问题。 联结主义人工能特指感知机、神经网络发展的机器学习,广泛意义上也可以包括强化学习以及其他机器学习方法。联结主义人工智能主要解决模式识别、聚类、分类、联想等非结构化同题。早在20世纪40年代,McCulloch和Walter开创了集成认知神经学、科学和数理逻辑计算的计算神经学,提出了最早的神经网络模型,给出了神经元的形式化数学描述和网络结构、证明了单个神经元能执行逻辑功能。 1958年,Frank将感知器建立在一个非线性神经元上,得到了神经元的Pitts模型。这是在计算机有限运算能力的条件下,基于硬件结构建立的第一个可进行模式识别的单层神经网络模型。但在此后的一段时间内,神经网络模型仍然无法测试,而且连比较基本的异或(XOR)的逻辑运算都不能实现,即便多层神经网络也不具有低复杂度,相关研究进人了长达20年的停滞状态。 1974年,哈佛大学的Paul首次提出误差反向传播算法,不仅解决了异或运算问题,而且大大提升了神经网络迭代计算效率。直到20世纪80年代,神经网络才再度迎来研究高潮。1982年,John提出了可用作联想存储器的互连网络模型,该模型是一种从输出到输人有反愦连接的循环神经网络。1986年,David等人在神经网络上应用了反向传播算法。1989年,Yann等人受日本学者福岛邦彦提出的仿生视觉皮层神经网络模型等的启发,构建了应用于计算机视觉问题的包含2个卷积层和2个全连接层的神经网络,正式提出了卷积神经网络,并于1998年构建更完备的卷积神经网络LeNet-5,成功用于解决手写识别问题。 2006年,Hinton等人发表文章,提出将预训练、自编码器与深度神经网络结合,开启了深度学习(深度神经网络)在学术界和工业界的研究与应用浪潮,相继在语音识别、图像识别等领域开展应用,显著降低了错误识别率。2011年后,深度学习开始将卷积层与最大池化层合并,并将其输出传递给几个全连接层,再传递给输出层。2013年4月,美国麻省理了学院(MIT)的《麻省理工科技评论》将深度学习列为2013年十大突破性技术之一。2014年,当时还在蒙特利尔大学读博上的Ian等人提出生成对抗网络溉念,使得神经网络系统不仅能够更好地生成图像与声音,还能识别它们,从而奠定了无监督自主学习算法框架的基础。2015年,谷歌DeepMind提出正式的Deep Q Networks系统。2016年,融合了深度学习、强化学习和蒙特卡罗树搜索方法的AlphaGo战胜了世界围棋高手李世石。这些研究让联结主义大放异彩,也是当前人工智能高潮形成的主因。 其他机器学习方向也在不断取得成果。早在1952年,IBM科学家Arthur开发了一个跳棋程序。该程序能够通过观察当前位置,并学习一个隐含的模型,为后续动作提供更好的指导。从1984年开始,Leo Breiman等人相继提出了适用于分类和连续输人(特征)/输出(预测)变量回归预测建模问题的决策树算法和多决策树组合的随机森林算法,后者属于集成学习范畴。1995年,由Corinna等人提出了支持向量机的溉念,通过Kernel的技巧将低维空间线性不可分或难分的样本数据点映射至高维空间使其线性可分,在解决小样本、非线性以及高维模式识别问题方面具有明显优势。
  • [其他] DepthShrinker:一种新的压缩范式,用于提高紧凑神经网络的实际硬件效率
    配备紧凑算子(如深度卷积)的高效深度神经网络(DNN)模型在降低DNN的理论复杂性(如权重/操作的总数)同时保持良好的模型精度方面显示出了巨大的潜力。然而,现有的高效DNN在提高实际硬件效率方面仍然有限,原因是其通常采用的紧凑算子的硬件利用率较低。在这项工作中,我们为开发真正硬件高效的DNN开辟了一种新的压缩范式,从而在保持模型准确性的同时提高硬件效率。有趣的是,我们观察到,虽然一些DNN层的激活函数有助于DNN的训练优化和达到精度,但训练后可以适当地去除它们,而不影响模型的精度。受此启发,提出了一种深度收缩框架DepthShrinker,通过将现有高效且具有不规则计算模式的深度神经网络的基本模块收缩为密集的基本模块,开发硬件友好的紧凑网络,大大提高了硬件利用率,从而提高了硬件效率。令人兴奋的是,我们的DepthShrinker框架提供了硬件友好的紧凑网络,性能优于最先进的高效DNN和压缩技术,例如,在特斯拉V100上比SOTA通道修剪方法MetaPruning更高3.06%的精度和1.53×吞吐量。我们的代码可以在https://github.com/RICEEIC/DepthShrinker上找到。
  • [其他] 图神经网络异常检测的再思考
    图神经网络(GNNs)在图异常检测中有着广泛的应用。由于谱滤波器的选择是GNN设计的关键之一,因此通过图谱分析异常是GNN设计的第一步。我们的关键观察是,异常的存在将导致“右移”现象,即频谱能量分布较少集中在低频,较多集中在高频。这一事实促使我们提出了Beta小波图神经网络(BWGNN)。事实上,BWGNN具有光谱和空间本地化带通滤波器,以更好地处理异常中的“右移”现象。在4个大规模异常检测数据集上验证了BWGNN的有效性。我们的代码和数据发布在https://github.com/squareRoot3/ Rethinking-Anomaly-Detection。
  • [其他] 深度神经网络中的特征学习与信号传播
    Baratin等人最近的工作(2021)揭示了深度神经网络训练期间发生的一个有趣的模式:与其他层相比,一些层与数据的对齐更多(其中对齐被定义为切线特征矩阵和数据标签矩阵的欧氏乘积)。对齐曲线作为层指数的函数(通常)表现出一种上升-下降模式,在某些隐藏层达到最大值。在这项工作中,我们为这一现象提供了第一种解释。我们引入平衡假设,将这种对齐模式与深度神经网络中的信号传播联系起来。我们的实验证明与理论预测非常吻合。https://www.zhuanzhi.ai/paper/eb536aebcbd07e082fa029bfa966c533
  • [其他] 深入探讨置换敏感图神经网络
    邻接矩阵排列的不变性,即图同构,是图神经网络(GNNs)的首要要求。通常,聚合消息时,节点排列上的不变操作可以满足这个前提条件。但是,这种不变性可能会忽略相邻节点之间的关系,从而影响GNN的表达能力。在这项工作中,我们通过排列组设计了一种高效的排列敏感聚合机制,捕获相邻节点之间的成对关联。我们证明了我们的方法严格地比二维Weisfeiler-Lehman (2-WL)图同构检验更强大,且不低于3-WL检验。此外,我们证明了我们的方法实现了线性抽样复杂度。在多个合成数据集和真实数据集上的综合实验证明了我们的模型的优越性。https://www.zhuanzhi.ai/paper/da818de2d710f7cb9087582587f6240f
  • [其他] 浅谈常见聚类算法
    K-means 聚类算法K-means 聚类算法 可能是大家最为熟悉的聚类算法。它在许多的工业级数据科学和机器学习课程中都有被讲解。并且容易理解和实现相应功能的代码 。    我们先确定要聚类的数量,并随机初始化它们各自的中心点。为了确定要聚类的数量,最好快速查看数据并尝试识别任何不同的分组。中心点是与每个数据点向量长度相同的向量,是上图中的“x”。通过计算当前点与每个组中心之间的距离,对每个数据点进行分类,然后归到与距离最近的中心的组中。基于迭代后的结果,计算每一类内,所有点的平均值,作为新簇中心。迭代重复这些步骤,或者直到组中心在迭代之间变化不大。您还可以选择随机初始化组中心几次,然后选择看起来提供最佳结果。Mean-Shift 聚类Mean-shift 聚类是一个基于滑窗的算法,尝试找到数据点密集的区域。它是一个基于质心的算法,也就是说他的目标是通过更新中心点候选者定位每个组或类的中心点,将中心点候选者更新为滑窗内点的均值。这些候选滑窗之后会在后处理阶段被过滤,来减少临近的重复点,最后形成了中心点的集合和他们对应的组。DBSCAN 笑脸聚类    DBSCAN 从一个任意的还没有被访问过的启动数据点开始。用一个距离 epsilon ε 将这个点的邻域提取出来(所有再距离 ε 内的点都视为邻居点)。如果在邻域内有足够数量的点(根据 minPoints) ,那么聚类过程开始,并且当前数据点变成新集群中的第一个点。否则,该点将被标记为噪声(之后这个噪声点可能会变成集群中的一部分)。在这两种情况中的点都被标记为”已访问“。对于这个新集群中的第一个点,在它 ε 距离邻域内的点已将变成相同集群中的一部分。这个让所有在 ε 邻域内的点都属于相同集群的过程在之后会一直被重复做,直到所有新点都被加进集群分组中。第 2,3 步的过程会一直重复直到集群内所有点都被确定,即所有在 ε 邻域内的点都被访问且被打上标签。我们在当前集群做完这些,一个新的未被访问的点会被提取并处理,从而会接着发现下一个集群或噪声。这个过程反复进行直到所有的点都被编辑为已访问。既然在最后所有的点都被访问,那么每个点都被标记为属于一个集群或者是噪声。基于高斯混合模型(GMM)的期望最大化(EM)聚类k-means的一个主要缺点是它简单地使用了集群中心的平均值。通过下面的图片,我们可以看到为什么这不是最好的方式。在左手边,人眼可以很明显地看到,有两个半径不同的圆形星团以相同的平均值为中心。k-means不能处理这个问题,因为不同簇的平均值非常接近。当簇不是圆形时,k均值也会失效,这也是将均值用作簇中心的后果。使用GMMs的EM聚类我们首先设定聚类簇的数量(如k-means),然后随机初始化每个集群的高斯分布参数。我们也可以通过快速查看数据来为初始参数提供一个很好的猜测。正如上图所示,这不是100%必要的,因为高斯操作开始时候是非常差的,但很快优化。给定每个簇的高斯分布,计算每个数据点属于特定簇的概率。一个点越靠近高斯中心,它就越可能属于该簇。这应该是直观的,因为对于高斯分布,我们假设大多数数据都靠近集群的中心。基于这些概率,我们为高斯分布计算了一组新的参数,这样我们就可以最大化群集中数据点的概率。我们使用数据点位置的加权和计算这些新参数,其中权重是属于特定集群的数据点的概率。为了以可视化的方式解释这一点,我们可以查看上面的图形,特别是以黄色集群为例。在第一次迭代中,分布是随机开始的,但是我们可以看到大多数黄点都在分布的右边。当我们计算一个由概率加权的和时,即使在中心附近有一些点,但大多数都在右边。因此,分布的平均值很自然地移近这些点集。我们还可以看到,大多数点是“从右上到左下”。因此,标准偏差会发生变化,以创建一个更适合这些点的椭圆,以便最大化概率加权的和。第2步和第3步重复进行,直到收敛,也就是在收敛过程中,迭代变化不大。凝聚层次聚类凝聚层次聚类算法实际上分为 2 类:自上而下或自下而上。自下而上算法在一开始将每个数据点当作一个单个集群对待,然后逐步的合并(或凝聚)成对的集群,直到所有的集群被合并到一个集群中,这个集群包含所有的点。自下而上层次聚类因此被叫做层次凝聚的聚类或者 HAC。这个聚类的层次被表示为一棵树(或者树状图)。树根是唯一的集群,他聚集了所有的样本,叶子是只有一个样本的集群。
  • [技术干货] MindSpore前馈神经网络运用
    MindSpore前馈神经网络运用实验经典介绍本实验主要介绍使用MindSpore开发前馈神经网络,并使用Fashion-MNIST数据集训练和测试模型。实验目的掌握如何使用MindSpore进行简单前馈神经网络的开发。了解如何使用MindSpore进行简单图片分类任务的训练。了解如何使用MindSpore进行简单图片分类任务的测试和预测。预备知识熟练使用Python。具备一定的深度学习理论知识,如感知机、前馈神经网络、损失函数、优化器,训练策略等。了解华为云的基本使用方法,包括OBS(对象存储)、ModelArts(AI开发平台)、训练作业等功能。华为云官网:https://www.huaweicloud.com了解并熟悉MindSpore AI计算框架,MindSpore官网:https://www.mindspore.cn/实验环境MindSpore 1.0.0(MindSpore版本会定期更新,本指导也会定期刷新,与版本配套);华为云ModelArts(控制台左上角选择“华北-北京四”):ModelArts是华为云提供的面向开发者的一站式AI开发平台,集成了昇腾AI处理器资源池,用户可以在该平台下体验MindSpore。实验准备已经对ModelArts云环境很熟悉的玩家可以直接跳到实验步骤。数据集准备Fashion-MNIST是一个替代MNIST手写数字集的图像数据集。 它是由Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自10种类别的共7万个不同商品的正面图片。Fashion-MNIST的大小、格式和训练集/测试集划分与原始的MNIST完全一致。60000/10000的训练测试数据划分,28x28x1的灰度图片。这里介绍一下经典的MNIST(手写字母)数据集。经典的MNIST数据集包含了大量的手写数字。十几年来,来自机器学习、机器视觉、人工智能、深度学习领域的研究员们把这个数据集作为衡量算法的基准之一。实际上,MNIST数据集已经成为算法作者的必测的数据集之一,但是MNIST数据集太简单了。很多深度学习算法在测试集上的准确率已经达到99.6%。从Fashion-MNIST GitHub仓库下载如下4个文件到本地并解压:train-images-idx3-ubyte     training set images(47,042,560 bytes)   train-labels-idx1-ubyte     training set labels(61,440 bytes)  t10k-images-idx3-ubyte      test set images (7,843,840 bytes)  t10k-labels-idx1-ubyte      test set labels (12,288 bytes) 1234脚本准备从课程gitee仓库上下载本实验相关脚本。将脚本和数据集组织为如下形式:feedforward  ├── Fashion-MNIST  │   ├── test  │   │   ├── t10k-images-idx3-ubyte  │   │   └── t10k-labels-idx1-ubyte  │   └── train  │       ├── train-images-idx3-ubyte  │       └── train-labels-idx1-ubyte   └── main.py  创建OBS桶本实验需要使用华为云OBS存储脚本和数据集,可以参考快速通过OBS控制台上传下载文件了解使用OBS创建桶、上传文件、下载文件的使用方法(下文给出了操作步骤)。提示: 华为云新用户使用OBS时通常需要创建和配置“访问密钥”,可以在使用OBS时根据提示完成创建和配置。也可以参考获取访问密钥并完成ModelArts全局配置获取并配置访问密钥。打开OBS控制台,点击右上角的“创建桶”按钮进入桶配置页面,创建OBS桶的参考配置如下:区域:华北-北京四数据冗余存储策略:单AZ存储桶名称:全局唯一的字符串存储类别:标准存储桶策略:公共读归档数据直读:关闭企业项目、标签等配置:免上传文件点击新建的OBS桶名,再打开“对象”标签页,通过“上传对象”、“新建文件夹”等功能,将脚本和数据集上传到OBS桶中。上传文件后,查看页面底部的“任务管理”状态栏(正在运行、已完成、失败),确保文件均上传完成。若失败请:参考上传对象大小限制/切换上传方式,参考上传对象失败常见原因。若无法解决请新建工单,产品类为“对象存储服务”,问题类型为“桶和对象相关”,会有技术人员协助解决。实验步骤推荐使用ModelArts训练作业进行实验,适合大规模并发使用。若使用ModelArts Notebook,请参考LeNet5及Checkpoint实验案例,了解Notebook的使用方法和注意事项。代码梳理导入MindSpore模块和辅助模块用到的框架主要包括:mindspore,用于神经网络的搭建numpy,用于处理一些数据matplotlib,用于画图、图像展示struct,用于处理二进制文件import osimport structimport sysfrom easydict import EasyDict as edictimport matplotlib.pyplot as pltimport numpy as npimport mindsporeimport mindspore.dataset as dsimport mindspore.nn as nnfrom mindspore import contextfrom mindspore.nn.metrics import Accuracyfrom mindspore.train import Modelfrom mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor, TimeMonitorfrom mindspore import Tensorcontext.set_context(mode=context.GRAPH_MODE, device_target='Ascend')变量定义cfg = edict({    'train_size': 60000,  # 训练集大小    'test_size': 10000,  # 测试集大小    'channel': 1,  # 图片通道数    'image_height': 28,  # 图片高度    'image_width': 28,  # 图片宽度    'batch_size': 60,    'num_classes': 10,  # 分类类别    'lr': 0.001,  # 学习率    'epoch_size': 20,  # 训练次数    'data_dir_train': os.path.join('Fashion-MNIST', 'train'),    'data_dir_test': os.path.join('Fashion-MNIST', 'test'),    'save_checkpoint_steps': 1,  # 多少步保存一次模型    'keep_checkpoint_max': 3,  # 最多保存多少个模型    'output_directory': './model_fashion',  # 保存模型路径    'output_prefix': "checkpoint_fashion_forward"  # 保存模型文件名字})读取并处理数据读取数据def read_image(file_name):    '''    :param file_name: 文件路径    :return:  训练或者测试数据    如下是训练的图片的二进制格式    [offset] [type]          [value]          [description]    0000     32 bit integer  0x00000803(2051) magic number    0004     32 bit integer  60000            number of images    0008     32 bit integer  28               number of rows    0012     32 bit integer  28               number of columns    0016     unsigned byte   ??               pixel    0017     unsigned byte   ??               pixel    ........    xxxx     unsigned byte   ??               pixel    '''    file_handle = open(file_name, "rb")  # 以二进制打开文档    file_content = file_handle.read()  # 读取到缓冲区中    head = struct.unpack_from('>IIII', file_content, 0)  # 取前4个整数,返回一个元组    offset = struct.calcsize('>IIII')    imgNum = head[1]  # 图片数    width = head[2]  # 宽度    height = head[3]  # 高度    bits = imgNum * width * height  # data一共有60000*28*28个像素值    bitsString = '>' + str(bits) + 'B'  # fmt格式:'>47040000B'    imgs = struct.unpack_from(bitsString, file_content, offset)  # 取data数据,返回一个元组    imgs_array = np.array(imgs).reshape((imgNum, width * height))  # 最后将读取的数据reshape成 【图片数,图片像素】二维数组    return imgs_arraydef read_label(file_name):    '''    :param file_name:    :return:    标签的格式如下:    [offset] [type]          [value]          [description]    0000     32 bit integer  0x00000801(2049) magic number (MSB first)    0004     32 bit integer  60000            number of items    0008     unsigned byte   ??               label    0009     unsigned byte   ??               label    ........    xxxx     unsigned byte   ??               label    The labels values are 0 to 9.    '''    file_handle = open(file_name, "rb")  # 以二进制打开文档    file_content = file_handle.read()  # 读取到缓冲区中    head = struct.unpack_from('>II', file_content, 0)  # 取前2个整数,返回一个元组    offset = struct.calcsize('>II')    labelNum = head[1]  # label数    bitsString = '>' + str(labelNum) + 'B'  # fmt格式:'>47040000B'    label = struct.unpack_from(bitsString, file_content, offset)  # 取data数据,返回一个元组    return np.array(label)def get_data():    # 文件获取    train_image = os.path.join(cfg.data_dir_train, 'train-images-idx3-ubyte')    test_image = os.path.join(cfg.data_dir_test, "t10k-images-idx3-ubyte")    train_label = os.path.join(cfg.data_dir_train, "train-labels-idx1-ubyte")    test_label = os.path.join(cfg.data_dir_test, "t10k-labels-idx1-ubyte")    # 读取数据    train_x = read_image(train_image)    test_x = read_image(test_image)    train_y = read_label(train_label)    test_y = read_label(test_label)    return train_x, train_y, test_x, test_y数据预处理和处理结果图片展示train_x, train_y, test_x, test_y = get_data()train_x = train_x.reshape(-1, 1, cfg.image_height, cfg.image_width)test_x = test_x.reshape(-1, 1, cfg.image_height, cfg.image_width)train_x = train_x / 255.0test_x = test_x / 255.0train_x = train_x.astype('Float32')test_x = test_x.astype('Float32')train_y = train_y.astype('int32')test_y = test_y.astype('int32')print('训练数据集样本数:', train_x.shape[0])print('测试数据集样本数:', test_y.shape[0])print('通道数/图像长/宽:', train_x.shape[1:])print('一张图像的标签样式:', train_y[0])  # 一共10类,用0-9的数字表达类别。plt.figure()plt.imshow(train_x[0,0,...])plt.colorbar()plt.grid(False)plt.show()训练数据集数量: 60000测试数据集数量: 10000通道数/图像长/宽: (1, 28, 28)一张图像的标签样式: 9使用MindSpore GeneratorDataset接口将numpy.ndarray类型的数据转换为Dataset# 转换数据类型为DatasetXY_train = list(zip(train_x, train_y))ds_train = ds.GeneratorDataset(XY_train, ['x', 'y'])ds_train = ds_train.shuffle(buffer_size=cfg.train_size).batch(cfg.batch_size, drop_remainder=True)XY_test = list(zip(test_x, test_y))ds_test = ds.GeneratorDataset(XY_test, ['x', 'y'])ds_test = ds_test.shuffle(buffer_size=cfg.test_size).batch(cfg.batch_size, drop_remainder=True)定义前馈神经网络前馈神经网络是一种最简单的神经网络,各神经元分层排列(其中每一层包含若干个神经元)。每个神经元只与前一层的神经元相连,接收前一层的输出,并输出给下一层,各层间没有反馈。是目前应用最广泛、发展最迅速的人工神经网络之一。第0层叫输入层,最后一层叫输出层,其他中间层叫做隐含层(或隐藏层、隐层)。隐层可以是一层,也可以是多层,是由全连接层堆叠而成。# 定义前馈神经网络class Forward_fashion(nn.Cell):    def __init__(self, num_class=10):  # 一共分十类,图片通道数是1        super(Forward_fashion, self).__init__()        self.num_class = num_class        self.flatten = nn.Flatten()        self.fc1 = nn.Dense(cfg.channel * cfg.image_height * cfg.image_width, 128)        self.relu = nn.ReLU()        self.fc2 = nn.Dense(128, self.num_class)    def construct(self, x):        x = self.flatten(x)        x = self.fc1(x)        x = self.relu(x)        x = self.fc2(x)        return x训练使用Fashion-MNIST数据集对上述定义的前馈神经网络模型进行训练。训练策略如下表所示,可以调整训练策略并查看训练效果。batch size    number of epochs    learning rate    input shape    optimizer60    20    0.001    (1,28,28)    Adam# 构建网络network = Forward_fashion(cfg.num_classes)# 定义模型的损失函数,优化器net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")net_opt = nn.Adam(network.trainable_params(), cfg.lr)# 训练模型model = Model(network, loss_fn=net_loss, optimizer=net_opt, metrics={"acc"})loss_cb = LossMonitor(per_print_times=int(cfg.train_size / cfg.batch_size))config_ck = CheckpointConfig(save_checkpoint_steps=cfg.save_checkpoint_steps,                             keep_checkpoint_max=cfg.keep_checkpoint_max)ckpoint_cb = ModelCheckpoint(prefix=cfg.output_prefix, directory=cfg.output_directory, config=config_ck)print("============== Starting Training ==============")model.train(cfg.epoch_size, ds_train, callbacks=[ckpoint_cb, loss_cb], dataset_sink_mode=False)============== Starting Training ==============epoch: 1 step: 1000, loss is 0.6812696epoch: 2 step: 1000, loss is 0.39710096epoch: 3 step: 1000, loss is 0.43427807epoch: 4 step: 1000, loss is 0.3170758epoch: 5 step: 1000, loss is 0.24550956epoch: 6 step: 1000, loss is 0.4204946epoch: 7 step: 1000, loss is 0.35653585epoch: 8 step: 1000, loss is 0.31376493epoch: 9 step: 1000, loss is 0.27455378epoch: 10 step: 1000, loss is 0.18871705epoch: 11 step: 1000, loss is 0.20512795epoch: 12 step: 1000, loss is 0.2589024epoch: 13 step: 1000, loss is 0.31454447epoch: 14 step: 1000, loss is 0.24145015epoch: 15 step: 1000, loss is 0.32082427epoch: 16 step: 1000, loss is 0.27023837epoch: 17 step: 1000, loss is 0.34484679epoch: 18 step: 1000, loss is 0.41191268epoch: 19 step: 1000, loss is 0.07990202epoch: 20 step: 1000, loss is 0.26586318评估测试# 使用测试集评估模型,打印总体准确率metric = model.eval(ds_test, dataset_sink_mode=False)print(metric)预测class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']#从测试集中取出一组样本,输入模型进行预测test_ = ds_test.create_dict_iterator()._get_next()#利用key值选出样本test = Tensor(test_['x'], mindspore.float32)predictions = model.predict(test)softmax = nn.Softmax()predictions = softmax(predictions)predictions = predictions.asnumpy()true_label = test_['y'].asnumpy()true_image = test_['x'].asnumpy()for i in range(15):    p_np = predictions[i, :]    pre_label = np.argmax(p_np)    print('第' + str(i) + '个sample预测结果:', class_names[pre_label], '   真实结果:', class_names[true_label[i]])对预测结果可视化# -------------------定义可视化函数--------------------------------# 输入预测结果序列,真实标签序列,以及图片序列# 目标是根据预测值对错,让其标签显示为红色或者蓝色。对:标签为蓝色;错:标签为红色def plot_image(predicted_label, true_label, img):    plt.grid(False)    plt.xticks([])    plt.yticks([])    # 显示对应图片    plt.imshow(img, cmap=plt.cm.binary)    # 显示预测结果的颜色,如果对上了是蓝色,否则为红色    if predicted_label == true_label:        color = 'blue'    else:        color = 'red'    # 显示对应标签的格式,样式    plt.xlabel('{},({})'.format(class_names[predicted_label],                                    class_names[true_label]), color=color)# 将预测的结果以柱状图形状显示蓝对红错def plot_value_array(predicted_label, true_label,predicted_array):    plt.grid(False)    plt.xticks([])    plt.yticks([])    this_plot = plt.bar(range(10), predicted_array, color='#777777')    plt.ylim([0, 1])    this_plot[predicted_label].set_color('red')    this_plot[true_label].set_color('blue')# 预测15个图像与标签,并展现出来num_rows = 5num_cols = 3num_images = num_rows * num_colsplt.figure(figsize=(2 * 2 * num_cols, 2 * num_rows))for i in range(num_images):    plt.subplot(num_rows, 2 * num_cols, 2 * i + 1)    pred_np_ = predictions[i, :]    predicted_label = np.argmax(pred_np_)    image_single = true_image[i, 0, ...]    plot_image(predicted_label, true_label[i], image_single)    plt.subplot(num_rows, 2 * num_cols, 2 * i + 2)    plot_value_array(predicted_label, true_label[i], pred_np_)plt.show()适配训练作业(可跳过)创建训练作业时,运行参数会通过脚本传参的方式输入给脚本代码,脚本必须解析传参才能在代码中使用相应参数。如data_url和train_url,分别对应数据存储路径(OBS路径)和训练输出路径(OBS路径)。脚本对传参进行解析后赋值到args变量里,在后续代码里可以使用。import argparseparser = argparse.ArgumentParser()parser.add_argument('--data_url', required=True, default=None, help='Location of data.')parser.add_argument('--train_url', required=True, default=None, help='Location of training outputs.')args, unknown = parser.parse_known_args()MindSpore暂时没有提供直接访问OBS数据的接口,需要通过ModelArts自带的moxing框架与OBS交互。将OBS桶中的数据拷贝至执行容器中,供MindSpore使用:import moxing# src_url形如's3://OBS/PATH',为OBS桶中数据集的路径,dst_url为执行容器中的路径moxing.file.copy_parallel(src_url=args.data_url, dst_url='Fashion-MNIST/')如需将训练输出(如模型Checkpoint)从执行容器拷贝至OBS,请参考:import moxing# src_url为执行容器中的路径,dst_url形如's3://OBS/PATH',目录若不存在则会新建moxing.file.copy_parallel(src_url='model_fashion', dst_url=args.train_url)   创建训练作业可以参考使用常用框架训练模型来创建并启动训练作业。打开ModelArts控制台-训练管理-训练作业,点击“创建”按钮进入训练作业配置页面,创建训练作业的参考配置:算法来源:常用框架->Ascend-Powered-Engine->MindSpore;代码目录:选择上述新建的OBS桶中的feedforward目录;启动文件:选择上述新建的OBS桶中的feedforward目录下的main.py;数据来源:数据存储位置->选择上述新建的OBS桶中的feedforward目录下的Fashion-MNIST目录;训练输出位置:选择上述新建的OBS桶中的feedforward目录并在其中创建model_fashion目录;作业日志路径:同训练输出位置;规格:Ascend:1*Ascend 910;其他均为默认;启动并查看训练过程:点击提交以开始训练;在训练作业列表里可以看到刚创建的训练作业,在训练作业页面可以看到版本管理;点击运行中的训练作业,在展开的窗口中可以查看作业配置信息,以及训练过程中的日志,日志会不断刷新,等训练作业完成后也可以下载日志到本地进行查看;参考上述代码梳理,在日志中找到对应的打印信息,检查实验是否成功;运行成功。实验小结本实验展示了如何使用MindSpore进行Fashion-MNIST数据集分类。首先训练前馈神经网络,然后使用训练后的前馈神经网络模型对Fashion-MNIST测试数据进行分类,从结果上分析准确率大于80%,即前馈神经网络学习到了Fashion-MNIST数据集分类。————————————————原文链接:https://blog.csdn.net/weixin_54227557/article/details/123533208
  • [基础知识] 【MindSpore易点通】深度学习系列-经典卷积神经网络
    上周小伙伴说我们卷积神经网络讲的太简单了,基础嘛,当然要先打好()。这不,更加复杂的卷积神经网络来了~经典CNN之LeNet手写字体识别模型LeNet5诞生于1994年,是最早的卷积神经网络之一。LeNet5利用卷积、参数共享、池化等操作提取特征,避免了大量的计算成本,最后使用全连接神经网络进行分类识别。 LeNet5的网络结构示意图LeNet5由7层CNN(不包含输入层)组成,图中输入的原始图像大小是32×32像素,卷积层:Ci;子采样层(pooling,池化):Si;全连接层:Fi。C1层(卷积层):该层使用了6个卷积核,每个卷积核的大小为5×5,可以得到6个特征图(feature map)。(1)特征图大小每个卷积核(5×5)与原始的输入图像(32×32)进行卷积,这样得到的特征图大小为(32-5+1)×(32-5+1)= 28×28这里有个小知识点:卷积核与输入图像按卷积核大小逐个区域进行匹配计算,匹配后原始输入图像的尺寸将变小,因为边缘部分卷积核无法越出界,只能匹配一次,匹配计算后的尺寸变为Cr×Cc=(Ir-Kr+1)×(Ic-Kc+1),其中Cr、Cc,Ir、Ic,Kr、Kc分别表示卷积后结果图像、输入图像以及卷积核的行列大小。(2)参数个数由于参数(权值)共享,对于同个卷积核每个神经元均使用相同的参数,因此,参数个数为(5×5+1)×6= 156,其中5×5为卷积核参数,1为偏置参数。(3)连接数卷积后的图像大小为28×28,因此每个特征图有28×28个神经元,每个卷积核参数为(5×5+1)×6,因此,该层的连接数为(5×5+1)×6×28×28=1223042、S2层(下采样层,也称池化层):(1)特征图大小这一层主要是做池化或者特征映射(特征降维),池化单元为2×2,因此,6个特征图的大小经池化后即变为14×14。由于池化单元之间没有重叠,在池化区域内进行聚合统计后得到新的特征值,因此经2×2池化后,每两行两列重新算出一个特征值出来,相当于图像大小减半,因此卷积后的28×28图像经2×2池化后就变为14×14。这一层的计算过程是:2×2 单元里的值相加,然后再乘以训练参数w,再加上一个偏置参数b(每一个特征图共享相同的w和b),然后取sigmoid值(S函数:0-1区间),作为对应的该单元的值。卷积操作与池化的示意图(2)参数个数S2层由于每个特征图都共享相同的w和b这两个参数,因此需要2×6=12个参数(3)连接数下采样之后的图像大小为14×14,因此S2层的每个特征图有14×14个神经元,每个池化单元连接数为2×2+1(1为偏置量),因此,该层的连接数为(2×2+1)×14×14×6 = 58803、C3层(卷积层):C3层有16个卷积核,卷积模板大小为5×5。(1)特征图大小与C1层的分析类似,C3层的特征图大小为(14-5+1)×(14-5+1)= 10×10(2)参数个数需要注意的是,C3与S2并不是全连接而是部分连接,有些是C3连接到S2三层、有些四层、甚至达到6层,通过这种方式提取更多特征,连接的规则如下表所示:例如第一列表示C3层的第0个特征图(feature map)只跟S2层的第0、1和2这三个feature maps相连接,计算过程为:用3个卷积模板分别与S2层的3个feature maps进行卷积,然后将卷积的结果相加求和,再加上一个偏置,再取sigmoid得出卷积后对应的feature map了。其它列也是类似(有些是3个卷积模板,有些是4个,有些是6个)。因此,C3层的参数数目为(5×5×3+1)×6 +(5×5×4+1)×9 +5×5×6+1 = 1516(3)连接数卷积后的特征图大小为10×10,参数数量为1516,因此连接数为1516×10×10= 151600S4(下采样层,也称池化层):(1)特征图大小与S2的分析类似,池化单元大小为2×2,因此,该层与C3一样共有16个特征图,每个特征图的大小为5×5。(2)参数数量与S2的计算类似,所需要参数个数为16×2 = 32(3)连接数连接数为(2×2+1)×5×5×16 = 2000C5层(卷积层):(1)特征图大小该层有120个卷积核,每个卷积核的大小仍为5×5,因此有120个特征图。由于S4层的大小为5×5,而该层的卷积核大小也是5×5,因此特征图大小为(5-5+1)×(5-5+1)= 1×1。这样该层就刚好变成了全连接,当然这里真的只是coincidence,如果原始输入的图像比较大,则该层就不是全连接了。(2)参数个数本层的参数数目为120×(5×5×16+1) = 48120(3)连接数由于该层的特征图大小刚好为1×1,因此连接数为48120×1×1=481206、F6层(全连接层):(1)特征图大小F6层有84个单元,由于输出层的对应的是一个7×12的比特图,如下图所示,-1表示白色,1表示黑色,这样每个符号的比特图的黑白色就对应于一个编码。该层有84个特征图,特征图大小与C5一样都是1×1,与C5层全连接。(2)参数个数由于是全连接,参数数量为(120+1)×84=10164。跟经典神经网络一样,F6层计算输入向量和权重向量之间的点积,再加上一个偏置,然后将其传递给sigmoid函数得出结果。(3)连接数由于是全连接,连接数与参数数量一样,也是10164。7、OUTPUT层(输出层):Output层也是全连接层,共有10个节点,分别代表数字0到9。如果第i个节点的值为0,则表示网络识别的结果是数字i。(1)特征图大小该层采用径向基函数(RBF)的网络连接方式,假设x是上一层的输入,y是RBF的输出,则RBF输出的计算方式是:上式中的Wij的值由i的比特图编码确定,i从0到9,j取值从0到7×12-1。RBF输出的值越接近于0,表示当前网络输入的识别结果与字符i越接近。(2)参数个数由于是全连接,参数个数为84×10=840(3)连接数由于是全连接,连接数与参数个数一样,也是840LeNet卷积层用来识别图像⾥的空间模式,例如线条和物体局部,池化层则⽤来降低卷积层对位置的敏感性,在交替使用卷积层和最大池化层后接全连接层来进⾏图像分类,展示了通过梯度下降训练卷积神经网络可以达到手写数字识别在当时最先进的结果。经典CNN之AlexNet第一个典型的CNN是LeNet5网络结构,但是第一个引起大家注意的网络却是AlexNet。AlexNet网络结构网络总共的层数为8层,5层卷积,3层全连接层。1、第一层:卷积层C1,输入为224×224×3的图像,卷积核的数量为96,卷积核的大小为11×11×3,步长stride 为4,pad = 0,表示不扩充边缘;卷积后的图形大小:wide = (224 + 2 * padding - kernel_size) / stride + 1 = 54height = (224 + 2 * padding - kernel_size) / stride + 1 = 54dimention = 96然后进行 (Local Response Normalized), 后面跟着池化pool_size = (3, 3), stride = 2, pad = 0,最终获得第一层卷积的feature map。2、第二层:卷积层C2, 输入为上一层卷积的feature map,卷积的个数为256个,卷积核的大小为:5×5×48,pad = 2,stride = 1,然后做 LRN,最后 max_pooling, pool_size = (3, 3), stride = 2。3、第三层:卷积层C3, 输入为第二层的输出,卷积核个数为384, kernel_size = (3 ×3×256),padding = 1,第三层没有做LRN和Pool。4、第四层:卷积层C4, 输入为第三层的输出,卷积核个数为384, kernel_size = (3×3), padding = 1, 和第三层一样,没有LRN和Pool。5、第五层:卷积层C5, 输入为第四层的输出,卷积核个数为256,kernel_size = (3×3×3), padding = 1。然后直接进行max_pooling, pool_size = (3, 3), stride = 2;6、第6,7,8层是全连接层,每一层的神经元的个数为4096,最终输出softmax为1000,然后全连接层中使用了RELU和Dropout。AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。首先成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。Relu函数:然后选择采用覆盖的池化操作。常规的池化层由于没有重叠,所以pool_size 和 stride一般是相等的,例如8×8的一个图像,如果池化层的尺寸是2×2,那么经过池化后的操作得到的图像是4×4,这种设置叫做不覆盖的池化操作。而如果 stride < pool_size, 那么就会产生覆盖的池化操作,这种有点类似于convolutional化的操作,在训练模型过程中,覆盖的池化层更不容易过拟合。同时,神经网络的一个比较严重的问题就是过拟合问题,AlexNet采用的数据扩充和Dropout的方法处理过拟合问题。对于某一层神经元,通过定义的概率来随机删除一些神经元,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新,下一次迭代中,重新随机删除一些神经元,直至训练结束。总结AlexNet和LeNet的设计理念非常相似,但也存在显著差异。首先,AlexNet比相对较小的LeNet5要深得多。AlexNet由八层组成:五个卷积层、两个全连接隐藏层和一个全连接输出层。其次,AlexNet使用ReLU而不是sigmoid作为其激活函数。AlexNet的更高层建立在底层表示的基础上,以表示更大的特征,如眼睛、鼻子、草叶等等。而更高的层可以检测整个物体,如人、飞机、狗或飞盘。最终的隐藏神经元可以学习图像的综合表示,从而使属于不同类别的数据易于区分。AlexNet首次证明了学习到的特征可以超越手工设计的特征,AlexNet在结果上要优于LeNet很多,特别是其在处理大规模数据方便的优势更是明显。AlexNet的问世也开启了深度学习在计算机视觉领域的大规模应用。一般我们可以将其看做浅层神经网络和深层神经网络的分界线。当然啦,经典的CNN还是有很多其他的网络的,比如VGG、GoogLeNet、ResNet等等,欢迎大伙儿一起学习使用呀!
  • [技术干货] 【论文分享】基于SqueezeNet卷积神经网络的车辆检测
    基于SqueezeNet卷积神经网络的车辆检测魏泽发1, 崔华21 长安大学教育技术与网络中心,陕西 西安 7100642 长安大学信息工程学院,陕西 西安 710064摘要在智能交通系统中,针对车辆目标检测算法可移植性不高、检测速度较慢等问题,提出了一种基于SqueezeNet卷积神经网络的车辆检测方法。通过融合SqueezeNet与SSD(single shot multibox detector)算法的车辆检测方法,在UA-DETRAC数据集上进行训练,实现了车辆目标的快速检测,提升了模型的可移植性,缩短了单帧检测时间。实验结果表明,所提模型在保证准确率的同时,模型单帧检测时间可达22.3 ms,模型大小为16.8 MB,相较于原SSD算法,模型大小减少了约8/9。关键词: 智能交通 ; 卷积神经网络 ; SqueezeNet ; 车辆检测1 引言随着智能交通系统的不断发展和完善,实现车辆的精准、快速检测成为智能交通系统中的关键。车辆检测是自动驾驶的重要组成部分,在减少甚至避免交通事故方面具有重要意义。同时,车辆检测可以为交通管理部门提供准确的数据支撑,在交通管制、拥堵检测和信号配时等方面有广泛应用。传统的车辆检测算法需要对图像进行预处理,然后对整幅图像进行滑动窗口遍历操作,通过初步判断车辆目标可能会出现的位置,人工设计车辆目标的某种特征,如常见的方向梯度直方图(HOG,histogram of oriented gradient)特征[1]、尺度不变特征变换(SIFT,scale-invariant feature transform)特征[2]、哈尔特征(Haar-link feature)[3]和加速稳健特征(SURF,speeded up robust feature)[4]等,最后将特征送入支持向量机(SVM,support vector machine)[5]或 Adaboost[6]分类器进行分类,完成检测任务。但是人工设计特征存在很大弊端,在设计过程中会过于依赖以往经验,且算法在陌生场景下的表现效果不好,检测算法的稳健性不强,极大地阻碍了检测算法的应用。随着深度学习在各个领域取得了较大突破,目标检测将面临新的发展机遇。深度学习目标检测算法在检测准确率上有巨大的提升,主要得益于卷积神经网络强大的特征提取能力。卷积神经网络可以自动提取目标中的关键特征信息,不需要人工设计和经验,只需要向网络中传递足够多的图像数据即可,因此,该算法具有更高的稳健性,更适应不同场景,在实际应用中具有较大优势。基于深度学习的目标检测算法主要包括两类,即one-stage方法和two-stage方法。其中,two-stage方法首先需要使用生成算法产生一系列候选框,然后在候选框上进行回归和分类操作,该方法的特点是检测准确率高、检测速度较慢。2014年,Girshick等[7]提出了R-CNN(region-CNN)目标检测算法,利用选择性搜索(selective search)[8]方法生成候选框,然后将候选框送入卷积神经网络提取特征,最后将特征输入 SVM 分类器进行回归运算。为了改善 two-stage 方法中存在的问题,研究人员提出了one-stage 方法,其主要思路是摒弃候选框生成过程,直接利用卷积神经网络在图像数据上进行卷积操作,然后在后续特征图上不断提取信息,最后从提取出的信息中取部分特征层完成最终的检测任务,该方法的检测速度较快,但是检测准确率较低。2016年,YOLO(you only look once)目标检测系列算法[9,10,11]很好地解决了算法的实时性问题,通过将检测和分类两个过程整合为一个过程,在每个特征单元上预测检测框的位置和类别,然后结合图像中的背景信息在整个图像特征上进行预测,虽然检测准确率下降了,但该算法为未来的研究工作提供了很好的思路和方向。SSD检测算法[12]很好地结合了R-CNN目标检测算法和YOLO目标检测系列算法的优势,继承了 R-CNN 算法的 anchor 机制和YOLO算法的回归思想,通过在多个尺度的特征图上生成不同长宽比的候选框,实现对各种尺寸目标的检测。相比于R-CNN目标检测算法和YOLO目标检测系列算法,SSD算法在各个领域中的应用更广泛。本文提出一种基于 SqueezeNet[13]与 SSD 算法融合的车辆目标检测算法,利用轻量级卷积神经网络SqueezeNet的特性,在保证同等检测准确率的同时,大幅度减少模型的参数量,且缩短了模型的单帧检测时间。这为将算法移植到如现场可编程逻辑门阵列(FPGA,field programmable gate array)这类移动开发板上提供了可能,也意味着服务器在同等时间内可以处理更多数据,大幅度提升了服务器的利用效率。2 结束语本文提出了一种基于 SqueezeNet 卷积神经网络的车辆目标检测算法,解决了在智能交通系统中关于车辆目标检测算法可移植性不高、检测速度较慢等问题,该算法通过将SqueezeNet与SSD算法融合,同时根据融合后的模型表现采取针对性改进方式,在保证模型检测准确率的同时,降低网络参数量,缩短模型的单帧检测时间,实现了对车辆目标的精准、快速检测,为模型的移植、开发提供了可能。因此,利用该技术的车辆目标检测算法可以应用于交通摄像头、车载相机等设备拍摄的场景,对自动驾驶以及交通管理部门工作效率的提升具有重要意义。The authors have declared that no competing interests exist.作者已声明无竞争性利益关系。3 原文链接http://www.infocomm-journal.com/wlw/article/2020/2096-3750/2096-3750-4-3-00120.shtml
  • [行业资讯] 特斯联取得智能物联网技术最新突破 多项研究成果入选国际顶刊
    新华财经北京5月12日电(记者吴丛司)记者12日获悉,特斯联近期在智能物联网技术(AIoT)领域取得最新科研成果,主要包括:优化智能物联网的能耗、延时与交互,算力网络的资源管理和任务调度,以及多智体反馈神经网络框架和应用。以上技术突破由特斯联前不久任命的首席科学家杨旸博士带队完成,该科研成果已被IEEE国际学术期刊和国际顶级会议收录。智能物联网的能耗、时延与交互由于蜂窝移动通信系统基础设施的封闭性,以及缺乏有效的现场测量工具,NB-IoT网络的许多重要指标一直以来都没有被深入地研究,例如:无线接入性能和能耗等。基于实际应用场景中完成的扎实研究工作,团队进一步给出了提升智能物联网技术规范和芯片设计方向的优化建议。在工业物联网的应用场景中,无线传感器设备无需铺设专门的有线网络,具有灵活性和可扩展等优势。但是,工业生产环境中复杂时变的无线衰落信道会导致无法预测的随机服务时延和时延抖动,严重降低了工业生产闭环反馈控制系统的性能和稳定性,这是无线传感器设备和无线通信技术应用于高精度、高可靠的自动化工业生产系统的最主要技术挑战。针对工业物联网应用场景中的严苛时延要求,杨旸博士及团队提出了在无线多径衰落信道中对时延分布进行塑形的新方法,通过对原始最优化函数的解耦分析,设计了“双层闭式反馈控制算法(TACAN)”,实现了时延分布方差的最小化,从而显著提高了工业物联网系统的可靠性和稳定性。算力网络的资源管理和任务调度在智能物联网的应用场景中,边缘计算资源的广泛部署可以及时有效地满足终端用户的低时延、强计算、快响应等服务需求。针对复杂多变的无线信道环境和多层次的移动通信网络架构,杨旸博士与团队提出了基于大规模多天线中继节点辅助的多层次算力系统,来增强复杂用户任务的计算能力和效率。多智体反馈神经网络框架和应用杨旸博士及团队提出了“多智体反馈神经网络”(MAFENN)框架,包含三个充分合作的智能体,其中的反馈智能体模拟了灵长类动物大脑中的信号反馈和错误纠正机制,有效提升了神经网络训练过程中的反馈学习能力、特征提取能力、噪声和干扰消除能力。
  • [调试调优] 使用Mindspore创建神经网络,construct函数的调用,以及无法调试的问题?
    【功能模块】MindsopreCell是MindSpore核心编程结构,是构建所有网络的基类,construct函数定义执行的过程,有一些语法限制。【操作步骤&问题现象】1、参照https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXA030+Self-paced/courseware/72548e98ce8649d793a5f3f5e225b948/c7dffdd1d89b4fc9912748d67c33e1bd/的例子2、class LENET5中函数construct用于创建神经网络,但在代码中看不到调用位置,这样我们无法从逻辑上理解程序的运行过程,该函数有一个参数x,我们如何给它提供实参,即使调试也看不到数据x的维度变化,很难看懂程序,这样无法结合程序理解数据流的变化。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [执行问题] 【MindSpore产品】【数据处理功能】加入数据增强之后,报出卷积输入类型不同的问题
    【功能模块】# 图像增强trans = [ transforms.RandomCrop((32, 32), (4, 4, 4, 4), fill_value=(255,255,255)), # 对图像进行自动裁剪 transforms.RandomHorizontalFlip(prob=0.5), # 对图像进行随机水平翻转 transforms.RandomRotation(degrees=20, fill_value=(255,255,255)), # transforms.HWC2CHW(), # (h, w, c)转换为(c, h, w)]# 下载解压并加载CIFAR-10训练数据集dataset_train = Cifar10(path=data_dir, split='train', batch_size=6, shuffle=True, resize=32, download=True, transform=trans)ds_train = dataset_train.run()model.train(num_epochs, ds_train, callbacks=[ValAccMonitor(model, ds_val, num_epochs)])【操作步骤&问题现象】Traceback (most recent call last):  File "F:/8.Learning Task/MindSpore/ResNet/train.py", line 49, in <module>    model.train(num_epochs, ds_train, callbacks=[ValAccMonitor(model, ds_val, num_epochs)])  File "D:\Anaconda1\lib\site-packages\mindspore\train\model.py", line 906, in train    sink_size=sink_size)  File "D:\Anaconda1\lib\site-packages\mindspore\train\model.py", line 87, in wrapper    func(self, *args, **kwargs)  File "D:\Anaconda1\lib\site-packages\mindspore\train\model.py", line 546, in _train    self._train_process(epoch, train_dataset, list_callback, cb_params)  File "D:\Anaconda1\lib\site-packages\mindspore\train\model.py", line 794, in _train_process    outputs = self._train_network(*next_element)  File "D:\Anaconda1\lib\site-packages\mindspore\nn\cell.py", line 586, in __call__    out = self.compile_and_run(*args)  File "D:\Anaconda1\lib\site-packages\mindspore\nn\cell.py", line 964, in compile_and_run    self.compile(*inputs)  File "D:\Anaconda1\lib\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 "D:\Anaconda1\lib\site-packages\mindspore\common\api.py", line 1006, in compile    result = self._graph_executor.compile(obj, args_list, phase, self._use_vm_mode())TypeError: mindspore\core\utils\check_convert_utils.cc:701 _CheckTypeSame] For primitive[Conv2D], the input type must be same.name:[w]:Ref[Tensor(F32)].name:[x]:Tensor[UInt8].WARNING: Logging before InitGoogleLogging() is written to STDERR[CRITICAL] CORE(22848,1,?):2022-6-6 12:59:53 [mindspore\core\utils\check_convert_utils.cc:701] _CheckTypeSame] For primitive[Conv2D], the input type must be same.name:[w]:Ref[Tensor(F32)].name:[x]:Tensor[UInt8].【日志信息】(可选,上传日志内容或者附件)不知该如何让input的类型相同,求大佬们能看看,给个办法,谢谢!!!总体代码如下:# train.pyfrom mindvision.dataset import Cifar10import mindspore.dataset.vision.c_transforms as transforms# 数据集根目录data_dir = "./datasets"# 图像增强# 图像增强trans = [ transforms.RandomCrop((32, 32), (4, 4, 4, 4), fill_value=(255,255,255)), # 对图像进行自动裁剪 transforms.RandomHorizontalFlip(prob=0.5), # 对图像进行随机水平翻转 transforms.RandomRotation(degrees=20, fill_value=(255,255,255)), # transforms.HWC2CHW(), # (h, w, c)转换为(c, h, w)]# 下载解压并加载CIFAR-10训练数据集dataset_train = Cifar10(path=data_dir, split='train', batch_size=6, shuffle=True, resize=32, download=True, transform=trans)ds_train = dataset_train.run()step_size = ds_train.get_dataset_size()# 下载解压并加载CIFAR-10测试数据集dataset_val = Cifar10(path=data_dir, split='test', batch_size=6, resize=32, download=True)ds_val = dataset_val.run()from mindspore.train import Modelfrom mindvision.engine.callback import ValAccMonitorfrom mindvision.classification.models.head import DenseHeadfrom mindspore import nnfrom ResNet.resnet import resnet50# 定义ResNet50网络network = resnet50(pretrained=True)# 全连接层输入层的大小in_channel = network.head.dense.in_channelshead = DenseHead(input_channel=in_channel, num_classes=10)# 重置全连接层network.head = head# 设置学习率num_epochs = 40lr = nn.cosine_decay_lr(min_lr=0.00001, max_lr=0.001, total_step=step_size * num_epochs, step_per_epoch=step_size, decay_epoch=num_epochs)# 定义优化器和损失函数opt = nn.Momentum(params=network.trainable_params(), learning_rate=lr, momentum=0.9)loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')# 实例化模型model = Model(network, loss, opt, metrics={"Accuracy": nn.Accuracy()})# 模型训练model.train(num_epochs, ds_train, callbacks=[ValAccMonitor(model, ds_val, num_epochs)])
  • [技术干货] 【论文分享】基于多特征时空图卷积网络的水运通航密度预测
    基于多特征时空图卷积网络的水运通航密度预测董伟, 张磊磊, 金子恒, 孙伟, 高俊波上海海事大学信息工程学院,上海 201306摘要面对港航信息化发展的需求,物联网技术助力我国水运交通感知网络的建设。水运交通大数据分析已成为交通领域研究者和实践者关注的热点。在水运交通中,各港口的通航密度具有非线性、时空相关性和异质性,对其进行精准预测将面临巨大的挑战。提出一种基于多特征时空图卷积网络(MFSTGCN,multi-feature spatio-temporal graph convolution network)的预测方法,解决了水运交通中通航密度的预测问题。MFSTGCN方法从通航量、船舶平均航速和船舶密度3个特征出发,利用空间维图卷积和时间维卷积操作有效捕获通航密度的时空相关性。在某航运平台采集的长江港口船舶自动识别系统(AIS,automatic identification system)数据集上进行实验,结果表明,MFSTGCN 方法的预测效果优于时空图卷积网络(STGCN,spatio-temporal graph convolution network)方法的预测效果。关键词: 水运交通 ; 通航密度 ; 时空相关性 ; 图卷积网络 ; 多特征1 引言随着港航管理信息化的快速发展,物联网技术被应用于我国内河通航管理。在“十二五”规划期间,交通运输部组织开展了长三角航道网及京杭大运河水系智能航运信息服务(船联网)应用示范工程[1]。在江苏、浙江和上海地区开展了物联网关键技术研究及攻关,建设内河水运交通感知网络,满足海量数据管理与区域化应用需求。在“十三五”规划期间,我国的智慧交通建设不断发展,水运领域交通大数据的服务水平和决策能力得到大幅度提高。此外,宝船网、船讯网、船队在线(HiFleet)等航运智慧平台的出现是水运交通基础数据和数据交换平台的建设成果,同时表明面向管理服务、决策与智能化应用的智慧水运研究正在不断发展。我国的内河水运交通以内河货运船舶为主,通航密度是指在单位时间内通过某一航道断面的船舶或船队数量,它是水运交通中评价港口和航道通航情况的重要交通量,是一种典型的时空数据,同时在时间维度和空间维度上呈现相关性和异质性。通航密度的预测将为内河码头和航道的规划与建设、船舶航行安全预警和内河码头选址等提供可靠的数据支撑,对智慧水运建设具有重要的现实意义。因此,通航密度预测问题是智慧水运交通的研究热点之一。2 交通量预测的相关研究针对水运通航密度的预测问题,本文提出一种基于深度学习的通航密度预测方法——MFSTGCN模型。从与水运通航密度相关的多个交通量出发,使用基于STGCN的深度学习模型处理水运路网中的空间结构特征和时空相关性,既可以有效融合数据的多特征,又可以有效捕获数据的时空特性。交通量预测是一类典型的时空数据预测问题,不同类别的交通数据内嵌于连续空间,并且随时间发生动态变化。特别地,学者们将深度学习方法用于解决时空数据预测问题,利用卷积神经网络(CNN,convolutional neural network)可以有效提取网格数据的空间特征和交通量的空间特征。从发展历程来看,交通量预测方法可分为基于统计的方法、传统机器学习方法和基于深度学习的方法3类。其中,基于统计的方法包括历史均值(HA,history average)法、自回归积分滑动平均(ARIMA,auto-regressive integrated moving average)法[2]、卡尔曼滤波等;传统机器学习方法包括K近邻算法[3]、支持向量机[4]和随机森林算法等。近年来,深度学习方法被用于解决交通量预测问题,成为水运交通领域研究的热点之一。如何对复杂的时空依赖关系建模将是交通量预测的重点,对于此类时空预测问题,研究工作主要从两个方面展开:1) 将问题视作时序预测类问题,将空间依赖看作是静态的,进而采用图卷积定义空间依赖关系;2) 将时间依赖看作是严格周期性的,以图卷积方法建模动态的空间依赖关系。长短期记忆(LSTM,long short-term memory)网络以其端到端建模、易于映入外生变量和自动特征抽取的特点,成为一种流行的时间序列建模框架。Ma 等[5]最先将 LSTM 网络应用于交通领域,借助道路交通的传感器数据预测未来的道路交通速度。之后,Ma等[6]提出了一种基于CNN的交通速度预测方法,将交通网络作为图像进行学习,并对大规模、全网范围内的交通速度进行预测。Liu等[7]考虑交通流数据的时间特征、空间特征和周期性特征,结合 CNN 和 LSTM 网络生成一个Conv-LSTM模块,用于提取交通流的时空特征,然后使用 Bi-LSTM(Bi-directional long short-term memory)技术提取交通流的周期特征。Yao等[8]提出了一种时空动态网络(STDN,spatial-temporal dynamic network),基于局部CNN门控机制对空间位置之间的动态相似性进行建模,并使用周期性注意力转移机制处理长期的周期性时间转移。Li等[9]借鉴循环神经网络(RNN,recurrent neural network)提出扩散卷积递归神经网络(DCRNN,diffusion convolutional recurrent neural network),在有向图上对交通流以扩散形式进行建模,同时集成了交通流中的空间与时间依赖。其他基于 RNN 的研究工作包括时空多图卷积神经网络(STMGCN,spatiotemporal multi-graph convolution network)[10]、时间图卷积神经网络(T-GCN,temporal graph convolution network)[11]、图注意力长短期记忆(GATLSTM,graph attention long short-term memory)网络[12]、基于特征的长短期记忆(FBLSTM,feature based long short-term memory)网络[13]、时空循环卷积网络(SRCN,spatiotemporal recurrent convolutional network)[14]。Yu等[15]提出了STGCN解决交通领域的时间序列预测问题,没有使用常规的CNN和RNN单元,而是将问题用图表示出来,并建立具有完整卷积结构的模型,使得模型训练速度更快、参数更少。STGCN 模型通过对多尺度交通网络的建模,有效地捕获了时空相关性。冯宁等[16]在STGCN模型的基础上,结合交通流量的周期特征,提出了多组件STGCN,通过3个组件分别建模流量数据的近期、日周期、周周期特性,并相继提出时空注意力机制图卷积网络(ASTGCN,attention spatial-temporal graph convolutional network)[17]和时空同步图卷积网络(STSGCN,spatial-temporal synchronous graph convolutional network)[18]。ASTGCN利用空间注意力机制捕捉不同位置之间的动态空间相关性;STSGCN以路网结构为基础,将多个近邻时间步的空间图连接起来,使用图卷积方法捕获复杂的局部时空相关性,同时针对时空网络序列的不同部分使用相互独立的组件对时空异质性进行建模。Diao等[19]针对空间依赖关系会随时间变化的问题提出图卷积神经网络(GCNN,graph convolution neural network),其核心是对拉普拉斯矩阵进行动态分析,将张量分解融入深度学习框架,将实时交通数据分解为一个稳定的、依赖于长期时空关系的全局分量和一个捕捉短期波动的局部分量。目前,交通量预测问题在道路交通领域已取得丰硕的研究成果,但是在目标主体、数据采集方式和领域特征方面,水运交通与道路交通有一定区别。1) 道路交通的主体是车辆,水运交通的主体是运输船舶,而不同类型的船舶在船舶长度和航速上存在较大差异,单个主体之间的差异将影响交通量预测的准确性。2) 在道路交通中,采集的交通量通常比较密集,交通量具有平稳性,并有明显的周期性和趋势性;水运交通受采集手段(如AIS发送频率与船速相关)、气象水文和通航状态(如停航、施工)等因素的影响大,交通量的误差大、时间间隔长、波动性大,表现出非平稳性和周期性不显著等特征。因此,水运交通的交通量预测更具挑战性。本文考虑水运交通的通航密度受船舶自身属性影响较大,不能准确反映交通规律。将通航密度、船舶的平均航速与船舶密度相关特征结合起来,建立多特征的通航密度预测模型,克服单个主体之间差异的难点,并可以在一定程度上解决水运交通中交通量预测的非平稳性和周期性不显著的问题。3 结束语本文从水运交通中交通量的特点出发,提出了一种基于MFSTGCN的水运通航密度预测方法。该方法结合图卷积和标准卷积构造时空卷积块来同时捕获交通数据的时空特性,并将通航密度、船舶密度和平均船速等多个特征应用于预测模型,解决了水运交通量非平稳、随机性强和周期性不显著等特征造成的预测准确率低的问题。通过内河水运船舶AIS数据集上的实验,验证了本文所提模型在预测准确率上优于其他对比模型,表明该模型在捕获时空特征及时空相关性方面具有一定优势。本文探索了图卷积网络在水运交通领域中的应用,对智能水运交通的发展具有重要的现实意义。The authors have declared that no competing interests exist.作者已声明无竞争性利益关系。4 原文链接http://www.infocomm-journal.com/wlw/article/2020/2096-3750/2096-3750-4-3-00078.shtml
  • [调试调优] mindspore情感分析时RNN网络搭建出错
    【功能模块】在参考https://gitee.com/mindspore/docs/blob/r1.1/tutorials/training/source_zh_cn/advanced_use/nlp_sentimentnet.md#%E4%BD%BF%E7%94%A8sentimentnet%E5%AE%9E%E7%8E%B0%E6%83%85%E6%84%9F%E5%88%86%E7%B1%BB进行情感分类实战训练时,想要把lstm网络改为rnn网络【操作步骤&问题现象】在查看mindsprore文档后发现nn.RNN和nn.LSTM的区别在于LSTM比RNN多一个参数c,把代码中的所有c删除后训练时出现函数参数个数不匹配的原因,但本人水平有限,没有找到具体哪里导致的这个原因。【截图信息】修改后代码如下:# 定义需要单层LSTM小算子堆叠的设备类型。 STACK_LSTM_DEVICE = ["CPU"] # 短期内存(h)和长期内存(c)初始化为0 # 定义lstm_default_state函数来初始化网络参数及网络状态。 def lstm_default_state(batch_size, hidden_size, num_layers, bidirectional): """初始化默认输入.""" num_directions = 2 if bidirectional else 1 h = Tensor(np.zeros((num_layers * num_directions, batch_size, hidden_size)).astype(np.float32)) #c = Tensor(np.zeros((num_layers * num_directions, batch_size, hidden_size)).astype(np.float32)) return h def stack_lstm_default_state(batch_size, hidden_size, num_layers, bidirectional): """init default input.""" num_directions = 2 if bidirectional else 1 h_list = [] for _ in range(num_layers): h_list.append(Tensor(np.zeros((num_directions, batch_size, hidden_size)).astype(np.float32))) #c_list.append(Tensor(np.zeros((num_directions, batch_size, hidden_size)).astype(np.float32))) h= tuple(h_list) return h# 针对不同的场景,自定义单层LSTM小算子堆叠,来实现多层LSTM大算子功能。 class StackRNN(nn.Cell): """ Stack multi-layers LSTM together. """ def __init__(self, input_size, hidden_size, num_layers=3, has_bias=True, batch_first=False, dropout=0.0, bidirectional=True): super(StackRNN, self).__init__() self.num_layers = num_layers self.batch_first = batch_first self.transpose = ops.Transpose() # direction number num_directions = 2 if bidirectional else 1 # input_size list input_size_list = [input_size] for i in range(num_layers - 1): input_size_list.append(hidden_size * num_directions) # layers layers = [] for i in range(num_layers): layers.append(nn.RNNCell(input_size=input_size_list[i], hidden_size=hidden_size, has_bias=has_bias, )) # weights weights = [] for i in range(num_layers): # weight size weight_size = (input_size_list[i] + hidden_size) * num_directions * hidden_size * 4 if has_bias: bias_size = num_directions * hidden_size * 4 weight_size = weight_size + bias_size # numpy weight stdv = 1 / math.sqrt(hidden_size) w_np = np.random.uniform(-stdv, stdv, (weight_size, 1, 1)).astype(np.float32) # lstm weight weights.append(Parameter(initializer(Tensor(w_np), w_np.shape), name="weight" + str(i))) # self.lstms = layers self.weight = ParameterTuple(tuple(weights)) print(1) def construct(self, x, hx): """construct""" print(2) if self.batch_first: x = self.transpose(x, (1, 0, 2)) # stack lstm h= hx hn= None for i in range(self.num_layers): x, hn, _, _ = self.lstms[i](x, h[i], self.weight[i]) if self.batch_first: x = self.transpose(x, (1, 0,2)) return x, (hn)其他部分未作修改【日志信息】(可选,上传日志内容或者附件)