共用方式為


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

例如,假設有 DML_OPERATOR_ROI_ALIGN1 執行 近鄰 寬度為 1.5x,高度為 0.5x,針對 4 個具有維度之輸入的非重疊裁剪 [1, 1, 4, 4]

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個元素會參與輸出中的一個元素,而第2個和第3個元素則參與輸出中沒有任何元素。

對應的 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 }。 提供 OutputROIGradientTensor 時,或 ReductionFunction == DML_REDUCE_FUNCTION_MAX時,必須提供這個張量 。 這是提供給 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