更新时间:2021-03-18 GMT+08:00
分享

算子特性

深度学习算法由一个个计算单元组成,我们称这些计算单元为算子(Operator,简称Op)。在Caffe中,算子对应层中的计算逻辑,例如:卷积层(Convolution Layer)中的卷积算法,是一个算子;全连接层(Fully-connected Layer, FC layer)中的权值求和过程,是一个算子。

下面介绍算子中常用的基本概念。

算子类型(Type)

算子的type,代表算子的类型,例如卷积算子的类型为Convolution,在一个网络中同一类型的算子可能存在多个。

算子名称(Name)

算子的name,用于标志网络中的某个算子,同一网络中算子的名称需要保持唯一。如下图所示conv1,pool1,conv2都是此网络中的算子名称,其中conv1与conv2算子的类型为Convolution,表示分别做一次卷积运算。

图1 网络拓扑示例

张量(Tensor)

Tensor是TE算子中的数据,包括输入数据与输出数据,TensorDesc(Tensor描述符)是对输入数据与输出数据的描述,TensorDesc数据结构包含如下属性如表1所示。

表1 TensorDesc属性解释

属性

定义

名称(name)

用于对Tensor进行索引,不同Tensor的name需要保持唯一。

形状(shape)

Tensor的形状,比如(10,)或者(1024,1024)或者(2,3,4)等。详细介绍请参见 形状(shape)

默认值:无

形式:(i1, i2,…in),i1,i2,in为正整数

数据类型(dtype)

功能描述:指定Tensor对象的数据类型。

默认值:无

取值范围:float16, int8, int16, int32, uint8, uint16, bool。

说明:
  • 不同计算操作支持的数据类型不同,详细请参见《TE API参考》
  • TE API同时支持float16与float32数据类型,但OMG进行模型转换的时候会将float32数据类型转换成float16,所以当前版本在进行自定义算子开发时,不支持使用float32的数据类型。

数据排布格式(format)

详细请参见 数据排布格式(format)

  • 形状(Shape)

    张量的形状,以(D0, D1, … ,Dn-1)的形式表示,D0到Dn是任意的正整数。

    如形状(3,4)表示第一维有3个元素,第二维有4个元素,(3,4)表示一个3行4列的矩阵。

    在形状的中括号中有多少个数字,就代表这个张量是多少维的张量。形状的第一个元素要看张量最外层的中括号中有几个元素,形状的第二个元素要看张量中从左边开始数第二个中括号中有几个元素,依此类推。例如:

    表2 张量的形状举例

    张量

    形状

    1

    (0,)

    [1,2,3]

    (3,)

    [[1,2],[3,4]]

    (2,2)

    [[[1,2],[3,4]], [[5,6],[7,8]]]

    (2,2,2)

  • 数据排布格式(format)

    在深度学习框架中,多维数据通过多维数组存储,比如卷积神经网络的特征图用四维数组保存,四个维度分别为批量大小(Batch,N)、特征图高度(Height,H)、特征图宽度(Width,W)以及特征图通道(Channels,C)。

    由于数据只能线性存储,因为这四个维度有对应的顺序。不同深度学习框架会按照不同的顺序存储特征图数据,比如Caffe,排列顺序为[Batch, Channels, Height, Width],即NCHW。Tensorflow中,排列顺序为[Batch,Height, Width, Channels],即NHWC。

    图2所示,以一张格式为RGB的图片为例,NCHW实际存储的是“RRRGGGBBB”,同一通道的所有像素值顺序存储在一起,而NHWC实际存储的则是“RGBRGBRGB”,多个通道的同一位置的像素值顺序存储在一起。

    图2 NCHW和NHWC

    昇腾AI软件栈中,为了提高数据访问效率,所有张量数据统一采用NC1HWC0的五维数据格式。其中C0与微架构强相关,等于AI Core中矩阵计算单元的大小,对于FP16类型为16,对于INT8类型则为32,这部分数据需要连续存储;C1=(C+C0-1)/C0。如果结果不整除,最后一份数据需要补零以对齐C0。

    整个NHWC -> NC1HWC0的转换过程为:

    1. 将NHWC数据在C维度进行分割,变成C1份NHWC0。
    2. 将C1份NHWC0在内存中连续排列,由此变成NC1HWC0。

算子属性

不同的算子包含的属性值不同,下面介绍几个常见的算子属性。

  • 轴(axis)

    axis代表张量中维度的下标,比如张量a是一个5行6列的二维数组,即shape是(5,6),则axis=0表示是张量中的第一维,即行。axis=1表示是张量中的第二维,即列。

    例如张量数据[[[1,2],[3,4]], [[5,6],[7,8]]],Shape为(2,2,2),则轴0代表第一个维度的数据即[[1,2],[3,4]]与[[5,6],[7,8]]这两个矩阵,轴1代表第二个维度的数据即[1,2]、[3,4]、[5,6]、[7,8]这四个数组,轴2代表第三个维度的数据即1,2,3,4,5,6,7,8这八个数。

    轴axis可以为负数,此时表示是倒数第axis个维度。

  • 偏差(bias)

    偏差是除了权重之外,另一个被应用于输入数据的线性分量。它被加到权重与输入数据相乘的结果中,用于改变权重与输入相乘所得结果的范围。

    图3所示,假设输入数据为X1,与其相关联的权重为W1,偏差为B1,那么在通过计算单元后,数据变为了X1*W1+B1。

    图3 偏差计算示例

  • 权重(weights)

    当输入数据进入计算单元时,会乘以一个权重。例如,如果一个算子有两个输入,则每个输入会分配一个关联权重,一般将认为较重要数据赋予较高的权重,不重要的数据赋予较小的权重,为零的权重则表示特定的特征是无需关注的。

    图4所示,假设输入数据为X1,与其相关联的权重为W1,那么在通过计算单元后,数据变为了X1*W1。

    图4 权重计算示例

算子样例—Reduction

Reduction是caffe中的一个算子,将多维数组的指定轴及之后的数据做reduce操作。

  • Reduction的属性
    • ReductionOp:算子支持的操作类型,包含四种类型。
      表3 Reduction算子操作类型

      算子类型

      说明

      SUM

      对被reduce的所有轴求和。

      ASUM

      对被reduce的所有轴求绝对值后求和。

      SUMSQ

      对被reduce的所有轴求平方后再求和。

      MEAN

      对被reduce的所有轴求均值。

    • axis:Reduction需要指定一个轴,会对此轴及其之后的轴进行reduce操作,取值范围为:[-N,N-1]。
      比如,输入的张量的形状为(5,6,7,8)。
      • 如果指定的轴是3,则输出tensor的形状为(5,6,7)。
      • 如果指定的轴是2,则输出tensor的形状为(5,6)。
      • 如果指定的轴是1,则输出tensor的形状为(5,)。
      • 如果指定的轴是0,则输出tensor的形状为(1,)。
    • coeff:标量,对结果缩放,如果值为1,则不进行缩放。
  • Reduction算子的数据
    • 输入数据

      输入包含张量数据及针对张量数据描述。

      输入数据:张量x。

      张量x的描述包含如下属性:
      表4 Reduction算子输入

      输入参数

      说明

      x

      张量的name,输入数据,形状由参数shape确定。

      shape

      输入数据的形状,维度为N。

      dtype

      输入的数据类型,支持如下类型:

      float16,float32。

    • 输出数据

      y:与输入x数据类型相同的张量,其形状由输入张量形状和指定轴决定。

分享:

    相关文档

    相关产品