使用说明
Ascend C提供一组Conv3DBackpropFilter高阶API,便于用户快速实现卷积的反向运算,求解反向传播的误差。
Conv3dBackpropFilter的计算公式为:
- X为卷积的特征矩阵Input。
- ∂L/∂Y为卷积正向损失函数对输出Y的梯度GradOutput,作为求反向传播误差∂L/∂W的输入,即卷积的输出反向GradOutput。
- ∂L/∂W为Weight权重的反向传播误差GradWeight。
实现Conv3DBackpropFilter求解反向传播误差运算的具体步骤如下:
- 创建Conv3DBackpropFilter对象。
- 初始化操作。
- 设置卷积的特征矩阵Input、卷积的输出反向GradOutput。
- 完成卷积反向操作。
- 结束卷积反向操作。
- 创建Conv3DBackpropFilter对象。
1 2 3 4 5 6 7
#include "lib/conv_backprop/conv3d_bp_filter_api.h" using inputType = ConvBackpropApi::ConvType <ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::NDC1HWC0, inputType>; using weightSizeType = ConvBackpropApi::ConvType<ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::ND, int32_t>; using gradOutputType = ConvBackpropApi::ConvType<ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::NDC1HWC0, gradOutputType>; using gradWeightType = ConvBackpropApi::ConvType <ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::FRACTAL_Z_3D, gradWeightType>; ConvBackpropApi::Conv3DBackpropFilter <inputType, weightSizeType, gradOutputType, gradWeightType> gradWeight_;
创建对象时需要传入特征矩阵Input、权重矩阵Weight的shape信息WeightSize、GradOutput和GradWeight的参数类型信息,类型信息通过ConvType来定义,包括:内存逻辑位置、数据格式、数据类型。
1 2 3 4 5 6
template <TPosition POSITION, ConvFormat FORMAT, typename T> struct ConvType { constexpr static TPosition pos = POSITION; // Convolution输入或输出的逻辑位置 constexpr static ConvFormat format = FORMAT; // Convolution输入或输出的数据格式 using Type = T; // Convolution输入或输出的数据类型 };
表1 ConvType说明 参数
说明
POSITION
内存逻辑位置。
- Input X矩阵可设置为TPosition::GM
- WeightSize可设置为TPosition::GM
- GradOutput矩阵可设置为TPosition::GM
- GradWeight矩阵可设置为TPosition::GM
ConvFormat
数据格式。
- Input矩阵可设置为ConvFormat::NDC1HWC0
- WeightSize矩阵可设置为ConvFormat::ND
- GradOutput矩阵可设置为ConvFormat::NDC1HWC0
- GradWeight矩阵可设置为ConvFormat::FRACTAL_Z_3D
TYPE
数据类型。- Input矩阵可设置为half、bfloat16_t
- WeightSize可设置为int32_t
- GradOutput矩阵可设置为half、bfloat16_t
- GradWeight矩阵可设置为float
注意:Input、GradOutput数据类型需要一致,具体数据类型组合关系请参考表2。
表2 Conv3DBackpropFilter输入输出数据类型的组合说明 Input
WeightSize
GradOutput
GradWeight
支持平台
half
int32_t
half
float
Atlas A3 训练系列产品/Atlas A3 推理系列产品 Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件
bfloat16_t
int32_t
bfloat16_t
float
Atlas A3 训练系列产品/Atlas A3 推理系列产品 Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件
- 初始化操作。
1
gradWeight_.Init(&(tilingData->dwTiling)); // 初始化gradWeight_相关参数
- 设置卷积的特征矩阵Input、卷积的输出反向GradOutput。
1 2 3 4
gradWeight_.SetGradOutput(gradOutputGm_[offsetA_]); // 设置矩阵gradOutput gradWeight_.SetInput(inputGm_[offsetB_]); // 设置矩阵Input gradWeight_.SetSingleShape(singleShapeM, singleShapeN, singleShapeK); // 设置需要计算要形状 gradWeight_.SetStartPosition(hoStartIdx_); // 设置初始位置
- 完成卷积反向操作。调用Iterate完成单次迭代计算,叠加while循环完成单核全量数据的计算。Iterate方式,可以自行控制迭代次数,完成所需数据量的计算。
1 2 3
while (gradWeight_.Iterate()) { gradWeight_.GetTensorC(gradWeightGm_[offsetC_]); }
- 结束卷积反向操作。
1
gradWeight_.End();
父主题: Conv3DBackpropFilter