Ascend C提供一组Conv3DBackpropInput高阶API,便于用户快速实现卷积的反向运算,求解反向传播的误差。转置卷积Conv3DTranspose与Conv3DBackpropInput具有相同的数学过程,因此用户也可以使用Conv3DBackpropInput高阶API实现转置卷积算子。卷积的正反向传播如图1 卷积层的前后向传播示意图,反向传播误差计算如图2 反向传播误差计算示意图。
Conv3DBackpropInput的计算公式为:

Kernel侧实现Conv3DBackpropInput求解反向传播误差运算的步骤概括为:
下文中提及的M轴方向,即为GradOutput矩阵纵向;K轴方向,即为GradOutput矩阵横向或Weight矩阵纵向;N轴方向,即为Weight矩阵横向。
使用Conv3DBackpropInput高阶API求解反向传播误差运算的具体步骤如下:
1 2 3 4 5 6 7 |
#include "lib/conv_backprop/conv3d_bp_input_api.h" using weightDxType = ConvBackpropApi::ConvType<ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::FRACTAL_Z_3D, weightType>; using inputSizeDxType = ConvBackpropApi::ConvType<ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::ND, int32_t>; using gradOutputDxType = ConvBackpropApi::ConvType<ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::NDC1HWC0, gradOutputType>; using gradInputDxType = ConvBackpropApi::ConvType<ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::NCDHW, gradInputType>; ConvBackpropApi::Conv3DBackpropInput<weightDxType, inputSizeDxType, gradOutputDxType, gradInputDxType> gradInput_; |
创建对象时需要传入权重矩阵Weight、卷积正向特征矩阵Input的shape信息InputSize、GradOutput和GradInput的参数类型信息,类型信息通过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输入或输出的数据类型 }; |
下面简要介绍在创建对象时使用到的相关数据结构,开发者可选择性地了解这些内容。用于创建Conv3DBackpropInput对象的数据结构定义如下:
1
|
using Conv3DBackpropInput = Conv3DBpInputIntf<Conv3DBpInputCfg<WEIGHT_TYPE, INPUT_TYPE, GRAD_OUTPUT_TYPE, GRAD_INPUT_TYPE, CONV3D_CFG_DEFAULT>, Conv3DBpInputImpl>; |
其中,Conv3DBpInputIntf、Conv3DBpInputCfg数据结构定义如下:
1 2 3 |
template <class Config_, template <typename, class> class Impl> struct Conv3DBpInputIntf { } |
1 2 3 |
template <class WEIGHT_TYPE, class INPUT_TYPE, class GRAD_OUTPUT_TYPE, class GRAD_INPUT_TYPE, const Conv3dConfig& CONV3D_CONFIG = CONV3D_CFG_DEFAULT> struct Conv3DBpInputCfg : public ConvBpContext<WEIGHT_TYPE, INPUT_TYPE, GRAD_OUTPUT_TYPE, GRAD_INPUT_TYPE> { } |
|
参数 |
说明 |
|---|---|
|
POSITION |
内存逻辑位置。
|
|
ConvFormat |
数据格式。
|
|
TYPE |
数据类型。
注意:GradOutput矩阵和Weight矩阵数据类型需要一致,具体数据类型组合关系请参考表2。 |
1 2 3 |
// 注册后进行初始化 ConvBackpropApi::Conv3DBackpropInput<weightDxType, inputSizeDxType, gradOutputDxType, gradInputDxType> gradInput_; gradInput_.Init(&(tilingData->conv3DDxTiling)); |
1 2 3 4 |
gradInput_.SetSingleShape(singleShapeM_, singleShapeK_, singleShapeN_); // 设置单核计算的形状 gradInput_.SetStartPosition(dinStartIdx_, curHoStartIdx_); // 设置单核上gradOutput载入的起始位置 gradInput_.SetGradOutput(gradOutputGm_[offsetA_]); gradInput_.SetWeight(weightGm_[offsetB_]); |
1 2 3 |
while (gradInput_.Iterate()) { gradInput_.GetTensorC(gradInputGm_[offsetC_]); } |
1
|
gradInput_.End(); |
1
|
#include "lib/conv_backprop/conv3d_bp_input_api.h" |