• [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% 的准确率,这真是令人印象深刻!!结论我们已经看到了卷积神经网络的底层功能以及它如何从图像中提取特征。因此,我们可以得出结论,卷积神经网络是在计算机视觉应用中产生最先进结果的技术之一。
  • [行业资讯] 蓝牙物联网论坛开启,一起加入精准的蓝牙圈子
    时间:2022年8月18日 9:00—12:00地点:深圳会展中心(福田)主办单位:物联传媒、蓝牙技术联盟(SIG)论坛背景蓝牙技术作为主流的IoT连接技术之一,目前每年的市场出货量达到了数十亿的级别,而IoT则是蓝牙技术最重要的增长点。近些年来,为了适应物联网市场的需求,蓝牙技术也在不断的演进,比如BLE、蓝牙AoA/AoD定位,蓝牙mesh,和基于蓝牙技术的无源物联网等。每一次的技术革新,都是为应用做出更好的服务。蓝牙最新技术已经发展到什么程度,它将会使用哪些应用场景,又有哪些比较好的落地案例呢?基于对蓝牙技术的发展现状与创新应用的讨论,聚拢以蓝牙技术为核心的精准圈子,共谋产业发展之路。会议亮点1、蓝牙技术领军亮相2、物联传媒×蓝牙技术联盟打造蓝牙物联网最专业的圈子3、聚焦蓝牙技术最新的技术成果与应用成果4、20+同期论坛,800+同期展商,全方位了解AIoT产业论坛议程时间演讲主题09:00-09:35观众签到09:35-09:40主持开场与嘉宾介绍09:40-10:00蓝牙低功耗音频—LE Audio开创音频新纪元蓝牙技术联盟 亚太暨中国市场总监 李佳蓉10:00-10:20低功耗蓝牙在物联网与音频的应用发展与趋势瑞昱半导体 企划经理 杨咏菘10:20-10:40低功耗蓝牙SOC在位置服务和无线音频领域的创新应用方案泰凌微电子 业务拓展总监 梁佳毅10:40-11:00蓝牙mesh在行业场景应用与创新杭州涂鸦信息技术有限公司 智慧酒店&租住事业部总经理 应海平11:00-11:20蓝牙物联网创新解决方案北京百瑞互联技术有限公司 市场部经理 李丽11:20-11:40Bluetooth LE Audio带出无线音频新用例北欧半导体 华东及华北地区销售经理 吴迪11:40-12:00蓝牙寻向技术及其创新应用蓝色创源(北京)科技有限公司 产品总监 刘继达演讲嘉宾李佳蓉蓝牙技术联盟亚太暨中国市场总监嘉宾简介:李佳蓉女士拥有15年以上的科技市场及营销顾问资历,擅长营销策略拟定及品牌沟通推广,现职为蓝牙技术联盟(Bluetooth SIG)亚太区市场推广负责人,致力于提升蓝牙技术在亚太区的认知与采用率,并协助联盟成立以上海为基地的亚太专业团队。演讲摘要:近日,蓝牙技术联盟正式将这一功能更名为Auracast广播音频,Auracast广播音频使智能手机、笔记本电脑、电视和公共广播系统等音频发射器能够向附近不限数量的扬声器、耳机和助听器等蓝牙音频接收器广播音频,帮助人们实现分享音频内容、解除无声世界、体验最佳音频三大目标。杨咏菘瑞昱半导体 Realtek 企划经理嘉宾简介:杨咏菘现任瑞昱半导体蓝牙部门企划经理,负责蓝牙产品推广与重要品牌客户经营,在蓝牙与无线通讯领域拥有超过二十年的经验。担任过蓝牙软件开发、技术支持、产品规划与市场经营与销售等工作。演讲摘要:本次演讲主题将从芯片的角度出发,由浅入深涵盖物联网的各个领域与应用。从智能家居、穿戴式、蓝牙Mesh到医疗相关应用,以及蓝牙5.2低功耗音频的BIS、CIS的应用,进而把蓝牙音频带到更大的应用领域与场景。蓝牙音频分享技术能够突破以往应用,同时支持多个耳机设备连接到单个音讯串流等用例,并让用户享受更长的播放时间与更好的音频效果。梁佳毅泰凌微电子 业务拓展总监嘉宾简介:梁佳毅自2016年起至今工作于泰凌微电子(上海)股份有限公司,先后担任总经理技术助理及业务拓展和市场总监,负责业务拓展、产品及方案推广等工作。演讲摘要:本次论坛,泰凌将介绍支持包括位置服务和低功耗音频的最新蓝牙低功耗技术的产品和应用案例。随着近年来核心规范的不断迭代更新,蓝牙低功耗技术正在逐渐开拓全新的应用场景。规范5.1引入了AOA/AOD角度寻向功能,从而提供更精确的位置服务,满足资产追踪和室内定位导航等一系列应用需求。规范5.2引入了CIS/BIS和LC3 codec,从而支持蓝牙低功耗音频,这一项具有革命性的无线音频技术,为大规模的产品和场景创新奠定了基础。应海平杭州涂鸦信息技术有限公司 智能智慧酒店&租住事业部总经理嘉宾简介:应海平有超过7年的酒店行业从业经验,在智慧酒店行业标准化、系统化、规模化中拥有丰富实践经验。带领涂鸦酒店在国内累计实现超200+品牌渠道合作,累计完成智慧酒店客房超7万+间,在线IoT设备超50万+,每日约有超5万人次入住体验智能化服务。演讲摘要:本次分享将会带来涂鸦在蓝牙mesh方面的案例以及产品与方案特点。吴迪北欧半导体华东及华北地区销售经理嘉宾简介:吴迪毕业于浙江大学,拥有近10年的半导体以及物联网行业经验。他先后在美国与欧洲知名的半导体公司从事销售管理与市场拓展岗位,对物联网诸多应用有丰富的理解与认知。演讲摘要:Bluetooth LE Audio的出台为历久尝新的蓝牙无线音频注入新动力,除了万众期待的更高品质更有效率的音乐串流,它还为大众带来崭新的用例。音频广播让沿用多年的广播系统得到大幅的提升。辅听设备(hearing aids)标准更加开启了在医用级助听器和音乐耳机之间的新品类。北欧半导体在这次演讲会跟大家分享这些新用例的想法。刘继达蓝色创源(北京)科技有限公司 产品总监嘉宾简介:刘继达,现任蓝色创源(北京)科技有限公司产品总监,负责室内高精度定位和位置感知产品的规划设计,主持开发了多项基于UWB、蓝牙AOA等技术的精准位置感知产品,并参与多个业内标准的编制。演讲摘要:万物互联时代下,位置数据呈现出日益广阔的发展空间和商业价值,蓝牙作为有史以来最成功的无线技术之一,累计出货量已经突破400亿,蓝牙技术除了作为音频领域的领导者,也已经应用到了非通信用途,尤其是在高精度室内定位技术上,蓝牙寻向技术以其独有优势,提供了一系列可靠的位置服务。蓝色创源通过新一代蓝牙AOA及AOD技术,实现了厘米级定位精度,在多类场景上进行了创新应用探索,为千行百业的位置服务提供有效赋能。报名参会扫描下方二维码或点击阅读原文,提前预约会议
  • [干货汇总] 教你使用CANN将照片一键转换成卡通风格
    【摘要】 你喜欢动画片,或者说卡通,动漫吗?我是挺喜欢的。绚丽多彩的卡通世界从来没有缺失过吸引力。手冢治虫画笔下,那个可以上天入地的阿童木,在与邪恶世界的斗争中教会了我们勇敢与正义。漫画工匠宫崎骏用清新的水彩勾勒出自然的乡村景观,不染一丝现实的尘土。美艳而不可方物的世界令人神往。这次是将AnimeGAN部署到Ascend 310,从而实现对自己想要图片的一键转换为我们想看到的卡通风格。本文分享自华为云社区《【CANN训练营】CANN训练营_昇腾AI趣味应用实现AI趣味应用(上)随笔》,作者: Tianyi_Li。前言你喜欢动画片,或者说卡通,动漫吗?我是挺喜欢的。绚丽多彩的卡通世界从来没有缺失过吸引力。手冢治虫画笔下,那个可以上天入地的阿童木,在与邪恶世界的斗争中教会了我们勇敢与正义。漫画工匠宫崎骏用清新的水彩勾勒出自然的乡村景观,不染一丝现实的尘土。美艳而不可方物的世界令人神往。从《大闹天宫》到《大圣归来》,从《哪吒闹海》到《哪吒之魔童降世》,国漫的发展也不曾落下。恢弘的场景结合扣人心弦的故事,不仅有丰富视觉享受,同时也带来了一个心灵慰藉的港湾。但是卡通世界的诞生需要日积月累的积淀,在一笔笔线条和色彩的勾勒下才能生成动人的场景。而人工智能却带来了便捷的可能,现实世界的景色人物都可以一键定格为卡通风格。在尽可能保留显示细节的同时也保持着艺术的风格化。这次是将AnimeGAN部署到Ascend 310,从而实现对自己想要图片的一键转换为我们想看到的卡通风格。参考实现: https://github.com/TachibanaYoshino/AnimeGAN参考论文: https://link.springer.com/chapter/10.1007/978-981-15-5577-0_18最终效果图如下图所示,左图是输入,右图是输出:CANN介绍Ascend 310是硬件,我们是基于在硬件上构建的软件进行开发的,不会直接接触到底层的硬件,这里我们是基于CANN开发,CANN(Compute Architecture for Neural Networks)是华为公司针对AI场景推出的异构计算架构,通过提供多层次的编程接口,支持用户快速构建基于昇腾平台的AI应用和业务。包括:AscendCL:昇腾硬件的统一编程接口,包含了编程模型、硬件资源抽象、AI任务及内核管理、内存管理、模型和算子调用、媒体预处理接口、加速库调用等一系列功能,充分释放昇腾系统多样化算力,使能开发者快速开发AI应用。TBE算子开发工具:预置丰富API接口,支持用户自定义算子开发和自动化调优,缩短工期,节省人力。算子库:基于昇腾处理器,深度协同优化的高性能算子库这里我们主要用到的还Ascend CL,也就是ACL,不过为了更加方便开发,减少对原生接口的数据对齐的琐碎限制,我们使用官方推出的进一步封装的acllite,相当于做了进一步封装,更加方便开发者使用。acllite的主要接口如下图所示:具体的开发流程如下图所示,不仅适用于本应用,也适用于所有的开发应用。AnimeGAN网络概述AnimeGAN生成网络结构如下,以Generative Adversarial Networks(GAN)为基础,其架构包括一个生成器(Generator)用于将现实世界场景的照片转换为动漫图像,和一个判别器(Discriminator)区分图像是来自真实目标域还是来自生成器产生的输出,通过迭代训练两个网络(即生成器和判别器),由判别器提供的对抗性损失可以生成卡通化的结果。同时将生成器替换为自编码结构,使得生成器具有更强的生成能力。对于生成器,它希望生成样本尽可能符合真实样本的分布,而判别器则希望尽可能的区分真实样本与生成样本。具体来说,判别器将真实样本判断为正确,记为1;而将生成结果判断为错误,记为0。AnimeGAN 的生成器可以被认为是一个对称的编码器-解码器网络。主要由标准卷积、深度可分离卷积、反向残差块(IRB),上采样和下采样模块组成。 在生成器中,最后一个具有 1×1 卷积核的卷积层不使用归一化层,后面是 tanh 非线性激活函数。Conv-Block 由具有 3×3 卷积核的标准卷积、实例归一化层和 LRelu 激活函数组成。 DSConv 由具有 3 × 3 卷积核的深度可分离卷积、实例归一化层和 LRelu 激活函数组成。反转的残差块包含 Conv-Block、深度卷积、点卷积和实例归一化层。为了避免最大池化导致的特征信息丢失,使用Down-Conv作为下采样模块来降低特征图的分辨率。它包含步长为 2 的 DSConv 模块和步长为 1 的 DSConv 模块。在 Down-Conv 中,特征图的大小被调整为输入特征图大小的一半。 Down-Conv 模块的输出是步长为 2 的 DSConv 模块和步长为 1 的 DSConv 模块的输出之和。使用Up-Conv 用作上采样模块以提高特征图的分辨率。为了有效减少生成器的参数数量,网络中间使用了 8 个连续且相同的 IRB。与标准残差块 相比,IRB 可以显着减少网络的参数数量和计算工作量。生成器中使用的 IRB 包括具有 512 个内核的逐点卷积、具有 512 个内核的深度卷积和具有 256 个内核的逐点卷积。值得注意的是,最后一个卷积层没有使用激活函数。为了辅助生成器生成更好的结果,判别器需要判断输出图像是否是真实的卡通图片。因为判断是否真实依赖于图片本身特征,不需要抽取最高层的图片特征信息,所以可以设计成较为浅层的框架。首先对输入进行卷积核为3 x 3的卷积,然后紧接两个步长为2的卷积块来降低分辨率,并且提取重要的特征信息。最后使用一个3 × 3的卷积层得到最终提取的特征,再与真实标签进行损失计算。如果输入为256 × 256,则输出为64 × 64的PatchGAN形式。这里将Leaky ReLU的参数设置为0.2。开发过程介绍在拿到一个模型,我们希望做开发部署的时候,基本流程如下图所示:下面就来看看。分析预处理代码模型转换获取到原始模型后,需要使用昇腾CANN所提供的ATC模型转换工具,将第三方框架的模型转换为昇腾推理芯片所支持的om模型。模型转换步骤可参考昇腾文档中开发者文档->应用开发->将已有模型通过ATC工具转换(命令行)的指导进行转换。该样例通过不同分辨率的模型支持三种不同的输入图片,直接影响到生成图片的质量。以下为模型转换过程。三种不同的模型输入分辨率,分辨率越高,图片质量越好,但模型推理时间也就越长,咱们用的是第一种256 * 256,如下图所示:测试预处理代码编写如果你想用Python,也没问题,来看看Python版本的代码:使用DVPP对读入图片进行解码,并缩放至256 × 256分辨率,以符合网络输入大小;在模型转换时,使用AIPP功能,将unit8的数据转换为fp16格式,将0~255的数值归一化到-1~1,将BGR的图片格式转换为RGB格式。执行推理后处理如果使用Python接口开发,代码如下所示:后处理模块主要是对模型的推理结果进行格式变换,然后将变换结果反馈给用户。主要过程是先将-1~1的值映射回0~255,然后将256 × 256的转换结果缩放回原始图像的尺寸大小。最后进行色域转换将RGB格式的输出转换为BGR格式。结果展示整理流程图如下图所示:1.运行管理资源申请:用于初始化系统内部资源,固定的调用流程。2.加载模型文件并构建输出内存:从文件加载离线模型AnimeGAN.om数据,需要由用户自行管理模型运行的内存,根据内存中加载的模型获取模型的基本信息包含模型输入、输出数据的数据buffer大小;由模型的基本信息构建模型输出内存,为接下来的模型推理做好准备。3.数据预处理:对读入的图像数据进行预处理,然后构建模型的输入数据。4.模型推理:根据构建好的模型输入数据进行模型推理。5.解析推理结果:根据模型输出,解析模型的推理结果。使用OpenCV将转换后的卡通画数据转化为JPEG。(可选)优化加速结语图片卡通化或者说动漫化,还是挺有意思的,算是AI一个娱乐性较强的应用了,可以让每个普通人随时随地创造自己想要的卡通化Demo,很有意思,如果你想体验的话,可以到昇腾开发者社区的在线体验,上传自己的图片转换,如果你想要代码,那也没问题,在线体验提供了原始代码,可以免费下载使用,奉上在线实验链接:https://www.hiascend.com/zh/developer/mindx-sdk/cartoon/99172254img最后奉上不同分辨率下的运行结果对比:
  • [API使用] 求助大神,关于mindspore.ops.operation.Conv2d算子使用
    卷积层的实现算子是mindspore.ops.operation.Conv2d(out_channel,kernel_size, mode=1,pad_mode="valid",pad=0, stride=1,dilation=1,group=1,data_format="NCHW") 其中的mode参数用于指定不同的卷积计算方式:mode=0,math convolutionmode=1,cross-correlation convolutionmode=2,deconvolutionmode=3,depthwise convolution问题1:指定mode=3时报错,说mode必须为1。问题2:将限制代码注释掉,mode设置为3,但是卷积结果和mode为1时,完全一样。这里测试时使用了相同的输入数据,使用了相同的weight。 请教正式用法,目标是实现深度可分离卷积,谢谢! 
  • [其他] 递归神经网络(RNN)
    递归神经网络(RNN)RNN是最强大的模型之一,它使我们能够开发如分类、序列数据标注、生成文本序列(例如预测下一输入词的SwiftKey keyboard应用程序),以及将一个序列转换为另一个序列(比如从法语翻译成英语的语言翻译)等应用程序。大多数模型架构(如前馈神经网络)都没有利用数据的序列特性。例如,我们需要数据呈现出向量中每个样例的特征,如表示句子、段落或文档的所有token。前馈网络的设计只是为了一次性地查看所有特征并将它们映射到输出。让我们看一个文本示例,它显示了为什么顺序或序列特性对文本很重要。I had cleaned my car和I had my car cleaned两个英文句子,用同样的单词,但只有考虑单词的顺序时,它们才意味着不同的含义。人类通过从左到右阅读词序列来理解文本,并构建了可以理解文本数据中所有不同内容的强大模型。RNN的工作方式有些许类似,每次只查看文本中的一个词。RNN也是一种包含某特殊层的神经网络,它并不是一次处理所有数据而是通过循环来处理数据。由于RNN可以按顺序处理数据,因此可以使用不同长度的向量并生成不同长度的输出。图6.3提供了一些不同的表示形式。 图6.3图6.3来自关于RNN一个著名博客(http://karpathy.github.io/2015/05/21/rnn-effectiveness),其中作者Andrej Karpathy写明了如何使用Python从头开始构建RNN并将其用作序列生成器。6.4.1 通过示例了解RNN如何使用假设我们已经构建了一个RNN模型,并且尝试了解它提供的功能。当了解了RNN的作用后,就可以来探讨一下RNN内部发生了什么。让我们用Thor的评论作为RNN模型的输入。我们正在看的示例文本是the action scenes were top notch in this movie... .首先将第一个单词the传递给模型;该模型生成了状态向量和输出向量两种不同的向量。状态向量在处理评论中的下一个单词时传递给模型,并生成新的状态向量。我们只考虑在最后一个序列中生成的模型的输出。图6.4概括了这个过程。 图6.4图6.4演示了以下内容:RNN如何通过展开和图像来工作;状态如何以递归方式传递给同一模型。到现在为止,我们只是了解了RNN的功能,但并不知道它是如何工作的。在了解其工作原理之前来看一些代码片段,它会更详细地展示我们学到的东西。仍然将RNN视为黑盒:在上述代码中,hidden变量表示状态向量,有时也称为隐藏状态。到现在为止,我们应该知道了如何使用RNN。现在来看一下实现RNN的代码,并了解RNN内部发生的情况。以下代码包含RNN类:除了上述代码中的单词RNN之外,其他一切听起来与在前面章节中使用的非常类似,因为PyTorch隐藏了很多反向传播的复杂度。让我们通过init函数和forward函数来了解发生了什么。__init__函数初始化了两个线性层,一个用于计算输出,另一个用于计算状态或隐藏向量。forward函数将input向量和hidden向量组合在一起,并将其传入两个线性层,从而生成输出向量和隐藏状态。对于output层,我们应用log_softmax函数。initHidden函数有助于创建隐藏向量,而无需在第一次时声明调用RNN。让我们通过图6.5了解RNN类的作用。 图6.5图6.5说明了RNN的工作原理。关注 “ 人工智能技术与咨询” ,了解更多 资讯 !
  • [经验分享] 使用MindStudio进行MindInsight调优
    相对应的视频教学可以在B站进行观看:https://www.bilibili.com/video/BV1St4y1473r一、MindSpore和MindInsight环境搭建和配置介绍1 MindSpore简介昇思MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标。其中,易开发表现为API友好、调试难度低;高效执行包括计算效率、数据预处理效率和分布式训练效率;全场景则指框架同时支持云、边缘以及端侧场景。昇思MindSpore总体架构如下图所示:ModelZoo(模型库):ModelZoo提供可用的深度学习算法网络(ModelZoo 地址 )Extend(扩展库):昇思MindSpore的领域扩展库,支持拓展新领域场景,如GNN/深度概率编程/强化学习等,期待更多开发者来一起贡献和构建。Science(科学计算):MindScience是基于昇思MindSpore融合架构打造的科学计算行业套件,包含了业界领先的数据集、基础模型、预置高精度模型和前后处理工具,加速了科学行业应用开发(了解更多 )。Expression(全场景统一API):基于Python的前端表达与编程接口。同时未来计划陆续提供C/C++、华为自研编程语言前端-仓颉(目前还处于预研阶段)等第三方前端的对接工作,引入更多的第三方生态。Data(数据处理层):提供高效的数据处理、常用数据集加载等功能和编程接口,支持用户灵活的定义处理注册和pipeline并行优化。Compiler(AI编译器):图层的核心编译器,主要基于端云统一的MindIR实现三大功能,包括硬件无关的优化(类型推导、自动微分、表达式化简等)、硬件相关优化(自动并行、内存优化、图算融合、流水线执行等)、部署推理相关的优化(量化、剪枝等)。Runtime(全场景运行时):昇思MindSpore的运行时系统,包含云侧主机侧运行时系统、端侧以及更小IoT的轻量化运行时系统。Insight(可视化调试调优工具):昇思MindSpore的可视化调试调优工具,能够可视化地查看训练过程、优化模型性能、调试精度问题、解释推理结果(了解更多 )。Armour(安全增强库):面向企业级运用时,安全与隐私保护相关增强功能,如对抗鲁棒性、模型安全测试、差分隐私训练、隐私泄露风险评估、数据漂移检测等技术(了解更多 )。执行流程有了对昇思MindSpore总体架构的了解后,我们可以看看各个模块之间的整体配合关系,具体如图所示:昇思MindSpore作为全场景AI框架,所支持的有端(手机与IOT设备)、边(基站与路由设备)、云(服务器)场景的不同系列硬件,包括昇腾系列产品,英伟达NVIDIA系列产品,Arm系列的高通骁龙、华为麒麟的芯片等系列产品。左边蓝色方框的是MindSpore主体框架,主要提供神经网络在训练、验证相关的基础API功能,另外还会默认提供自动微分、自动并行等功能。蓝色方框往下是MindSpore Data模块,可以利用该模块进行数据预处理,包括数据采样、数据迭代、数据格式转换等不同的数据操作。在训练的过程会遇到很多调试调优的问题,因此有MindSpore Insight模块对loss曲线、算子执行情况、权重参数变量等调试调优相关的数据进行可视化,方便用户在训练过程中进行调试调优。设计理念• 支持全场景协同昇思MindSpore是源于全产业的最佳实践,向数据科学家和算法工程师提供了统一的模型训练、推理和导出等接口,支持端、边、云等不同场景下的灵活部署,推动深度学习和科学计算等领域繁荣发展。• 提供Python编程范式,简化AI编程昇思MindSpore提供了Python编程范式,用户使用Python原生控制逻辑即可构建复杂的神经网络模型,AI编程变得简单。• 提供动态图和静态图统一的编码方式目前主流的深度学习框架的执行模式有两种,分别为静态图模式和动态图模式。静态图模式拥有较高的训练性能,但难以调试。动态图模式相较于静态图模式虽然易于调试,但难以高效执行。 昇思MindSpore提供了动态图和静态图统一的编码方式,大大增加了静态图和动态图的可兼容性,用户无需开发多套代码,仅变更一行代码便可切换动态图/静态图模式,例如设置context.set_context(mode=context.PYNATIVE_MODE)切换成动态图模式,设置context.set_context(mode=context.GRAPH_MODE)即可切换成静态图模式,用户可拥有更轻松的开发调试及性能体验。• 采用函数式可微分编程架构,使用户聚焦于模型算法的数学原生表达神经网络模型通常基于梯度下降算法进行训练,但手动求导过程复杂,结果容易出错。昇思MindSpore的基于源码转换(Source Code Transformation,SCT)的自动微分(Automatic Differentiation)机制采用函数式可微分编程架构,在接口层提供Python编程接口,包括控制流的表达。用户可聚焦于模型算法的数学原生表达,无需手动进行求导。• 统一单机和分布式训练的编码方式随着神经网络模型和数据集的规模不断增加,分布式并行训练成为了神经网络训练的常见做法,但分布式并行训练的策略选择和编写十分复杂,这严重制约着深度学习模型的训练效率,阻碍深度学习的发展。MindSpore统一了单机和分布式训练的编码方式,开发者无需编写复杂的分布式策略,在单机代码中添加少量代码即可实现分布式训练,例如设置context.set_auto_parallel_context(parallel_mode=ParallelMode.AUTO_PARALLEL)便可自动建立代价模型,为用户选择一种较优的并行模式,提高神经网络训练效率,大大降低了AI开发门槛,使用户能够快速实现模型思路。层次结构昇思MindSpore向用户提供了3个不同层次的API,支撑用户进行网络构建、整图执行、子图执行以及单算子执行,从低到高分别为Low-Level Python API、Medium-Level Python API以及High-Level Python API。• High-Level Python API第一层为高阶API,其在中阶API的基础上又提供了训练推理的管理、混合精度训练、调试调优等高级接口,方便用户控制整网的执行流程和实现神经网络的训练推理及调优。例如用户使用Model接口,指定要训练的神经网络模型和相关的训练设置,对神经网络模型进行训练,通过Profiler接口调试神经网络性能。• Medium-Level Python API第二层为中阶API,其封装了低阶API,提供网络层、优化器、损失函数等模块,用户可通过中阶API灵活构建神经网络和控制执行流程,快速实现模型算法逻辑。例如用户可调用Cell接口构建神经网络模型和计算逻辑,通过使用Loss模块和Optimizer接口为神经网络模型添加损失函数和优化方式,利用Dataset模块对数据进行处理以供模型的训练和推导使用。• Low-Level Python API第三层为低阶API,主要包括张量定义、基础算子、自动微分等模块,用户可使用低阶API轻松实现张量定义和求导计算。例如用户可通过Tensor接口自定义张量,使用ops.composite模块下的GradOperation算子计算函数在指定处的导数。2 MindInsight简介MindInsight是昇思MindSpore的可视化调试调优工具。利用MindInsight,您可以可视化地查看训练过程、优化模型性能、调试精度问题、解释推理结果。您还可以通过MindInsight提供的命令行方便地搜索超参,迁移模型。在MindInsight的帮助下,您可以更轻松地获得满意的模型精度和性能。MindInsight包括以下内容:• 训练过程可视 (收集 Summary 数据、查看训练看板 )• 训练溯源及对比 • 性能调优 • 精度调试 • 超参调优 • 模型迁移 3 环境安装配置3.1 MindSpore环境安装配置选择适合自己的环境条件后,获取命令并按照指南进行安装,或使用云平台创建和部署模型,安装细节参见链接:https://www.mindspore.cn/install 验证是否安装成功方法一:python -c "import mindspore;mindspore.run_check()"如果输出:MindSpore version: 版本号The result of multiplication calculation is correct, MindSpore has been installed successfully!说明MindSpore安装成功了。方法二:import numpy as npfrom mindspore import Tensorimport mindspore.ops as opsimport mindspore.context as contextcontext.set_context(device_target="Ascend")x = Tensor(np.ones([1,3,3,4]).astype(np.float32))y = Tensor(np.ones([1,3,3,4]).astype(np.float32))print(ops.add(x, y))如果输出:[[[[2. 2. 2. 2.][2. 2. 2. 2.][2. 2. 2. 2.]][[2. 2. 2. 2.][2. 2. 2. 2.][2. 2. 2. 2.]][[2. 2. 2. 2.][2. 2. 2. 2.][2. 2. 2. 2.]]]]说明MindSpore安装成功了。升级MindSpore版本当需要升级MindSpore版本时,可执行如下命令:pip install --upgrade mindspore-ascend=={version}其中:• 升级到rc版本时,需要手动指定{version}为rc版本号,例如1.6.0rc1;如果升级到正式版本,=={version}字段可以缺省。3.2 MindInsight环境安装配置确认系统环境信息• 硬件平台支持Ascend、GPU和CPU。• 确认安装Python 3.7.5或3.9.0版本。如果未安装或者已安装其他版本的Python,可以选择下载并安装:– Python 3.7.5版本 64位,下载地址:官网 或华为云 。– Python 3.9.0版本 64位,下载地址:官网 或华为云 。• MindInsight与MindSpore的版本需保持一致。• 若采用源码编译安装,还需确认安装以下依赖。– 确认安装node.js 10.19.0及以上版本。– 确认安装wheel 0.32.0及以上版本。• 其他依赖参见requirements.txt 。可以采用pip安装,源码编译安装和Docker安装三种方式。pip安装安装PyPI上的版本:pip install mindinsight=={version}安装自定义版本:pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/{version}/MindInsight/any/mindinsight-{version}-py3-none-any.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple其中:• 当环境中的MindSpore不是最新版本时,需要手动指定{version}为当前环境中MindSpore版本号。注:非root用户需要在命令中加入“--user”参数。源码编译安装从代码仓下载源码git clone https://gitee.com/mindspore/mindinsight.git -b r1.7编译安装MindInsight可选择以下任意一种安装方式:1.在源码根目录下执行如下命令。cd mindinsightpip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simplepython setup.py install2.构建whl包进行安装进入源码的根目录,先执行build目录下的MindInsight编译脚本,再执行命令安装output目录下生成的whl包。cd mindinsightbash build/build.shpip install output/mindinsight-{version}-py3-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simpleDocker安装MindSpore的镜像包含MindInsight功能,请参考官网安装指导 。验证是否成功安装执行如下命令:mindinsight start如果出现下列提示,说明安装成功:Web address: http://127.0.0.1:8080service start state: success二、MindStudio简介和安装1 MindStudio简介MindStudio提供在AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助您在一个工具上就能高效便捷地完成AI应用开发。MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。功能简介• 针对安装与部署,MindStudio提供多种部署方式,支持多种主流操作系统,为开发者提供最大便利。• 针对网络模型的开发,MindStudio支持TensorFlow、Pytorch、MindSpore框架的模型训练,支持多种主流框架的模型转换。集成了训练可视化、脚本转换、模型转换、精度比对等工具,提升了网络模型移植、分析和优化的效率。• 针对算子开发,MindStudio提供包含UT测试、ST测试、TIK算子调试等的全套算子开发流程。支持TensorFlow、PyTorch、MindSpore等多种主流框架的TBE和AI CPU自定义算子开发。• 针对应用开发,MindStudio集成了Profiling性能调优、编译器、MindX SDK的应用开发、可视化pipeline业务流编排等工具,为开发者提供了图形化的集成开发环境,通过MindStudio能够进行工程管理、编译、调试、性能分析等全流程开发,能够很大程度提高开发效率。功能框架MindStudio功能框架如图所示,目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具等多种工具。工具功能MindStudio工具中的主要几个功能特性如下:• 工程管理:为开发人员提供创建工程、打开工程、关闭工程、删除工程、新增工程文件目录和属性设置等功能。• SSH管理:为开发人员提供新增SSH连接、删除SSH连接、修改SSH连接、加密SSH密码和修改SSH密码保存方式等功能。• 应用开发:针对业务流程开发人员,MindStudio工具提供基于AscendCL(Ascend Computing Language)和集成MindX SDK的应用开发编程方式,编程后的编译、运行、结果显示等一站式服务让流程开发更加智能化,可以让开发者快速上手。• 自定义算子开发:提供了基于TBE和AI CPU的算子编程开发的集成开发环境,让不同平台下的算子移植更加便捷,适配昇腾AI处理器的速度更快。• 离线模型转换:训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。• 日志管理:MindStudio为昇腾AI处理器提供了覆盖全系统的日志收集与日志分析解决方案,提升运行时算法问题的定位效率。提供了统一形式的跨平台日志可视化分析能力及运行时诊断能力,提升日志分析系统的易用性。• 性能分析:MindStudio以图形界面呈现方式,实现针对主机和设备上多节点、多模块异构体系的高效、易用、可灵活扩展的系统化性能分析,以及针对昇腾AI处理器的性能和功耗的同步分析,满足算法优化对系统性能分析的需求。• 设备管理:MindStudio提供设备管理工具,实现对连接到主机上的设备的管理功能。• 精度比对:可以用来比对自有模型算子的运算结果与Caffe、TensorFlow、ONNX标准算子的运算结果,以便用来确认神经网络运算误差发生的原因。• 开发工具包的安装与管理:为开发者提供基于昇腾AI处理器的相关算法开发套件包Ascend-cann-toolkit,旨在帮助开发者进行快速、高效的人工智能算法开发。开发者可以将开发套件包安装到MindStudio上,使用MindStudio进行快速开发。Ascend-cann-toolkit包含了基于昇腾AI处理器开发依赖的头文件和库文件、编译工具链、调优工具等。2 MindStudio安装2.1 安装Python依赖(1)官方网站下载安装安装 Python3.7.5 到Windows本地。(2)设置环境变量。(3)“Win + R”快捷键打开系统命令行,输入“Python -V”,显示Python版本号表示安装成功。(4)安装Python3相关依赖。pip install xlrd==1.2.0pip install absl-pypip install numpypip install requests(5)如若返回如下信息,则表示安装成功。Successfully installed xlrd-1.2.0Successfully installed absl-py-0.12.0 six-1.15.0Successfully installed numpy-1.20.1Successfully installed requests-2.27.1更多安装细节请参考:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000022.html 2.2 安装MinGW依赖(1)根据电脑配置,下载适合的(下载参考地址 ),例如64位可以选择x86_64-posix-seh。(2)解压MinGW安装包到自定义路径。(3)在Windows 10操作系统的“控制面板 > 系统和安全 > 系统”中选择“高级系统设置”,如图所示。(4)打开系统命令行,输入gcc -v命令。若显示版本号表示安装成功。更多安装细节请参考:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000022.html 2.3 安装Java依赖(1)要求Java版本为11,参考下载地址 。(2)下载后安装到本地,设置Java环境变量。(3)打开系统命令,输入java --version,如显示Java版本信息,则表示安装成功。2.4 安装Cmake以msi格式软件包为例,安装步骤如下(下载参考地址 ),你也可以登录CMake 官网 下载合适的版本(1)单击快捷键“win+R”,输入cmd,单击快捷键“Ctrl+Shift+Enter”,进入管理员权限命令提示符。若弹出“用户帐户控制”提示窗口,单击“是”。(2)执行以下命令,安装软件包:msiexec /package {path}\{name}.msi例如:msiexec /package D:\cmake-3.22.3-win64-x64.msi(3)根据安装向导进行安装。更多安装细节请参考:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000022.html 2.5 安装MindStudio(1)MindStudio官网为我们提供两种安装方式。大家可以选择.zip文件,也可以选择.exe文件。此处我选择下载.zip文件。(2)下载好后直接解压到任意目录。解压后目录结构如图所示。(3)点击“bin”目录,然后双击目录下的“MindStudio64.exe”应用程序,运行MindStudio。 详细安装指导请参阅:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000021.html 三、使用MindStudio创建训练工程和运行脚本1 导入模型代码创建训练工程(1) 启动MindStudio首次启动MindStudio会进入如下欢迎界面,大家按需选择新建项目或打开本地项目,在这里,我点击 Open 按钮打开本地现存项目(https://gitee.com/mindspore/models/tree/master/official/recommend/ncf )。(2) 选择项目所在位置,添加 ncf 项目,点击 OK确定。 (3) 项目结构如图所示。2 配置远程环境2.1 连接远程服务器(1) 点击 Tools -> Deployment -> Configuration,配置远程连接服务器。(2) 选中左侧 Deployment 选项卡,点击左上角加号,输入自定义远程连接名称。(3) 输入服务器 IP 地址、端口号、用户名及密码,建议勾选 Save password 保存密码,测试可以成功连接后,点击OK确定。(4) 点击 Mappings 配置本地到服务器的文件路径映射。Local Path 填入本地项目路径,Deployment Path 选中远程服务器的项目路径,这两个文件夹名称不必完全相同。Excluded Paths(非必需)为配置忽略路径,表示忽略的项目文件不会上传到远程服务器。配置完成后,点击 OK 确定。 2.2 设置CANN(1) 点击 File -> Settings,进入设置。(2) 在左侧菜单依次选中 Appearance & Behavior -> System Settings -> CANN, 进入 CANN 配置选项卡中,设置远程服务器CANN路径。2.3 配置远程SDK(1) 点击 File -> Projects Structure 进入项目设置。(2) 在左侧菜单中选择 SDKs,点击左上角加号,选择 Add Python SDK... 进行SDK配置。(3) 在弹出的选项卡中选择 SSH Interpreter,在Deploy中选择远程连接名称,等待 IDE 自动检测可用的Interpreter。(4) 自动检测远程的SDK并显示如下,可以对其进行手动修改,我将 SDK 名称更改为 msp1.7 以便区分。(5) 在 Project 中设置刚才配置的远程SDK msp1.7。3 运行训练脚本3.1 安装项目依赖(1) 点击 Tools -> Start SSH session 打开远程服务器终端。(2) 远程服务器终端显示在 IDE 下方控制台处,输入 pip list 检查所需依赖是否已安装。(3) 菜单栏中点击 Ascend -> Convert To Ascend Project,将当前项目转换为昇腾项目。(4) 在弹出的对话框中选择转换的类型和框架,此处选择 Ascend Training 和 MindSpore 框架,点击 OK 确定。3.2 数据集下载和处理(1)NCF模型介绍NCF 是用于协同过滤推荐的通用框架,其中神经网络架构用于对用户交互进行建模。与传统模型不同,NCF 不诉诸矩阵分解 (MF),其对用户和项目的潜在特征进行内积。它用可以从数据中学习任意函数的多层感知器代替积。详见:https://gitee.com/mindspore/models/tree/master/official/recommend/ncf (2)展开src目录,右击 movielens.py,配置运行参数。(3)配置运行参数,其中 Script path 设置为运行文件,Parameters 中设置参数,Python interpreter 选择前文配置的远程服务器中的 SDK,点击 OK 确定。(4) 点击工具栏中的运行按钮,等待 ml-1m 数据集下载和预处理,大家可以在控制台输出查看当前程序运行的实时日志。如果数据处理结束,会在控制台输出正常退出。(5) 当运行程序后产生新的文件时,需要本地同步更新。建议大家点击Tools -> Deployment -> Automatic Upload 开启本地与服务器文件自动同步的功能。(6)开启自动同步后,更新过程如图所示:3.3 训练项目(1)如图所示,点击Edit Configuration来编辑配置(2)设置训练参数,此处设置了训练20个epoch,batch_size为256,输出保存在 ./output文件夹中,checkpoint保存在 ./nfc.ckpt 文件夹中,点击 OK 确定。(3)点击运行,项目开始进行训练。(4)在控制台中查看训练过程中实时打印的日志。四、MindInsight训练可视化及精度调优指南1 准备训练脚本(1)在train.py中,导入SummaryCollector。from mindspore.train.callback import SummaryCollector(2)在train.py代码中,实例化 SummaryCollector,并添加到callbacks中。# Init summary_collectorsummary_collector = SummaryCollector(summary_dir="./summary_dir")model.train(epochs,ds_train,callbacks=[TimeMonitor(ds_train.get_dataset_size()),callback, ckpoint_cb, summary_collector],dataset_sink_mode=False)(3)增加如上代码后,须重新训练模型,收集的数据存放于 ./summary_dir 中。2 MindInsight训练可视化配置(1)在工具栏选择 Ascend -> MindInsight 打开 MindInsight 管理界面。(2) MindInsight 管理界面可显示并管理多个 MindInsight训练可视化工程。MindInsight 管理界面相关属性说明如下图所示,点击Enable按钮,配置MindInsight组件相关参数。(3)在弹出的选项卡中,配置MindInsight组件相关参数,其中 Summary Base Dir 填入代码中设置的目录,WorkSpace 可以在 SSH 终端中输入 mindinsight start 查看,Port为端口号。(4)单击 OK 完成 MindInsight 组件相关参数配置,出现如图所示界面,说明配置成功。(5)点击 View 按钮即可跳转 MindInsight 界面。3 查看MindInsight训练看板及精度调优指南代码是精度问题的重要源头,超参问题、模型结构问题、数据问题、算法设计和实现问题会体现在脚本中,而我们使用的MindInsight生态工具可以将脚本中的各类问题以生动的可视化数据呈现给开发者,下面我们开始探究如何使用MindInsight进行精度调优。(1)进入训练列表后,我们可以点击右上角的按钮选择开启/关闭自动刷新看板信息和设置刷新频率,以及切换语言和主题。(2)点击“训练看板”后,可以看见训练时的各类可视化数据。主要包括损失函数、训练参数、训练数据以及网络计算图等。(3)点击 “参数详情” ,检查超参。MindInsight可以辅助用户对超参做检查,大多数情况下,SummaryCollector会自动记录常见超参,大家可以通过MindInsight的训练参数详情功能和溯源分析功能查看超参。结合MindInsight模型溯源分析模块和脚本中的代码,可以确认超参的取值,识别明显不合理的超参。如果有标杆脚本,建议同标杆脚本一一比对超参取值,如果有默认参数值,则默认值也应一并比对,以避免不同框架的参数默认值不同导致精度下降或者训练错误。根据我们的经验,超参问题主要体现为几个常见的超参取值不合理,例如:①学习率过大导致loss震荡难收敛,学习率过小导致训练不充分,学习率带来的影响可以直观地从loss曲线观察到;②loss_scale参数不合理,有可能导致loss为nan或loss迟迟不收敛;③权重初始化参数不合理等。参数详情可以显示常见的超参数。如下图所示:(4)点击 “参数分布图”,可以查看网络可训练参数随着迭代次数增加而产生的分布变化情况。大多数情况下,SummaryCollector会自动记录模型参数变化情况(默认记录5个参数),可以通过MindInsight的参数分布图模块查看。如果想要记录更多参数的参数分布图,请参考SummaryCollector 的histogram_regular参数,或参考HistogramSummary 算子。(5)点击“计算图”,检查模型结构。在模型结构方面,常见的问题有:①算子使用错误(使用的算子不适用于目标场景,如应该使用浮点除,错误地使用了整数除)。②权重共享错误(共享了不应共享的权重)。③权重冻结错误(冻结了不应冻结的权重)。④节点连接错误(应该连接到计算图中的block未连接)。⑤loss函数错误。⑥优化器算法错误(如果自行实现了优化器)等。MindInsight可以辅助用户对模型结构进行检查。大多数情况下,SummaryCollector会自动记录计算图,点击 “计算图”,可以直观地看到各个网络节点的关系,如下图所示:图中左侧为直观的计算图,右侧为各节点的树状结构图,点击相应的节点可以将其展开或折叠,方便用户查看。(6)点击“标量信息”,检查loss曲线。大多数精度问题会在网络训练过程中发现,并且可以直观地体现在损失函数的图表中,我们总结了一些可以体现在损失函数异常的常见问题:①权重问题(例如权重不更新、权重更新过大、权重值过大/过小、权重冻结不准确、权重共享设置有误);②激活值问题(激活值饱和或过弱,例如Sigmoid的输出接近1,Relu的输出全为0);③梯度问题(例如梯度消失、梯度爆炸);④训练epoch不足(loss还有继续下降的趋势);⑤算子计算结果存在NAN、INF等。如下图,我们可以查看详细的损失函数信息,并且面板设置有开启/关闭Loss曲线全屏等功能,在这里可以直观地看到损失函数的收敛趋势以及波动幅度。五、MindInsight训练耗时统计及性能调优指南1 准备训练脚本(1) 在train.py中导入Profiler。from mindspore.profiler import Profiler(2)收集profiler数据并分析。profiler = Profiler(output_path='./profiler_data')profiler.analyse()(3)再次训练项目。此处仅仅作为模型性能调优,可以适当将训练总分步数调小(例如两个step,数据经过整个计算图即可得到算子耗时)。2 MindInsight调优配置(1)更改MindInsight配置参数,与训练可视化的操作相似,这里的 Summary Base Dir 填入代码里设置的参数。(2)单击 OK 完成 MindInsight 组件相关参数配置,出现如图所示界面,说明配置成功。(3)点击 View 按钮即可跳转 MindInsight 界面。3 查看MindInsight性能看板及性能调优指南(1)右上角可以选择开启/关闭自动刷新看板信息和刷新频率,以及切换语言和主题。点击 “性能分析”。(2)进入性能分析看板后,可以看见有关训练耗时的各类数据图表。(3)点击“算子耗时统计排名”,可以查看各个算子的执行时间进行统计展示(包括AICORE、AICPU、HOSTCPU算子)。在右上角可以选择饼图/柱状图展示各算子类别的时间占比,每个算子类别的执行时间会统计属于该类别的算子执行时间总和。统计前20个占比时间最长的算子类别,展示其时间所占的百分比以及具体的执行时间(毫秒),我们可以选择算子耗时排名靠前的算子进行性能优化,这样有更大的优化空间。(4)点击“迭代轨迹”,查看每次迭代中各阶段的耗时,确定性能瓶颈点在哪个阶段,然后再针对该阶段进行详细分析。下面简单解释一下迭代轨迹中的三个阶段:• 迭代间隙:该阶段反映的是每个迭代开始时等待训练数据的时间。如果该阶段耗占比较高,说明数据处理的速度跟不上训练的速度。• 前反向计算:该阶段主要执行网络中的前向及反向算子,承载了一个迭代主要的计算工作。如果该阶段耗占比较高,较为合理。• 迭代拖尾:该阶段主要包含参数更新等操作,在多卡场景下还包括集合通信等操作。如果该阶段耗占比较高,可能是集合通信耗时比较长。(5)进入“迭代轨迹”面板查看迭代轨迹详情。当我们确定性能瓶颈点在哪个阶段时,就可以更有针对性地进行性能优化。此处我们总结了三个阶段时间异常的原因分析及解决方案:• 针对迭代间隙过长的问题:理想情况下,某个迭代开始前向训练时,其所需要的训练数据已经在Host侧完成了加载及增强并发送到了Device侧,反映到迭代间隙耗时通常在1毫秒内,否则就会由于等待训练数据而造成芯片算力的浪费。迭代间隙耗时长,说明该迭代开始前向计算时等待了较长的时间后训练数据才发送到了Device侧。用户需要到“数据准备”页面进一步确认是数据增强还是数据发送过程存在性能问题。• 针对前反向耗时过长的问题:该阶段主要包含网络中前向及反向算子的执行时间。若该时间段耗时较长,建议按跳转到“算子耗时统计排名”标签页,查看训练过程中各算子的耗时情况,重点关注耗时排名靠前的部分算子。分享一些解决算子耗时长的小tips(欢迎补充~):– 在不影响精度的前提下,将float32类型修改为float16类型;– 存在转换算子过多(TransData、Cast类算子)且耗时明显时,如果是用户手动加入的算子,可分析其必要性,如果对精度没有影响,可去掉冗余的Cast、TransData算子;• 针对迭代拖尾耗时过长的问题:该阶段在单卡场景主要包含参数更新等操作。从实际的调优经验来看,在单卡训练场景下该阶段耗时都很短,不会存在性能瓶颈。如果用户遇到单卡场景下该阶段耗时长,可以下载“时间线”,使用chrome://tracing工具观察参数更新相关的算子耗时是否有异常,并到MindSpore 社区 反馈。六、FAQ1、使用远程conda环境无法识别conda环境里的包原因:使用MindStudio进行远程连接服务器资源时,默认使用/usr/local/...下的本地环境。解决方法:可以尝试指定运行文件为shell脚本,在shell脚本靠前位置指明source activate xxx-env来激活远程conda环境。2、启动MindInsight训练看板卡顿,单击无响应。解决方法:(1)尝试disable后重新开启;(2)尝试重新存储训练数据;(3)SummaryCollector实例化的参数收集频率collect_freq设置的值过小,尝试调大一点。3、点击View查看MindInsight训练面板,显示为空。解决方法:Summary Base Dir 填入正确的目录,无需加前缀“./”。4、MindInsight训练面板显示异常数据(数据不符合预期)。原因:每个summary日志文件目录中,应该只放置一次训练的数据。一个summary日志目录中如果存放了多次训练的summary数据,MindInsight在可视化数据时会将这些训练的summary数据进行叠加展示,可能会与预期可视化效果不相符。解决方法:将summary日志文件目录删除后,重新训练生成文件。5、训练看板中Loss曲线过于平滑,难以分析Loss震荡幅度。解决方法:将model.train方法的dataset_sink_mode参数设置为False,从而以step作为collect_freq参数的单位收集数据。当dataset_sink_mode为True时,将以epoch作为collect_freq的单位,此时建议手动设置collect_freq参数。collect_freq参数默认值为10。七、从昇腾官方中体验更多内容MindSpore模型开发教程与API可参考MindSpore官网:https://www.mindspore.cn/ , 也可以在昇腾论坛进行讨论和交流: https://bbs.huaweicloud.com/forum/forum-726-1.html 总结本文主要介绍了如何使用MindStudio在MindSpore模型开发时使用MindInsight工具进行调优,详细介绍了其中的MindSpore环境搭建和配置介绍、MindStudio的安装与使用、训练工程的导入与配置、MindInsight训练可视化以及MindInsight性能调优等。 欢迎大家提出意见与反馈,谢谢!
  • [技术干货] 序列数据和文本的深度学习
    序列数据和文本的深度学习 用于构建深度学习模型的不同文本数据表示法:理解递归神经网络及其不同实现,例如长短期记忆网络(LSTM)和门控循环单元(Gated Recurrent Unit,GRU),它们为大多数深度学习模型提供文本和序列化数据;为序列化数据使用一维卷积。可以使用RNN构建的一些应用程序如下所示。文档分类器:识别推文或评论的情感,对新闻文章进行分类。序列到序列的学习:例如语言翻译,将英语转换成法语等任务。时间序列预测:根据前几天商店销售的详细信息,预测商店未来的销售情况。 1 使用文本数据文本是常用的序列化数据类型之一。文本数据可以看作是一个字符序列或词的序列。对大多数问题,我们都将文本看作词序列。深度学习序列模型(如RNN及其变体)能够从文本数据中学习重要的模式。这些模式可以解决类似以下领域中的问题:自然语言理解;文献分类;情感分类。这些序列模型还可以作为各种系统的重要构建块,例如问答(Question and Answering,QA)系统。虽然这些模型在构建这些应用时非常有用,但由于语言固有的复杂性,模型并不能真正理解人类的语言。这些序列模型能够成功地找到可执行不同任务的有用模式。将深度学习应用于文本是一个快速发展的领域,每月都会有许多新技术出现。我们将会介绍为大多数现代深度学习应用提供支持的基本组件。与其他机器学习模型一样,深度学习模型并不能理解文本,因此需要将文本转换为数值的表示形式。将文本转换为数值表示形式的过程称为向量化过程,可以用不同的方式来完成,概括如下:将文本转换为词并将每个词表示为向量;将文本转换为字符并将每个字符表示为向量;创建词的n-gram并将其表示为向量。文本数据可以分解成上述的这些表示。每个较小的文本单元称为token,将文本分解成token的过程称为分词(tokenization)。在Python中有很多强大的库可以用来进行分词。一旦将文本数据转换为token序列,那么就需要将每个token映射到向量。one-hot(独热)编码和词向量是将token映射到向量最流行的两种方法。图6.1总结了将文本转换为向量表示的步骤。 图6.1下面介绍分词、n-gram表示法和向量化的更多细节。6.1.1 分词将给定的一个句子分为字符或词的过程称为分词。诸如spaCy等一些库,它们为分词提供了复杂的解决方案。让我们使用简单的Python函数(如split和list)将文本转换为token。为了演示分词如何作用于字符和词,让我们看一段关于电影Thor:Ragnarok的小评论。我们将对这段文本进行分词处理:The action scenes were top notch in this movie. Thor has never been this epic in the MCU. He does some pretty epic sh*t in this movie and he is definitely not under-powered anymore. Thor in unleashed in this, I love that.1.将文本转换为字符Python的list函数接受一个字符串并将其转换为单个字符的列表。这样做就将文本转换为了字符。下面是使用的代码和结果:以下是结果:结果展示了简单的Python函数如何将文本转换为token。2.将文本转换为词我们将使用Python字符串对象函数中的split函数将文本分解为词。split函数接受一个参数,并根据该参数将文本拆分为token。在我们的示例中将使用空格作为分隔符。以下代码段演示了如何使用Python的split函数将文本转换为词:在前面的代码中,我们没有使用任何的分隔符,默认情况下,split函数使用空格来分隔。3.n-gram表示法我们已经看到文本是如何表示为字符和词的。有时一起查看两个、三个或更多的单词非常有用。n-gram是从给定文本中提取的一组词。在n-gram中,n表示可以一起使用的词的数量。看一下bigram(当n = 2时)的例子,我们使用Python的nltk包为thor_review生成一个bigram,以下代码块显示了bigram的结果以及用于生成它的代码:ngrams函数接受一个词序列作为第一个参数,并将组中词的个数作为第二个参数。以下代码块显示了trigram表示的结果以及用于实现它的代码:在上述代码中唯一改变的只有函数的第二个参数n的值。许多有监督的机器学习模型,例如朴素贝叶斯(Naive Bayes),都是使用n-gram来改善它的特征空间。n-gram同样也可用于拼写校正和文本摘要的任务。n-gram表示法的一个问题在于它失去了文本的顺序性。通常它是和浅层机器学习模型一起使用的。这种技术很少用于深度学习,因为RNN和Conv1D等架构会自动学习这些表示法。6.1.2 向量化将生成的token映射到数字向量有两种流行的方法,称为独热编码和词向量(word embedding,也称之为词嵌入)。让我们通过编写一个简单的Python程序来理解如何将token转换为这些向量表示。我们还将讨论每种方法的各种优缺点。1.独热编码在独热编码中,每个token都由长度为N的向量表示,其中N是词表的大小。词表是文档中唯一词的总数。让我们用一个简单的句子来观察每个token是如何表示为独热编码的向量的。下面是句子及其相关的token表示:An apple a day keeps doctor away said the doctor. 上面句子的独热编码可以用表格形式进行表示,如下所示。An100000000apple010000000a001000000day000100000keeps000010000doctor000001000away000000100said000000010the000000001该表描述了token及其独热编码的表示。因为句子中有9个唯一的单词,所以这里的向量长度为9。许多机器学习库已经简化了创建独热编码变量的过程。我们将编写自己的代码来实现这个过程以便更易于理解,并且我们可以使用相同的实现来构建后续示例所需的其他功能。以下代码包含Dictionary类,这个类包含了创建唯一词词表的功能,以及为特定词返回其独热编码向量的函数。让我们来看代码,然后详解每个功能:上述代码提供了3个重要功能。初始化函数__init__创建一个word2idx字典,它将所有唯一词与索引一起存储。idx2word列表存储的是所有唯一词,而length变量则是文档中唯一词的总数。在词是唯一的前提下,add_word函数接受一个单词,并将它添加到word2idx和idx2word中,同时增加词表的长度。onehot_encoded函数接受一个词并返回一个长度为N,除当前词的索引外其余位置全为0的向量。比如传如的单词的索引是2,那么向量在索引2处的值是1,其他索引处的值全为0。在定义好了Dictionary类后,准备在thor_review数据上使用它。以下代码演示了如何构建word2idx以及如何调用onehot_encoded函数:上述代码的输出如下:单词were的独热编码如下所示:独热表示的问题之一就是数据太稀疏了,并且随着词表中唯一词数量的增加,向量的大小迅速增加,这也是它的一种限制,因此独热很少在深度学习中使用。2.词向量词向量是在深度学习算法所解决的问题中,一种非常流行的用于表示文本数据的方式。词向量提供了一种用浮点数填充的词的密集表示。向量的维度根据词表的大小而变化。通常使用维度大小为50、100、256、300,有时为1000的词向量。这里的维度大小是在训练阶段需要使用的超参数。如果试图用独热表示法来表示大小为20000的词表,那么将得到20000×20000个数字,并且其中大部分都为0。同样的词表可以用词向量表示为20000×维度大小,其中维度的大小可以是10、50、300等。一种方法是为每个包含随机数字的token从密集向量开始创建词向量,然后训练诸如文档分类器或情感分类器的模型。表示token的浮点数以一种可以使语义上更接近的单词具有相似表示的方式进行调整。为了理解这一点,我们来看看图6.2,它画出了基于5部电影的二维点图的词向量。 图6.2图6.2显示了如何调整密集向量,以使其在语义上相似的单词具有较小的距离。由于Superman、Thor和Batman等电影都是基于漫画的动作电影,所以这些电影的向量更为接近,而电影Titanic的向量离动作电影较远,离电影Notebook更近,因为它们都是浪漫型电影。在数据太少时学习词向量可能是行不通的,在这种情况下,可以使用由其他机器学习算法训练好的词向量。由另一个任务生成的向量称为预训练词向量。下面将学习如何构建自己的词向量以及使用预训练词向量。 
  • [行业资讯] 首款使用深度学习清除通话噪音的无线耳塞
    随着在COVID-19疫情封锁期间会议转移到网上,许多人发现,叽叽喳喳的室友、垃圾车和其他响亮的杂音会打断了重要的对话。这经历启发了华盛顿大学的三位研究人员(他们在COVID-19期间是室友)研发出了更好的耳塞,为了增强说话人的声音和减少背景噪音,“ClearBuds”使用了一种新的麦克风系统和第一个实时操作的机器学习系统,该系统可以在智能手机上运行。研究人员于6月30日在ACM移动系统、应用和服务国际会议上介绍了这个项目。“ClearBuds在两个关键方面区别于其他无线耳机,”Paul G. Allen(保罗·艾伦)计算机科学与工程学院的博士生Maruchi Kim说。首先,ClearBuds使用了双麦克风阵列,每个耳塞上的麦克风可以产生两个同步的音频流,提供信息,并允许我们在空间上以更高的分辨率分离来自不同方向的声音。其次,轻量级的神经网络进一步增强了说话人的声音。”虽然大多数商业耳塞也在每个耳塞上都有麦克风,但只有一个耳塞在同一时间主动向手机发送音频。使用ClearBuds耳机,每个耳塞都会向手机发送一串音频,研究人员设计了蓝牙网络协议,允许这些数据流在70微秒内同步。该团队的神经网络算法在手机上运行来处理音频流。首先,它会抑制任何非语音的声音,然后它会隔离并增强同时从两个耳塞扬声器的声音——传入的任何噪音。Allen School的博士生Ishan Chatterjee说:“因为说话者的声音与两个耳塞的距离很近,而且距离大致相等,所以神经网络可以训练成只关注他们的声音,消除包括其他声音在内的背景声音,这种方法和你自己耳朵的工作原理非常相似,它们利用声音到达你左右耳朵的时间差来判断声音来自哪个方向。”当研究人员将 ClearBuds 与苹果的AirPods Pro 进行比较时,ClearBuds 表现更好,在所有测试中实现了更高的信号失真比。”Allen School的博士生Vivek Jayaram说:“当你考虑到我们的神经网络在iPhone上运行不到20毫秒这一事实时,这是非常了不起的,与通常用于运行神经网络的大型商业显卡相比,iPhone的计算能力只是一个小部分,我们如何在保持输出质量的同时减少传统神经网络的大小?这是我们在这篇论文中必须解决的挑战的一部分。研究小组还在“野外”对ClearBuds进行了测试,他们记录了8个人在嘈杂的环境中阅读“古登堡计划”,比如在咖啡店或繁忙的街道上。然后,研究人员让37人对这些10到60秒的录音片段进行打分,参与打分者认为通过ClearBuds的神经网络处理的片段具有最好的噪音抑制和最好的整体聆听体验。研究人员说,ClearBuds的一个限制是人们必须同时戴上两种耳塞才能获得噪音抑制的体验。但该团队表示,这里开发的实时通信系统可以用于各种其他应用,包括智能家居扬声器、跟踪机器人位置或搜索和救援任务。团队目前正在努力提高神经网络算法的效率,以便它们能够在耳塞上运行。
总条数:881 到第
上滑加载中