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します。

たとえば、入力の重なり合っていない 4 つのトリミングに対して、最[1, 1, 4, 4]も近い近隣のスケーリングを幅に 1.5 倍、高さが 0.5 倍のDML_OPERATOR_ROI_ALIGN1について考えてみます。

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 番目の要素が出力内の 2 つの要素にどのように影響するかに注目してください。1 番目の要素は出力内の 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

OutputGradientTensor または OutputROIGradientTensor は、1 つだけ必要な場合は省略できますが、少なくとも 1 つを指定する必要があります。

構文

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 }を含むテンソル。 このテンソルは、 が指定されたとき、または の場合OutputROIGradientTensorReductionFunction == DML_REDUCE_FUNCTION_MAXに指定する必要があります。 これは、DML_OPERATOR_ROI_ALIGNまたはDML_OPERATOR_ROI_ALIGN1に提供される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 未満など) できます。つまり、出力はミラー化/反転されたバージョンの入力を受け取ります。 これらの座標は最初に と SpatialScaleYによってSpatialScaleXスケーリングされますが、両方が 1.0 の場合、領域の四角形は入力テンソル座標に直接対応するだけです。 これは、DML_OPERATOR_ROI_ALIGNまたはDML_OPERATOR_ROI_ALIGN1に提供されるROITensorのと同じテンソルです。

BatchIndicesTensor

型: const DML_TENSOR_DESC*

ROI を抽出するバッチ インデックスを含むテンソル。 の許容されるディメンション BatchIndicesTensor は、 { NumROIs }{ 1, NumROIs }{ 1, 1, NumROIs }、または です { 1, 1, 1, NumROIs }。 各値は、 からの InputTensorバッチのインデックスです。 値が の範囲内 [0, BatchCount)にない場合、動作は未定義です。 これは、DML_OPERATOR_ROI_ALIGNまたはDML_OPERATOR_ROI_ALIGN1に提供されるBatchIndicesTensorのと同じテンソルです。

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導入されました。

テンソル制約

InputGradientTensorInputTensorOutputGradientTensorOutput ROIGradientTensorおよび 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

要件

要件
Header directml.h