DML_ROI_ALIGN_GRAD_OPERATOR_DESC结构 (directml.h)

计算 ROI_ALIGNROI_ALIGN1的反向传播渐变。

回想一下,DML_ROI_ALIGN1_OPERATOR_DESC 作物,并使用近邻采样或双线性内插来重新缩放输入张量的子区域。 如果 InputGradientTensor 的大小与等效 DML_OPERATOR_ROI_ALIGN1输出 相同,则此运算符将生成与 DML_OPERATOR_ROI_ALIGN1输入 相同的 OutputGradientTensor

例如,对于具有维度 [1, 1, 4, 4]的输入的 4 个非重叠裁剪,考虑 DML_OPERATOR_ROI_ALIGN1 执行 近邻 缩放的宽度为 1.5 倍,高度为 0.5 倍:

ROITensor
[[0, 0, 2, 2],
 [2, 0, 4, 2],
 [0, 2, 2, 4],
 [2, 2, 4, 4]]

BatchIndicesTensor
[0, 0, 0, 0]

InputTensor
[[[[1,   2, |  3,  4],    RoiAlign1     [[[[ 1,  1,  2]]],
   [5,   6, |  7,  8],       -->         [[[ 3,  3,  4]]],
   ------------------                    [[[ 9,  9, 10]]],
   [9,  10, | 11, 12],                   [[[11, 11, 12]]]]
   [13, 14, | 15, 16]]]]

请注意,每个区域的第 0 个元素如何贡献输出中的两个元素,第 1 个元素在输出中贡献一个元素,第二个和第三个元素对输出中没有任何元素的贡献。

相应的 DML_OPERATOR_ROI_ALIGN_GRAD 将执行以下操作:

InputGradientTensor                  OutputGradientTensor
[[[[ 1,  2,  3]]],    ROIAlignGrad   [[[[ 3,  3, |  9,  6],
 [[[ 4,  5,  6]]],         -->          [ 0,  0, |  0,  0],
 [[[ 7,  8,  9]]],                      ------------------
 [[[10, 11, 12]]]]                      [15,  9, | 21, 12],
                                        [ 0,  0, |  0,  0]]]]

总之,当区域不重叠时,DML_OPERATOR_ROI_ALIGN_GRAD 的行为类似于对 InputGradientTensor 每批执行的 DML_OPERATOR_RESAMPLE_GRAD

对于 OutputROIGradientTensor,数学略有不同,可通过以下伪代码进行汇总(假设 MinimumSamplesPerOutput == 1MaximumSamplesPerOutput == 1):

for each region of interest (ROI):
    for each inputGradientCoordinate:
        for each inputCoordinate that contributed to this inputGradient element:
            topYIndex = floor(inputCoordinate.y)
            bottomYIndex = ceil(inputCoordinate.y)
            leftXIndex = floor(inputCoordinate.x)
            rightXIndex = ceil(inputCoordinate.x)

            yLerp = inputCoordinate.y - topYIndex
            xLerp = inputCoordinate.x - leftXIndex

            topLeft = InputTensor[topYIndex][leftXIndex]
            topRight = InputTensor[topYIndex][rightXIndex]
            bottomLeft = InputTensor[bottomYIndex][leftXIndex]
            bottomRight = InputTensor[bottomYIndex][rightXIndex]

            inputGradientWeight = InputGradientTensor[inputGradientCoordinate.y][inputGradientCoordinate.x]
            imageGradY = (1 - xLerp) * (bottomLeft - topLeft) + xLerp * (bottomRight - topRight)
            imageGradX = (1 - yLerp) * (topRight - topLeft) + yLerp * (bottomRight - bottomLeft)

            imageGradY *= inputGradientWeight
            imageGradX *= inputGradientWeight

            OutputROIGradientTensor[roiIndex][0] += imageGradX * (inputWidth - inputGradientCoordinate.x)
            OutputROIGradientTensor[roiIndex][1] += imageGradY * (inputHeight - inputGradientCoordinate.y)
            OutputROIGradientTensor[roiIndex][2] += imageGradX * inputGradientCoordinate.x
            OutputROIGradientTensor[roiIndex][3] += imageGradY * inputGradientCoordinate.y

如果只需要一个,则可以省略 OutputGradientTensorOutputROIGradientTensor;但必须至少提供一个。

语法

struct DML_ROI_ALIGN_GRAD_OPERATOR_DESC {
  const DML_TENSOR_DESC  *InputTensor;
  const DML_TENSOR_DESC  *InputGradientTensor;
  const DML_TENSOR_DESC  *ROITensor;
  const DML_TENSOR_DESC  *BatchIndicesTensor;
  const DML_TENSOR_DESC  *OutputGradientTensor;
  const DML_TENSOR_DESC  *OutputROIGradientTensor;
  DML_REDUCE_FUNCTION    ReductionFunction;
  DML_INTERPOLATION_MODE InterpolationMode;
  FLOAT                  SpatialScaleX;
  FLOAT                  SpatialScaleY;
  FLOAT                  InputPixelOffset;
  FLOAT                  OutputPixelOffset;
  UINT                   MinimumSamplesPerOutput;
  UINT                   MaximumSamplesPerOutput;
  BOOL                   AlignRegionsToCorners;
};

成员

InputTensor

类型:_Maybenull_ const DML_TENSOR_DESC*

包含来自正向传递的输入数据的张量,维度 { BatchCount, ChannelCount, InputHeight, InputWidth }。 提供 时, 必须提供此张量 。 这与提供给 DML_OPERATOR_ROI_ALIGNDML_OPERATOR_ROI_ALIGN1InputTensor 的张量相同。

InputGradientTensor

类型:const DML_TENSOR_DESC*

ROITensor

类型:const DML_TENSOR_DESC*

一个张量,包含感兴趣的区域(ROI)数据-一系列边界框(浮点坐标中指向输入张量 X 和 Y 维度)。 允许的 ROITensor 维度为 { NumROIs, 4 }{ 1, NumROIs, 4 }{ 1, 1, NumROIs, 4 }。 对于每个 ROI,值将是其左上角和右下角的坐标,顺序为 [x1, y1, x2, y2]。 区域可以是空的,这意味着所有输出像素都来自单个输入坐标,并且区域可以反转(例如 x2 小于 x1),这意味着输出接收输入的镜像/翻转版本。 这些坐标首先按 SpatialScaleXSpatialScaleY进行缩放,但如果它们都是 1.0,则区域矩形直接对应于输入张量坐标。 这与提供给 DML_OPERATOR_ROI_ALIGNDML_OPERATOR_ROI_ALIGN1ROITensor 的张量相同。

BatchIndicesTensor

类型:const DML_TENSOR_DESC*

包含要从中提取 ROIS 的批处理索引的张量。 允许的 BatchIndicesTensor 维度为 { NumROIs }{ 1, NumROIs }{ 1, 1, NumROIs }{ 1, 1, 1, NumROIs }。 每个值都是来自 InputTensor的批处理的索引。 如果值不在范围 [0, BatchCount),则行为是未定义的。 这与提供给 DML_OPERATOR_ROI_ALIGNDML_OPERATOR_ROI_ALIGN1BatchIndicesTensor 的张量相同。

OutputGradientTensor

类型:_Maybenull_ const DML_TENSOR_DESC*

一个输出张量,其中包含相对于 InputTensor的反向渐变。 通常,此张量的大小与前向传递中相应 DML_OPERATOR_ROI_ALIGN1输入 相同。 如果未提供 OutputROIGradientTensor,则必须提供 OutputGradientTensor

OutputROIGradientTensor

类型:_Maybenull_ const DML_TENSOR_DESC*

一个输出张量,其中包含相对于 ROITensor的反向渐变。 这种张量的大小需要与 ROITensor相同。 如果未提供 OutputGradientTensor,则必须提供 OutputROIGradientTensor

ReductionFunction

类型:DML_REDUCE_FUNCTION

请参阅 DML_ROI_ALIGN1_OPERATOR_DESC::ReductionFunction

InterpolationMode

类型:DML_INTERPOLATION_MODE

请参阅 DML_ROI_ALIGN1_OPERATOR_DESC::InterpolationMode

SpatialScaleX

类型:FLOAT

请参阅 DML_ROI_ALIGN1_OPERATOR_DESC::SpatialScaleX

SpatialScaleY

类型:FLOAT

请参阅 DML_ROI_ALIGN1_OPERATOR_DESC::SpatialScaleY

InputPixelOffset

类型:FLOAT

请参阅 DML_ROI_ALIGN1_OPERATOR_DESC::InputPixelOffset

OutputPixelOffset

类型:FLOAT

请参阅 DML_ROI_ALIGN1_OPERATOR_DESC::OutputPixelOffset

MinimumSamplesPerOutput

类型:UINT

请参阅 DML_ROI_ALIGN1_OPERATOR_DESC::MinimumSamplesPerOutput

MaximumSamplesPerOutput

类型:UINT

请参阅 DML_ROI_ALIGN1_OPERATOR_DESC::MaximumSamplesPerOutput

AlignRegionsToCorners

类型:BOOL

请参阅 DML_ROI_ALIGN1_OPERATOR_DESC::AlignRegionsToCorners

言论

可用性

此运算符是在 DML_FEATURE_LEVEL_4_1中引入的。

Tensor 约束

InputGradientTensorInputTensorOutputGradientTensorOutputROIGradientTensorROITensor 必须具有相同 DataType

Tensor 支持

DML_FEATURE_LEVEL_4_1及更高版本

张肌 支持的维度计数 支持的数据类型
InputTensor 可选输入 4 FLOAT32,FLOAT16
InputGradientTensor 输入 4 FLOAT32,FLOAT16
ROITensor 输入 2 到 4 FLOAT32,FLOAT16
BatchIndicesTensor 输入 1 到 4 UINT32
OutputGradientTensor 可选输出 4 FLOAT32,FLOAT16
OutputROIGradientTensor 可选输出 2 到 4 FLOAT32,FLOAT16

要求

要求 价值
标头 directml.h