次の方法で共有


DML_ROI_ALIGN_GRAD_OPERATOR_DESC構造体 (directml.h)

ROI_ALIGNROI_ALIGN1のバックプロパティ グラデーションを計算します。

DML_ROI_ALIGN1_OPERATOR_DESC、ニアイースト ネイバー サンプリングまたはバイリニア補間を使用して、入力テンソルのサブ領域をトリミングして再スケーリングすることを思い出してください。 同等の DML_OPERATOR_ROI_ALIGN1出力 と同じサイズの InputGradientTensor を指定すると、この演算子は、DML_OPERATOR_ROI_ALIGN1入力 と同じサイズの OutputGradientTensor を生成します。

たとえば、最も近い近隣 スケーリングを実行する DML_OPERATOR_ROI_ALIGN1 を、[1, 1, 4, 4]の次元を持つ入力の重複しない 4 つのトリミングについて、幅が 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 番目の要素が出力内の 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 }された前方パスからの入力データを格納するテンソル。 このテンソル OutputROIGradientTensor を指定する場合、または ReductionFunction == DML_REDUCE_FUNCTION_MAXするときに指定する必要があります。 これは、DML_OPERATOR_ROI_ALIGN または DML_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_ALIGN または DML_OPERATOR_ROI_ALIGN1ROITensor に提供されるのと同じテンソルです。

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_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 制約

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

必要条件

要件 価値
ヘッダー directml.h