计算 ROI_ALIGN 和 ROI_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 == 1 和 MaximumSamplesPerOutput == 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
如果只需要一个,则可以省略 OutputGradientTensor 或 OutputROIGradientTensor;但必须至少提供一个。
语法
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 }。 提供 InputTensor 的张量相同。
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),这意味着输出接收输入的镜像/翻转版本。 这些坐标首先按 SpatialScaleX 和 SpatialScaleY进行缩放,但如果它们都是 1.0,则区域矩形直接对应于输入张量坐标。 这与提供给 DML_OPERATOR_ROI_ALIGN 或 DML_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_ALIGN 或 DML_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_ROI_ALIGN1_OPERATOR_DESC::ReductionFunction。
InterpolationMode
请参阅 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 约束
InputGradientTensor、InputTensor、OutputGradientTensor、OutputROIGradientTensor,ROITensor 必须具有相同 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 |