Share via


DML_ROI_ALIGN_GRAD_OPERATOR_DESC-Struktur (directml.h)

Berechnet Backpropagationsverläufe für ROI_ALIGN und ROI_ALIGN1.

Erinnern Sie daran, dass DML_ROI_ALIGN1_OPERATOR_DESC und Subregionen eines Eingabetensors neu skaliert, indem sie entweder neareast-neighbor Sampling oder bilineare Interpolation verwenden. Bei einem InputGradientTensor -Operator mit den gleichen Größen wie die Ausgabe eines gleichwertigen DML_OPERATOR_ROI_ALIGN1 erzeugt dieser Operator eine OutputGradientTensor mit den gleichen Größen wie die Eingabevon DML_OPERATOR_ROI_ALIGN1.

Betrachten Sie als Beispiel eine DML_OPERATOR_ROI_ALIGN1 , die eine nächstliegende Skalierung von 1,5x in der Breite und 0,5x in der Höhe für 4 nicht überlappende Zuschnitte einer Eingabe mit Dimensionen [1, 1, 4, 4]ausführt:

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]]]]

Beachten Sie, wie das 0. Element jedes Bereichs zu zwei Elementen in der Ausgabe beiträgt– das 1. Element trägt zu einem Element in der Ausgabe bei, und das 2. und das 3. Element tragen zu keinem Element der Ausgabe bei.

Die entsprechende DML_OPERATOR_ROI_ALIGN_GRAD führt Folgendes aus:

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]]]]

Zusammenfassend lässt sich sagen, dass sich DML_OPERATOR_ROI_ALIGN_GRAD ähnlich verhält wie eine DML_OPERATOR_RESAMPLE_GRAD , die InputGradientTensor für jeden Batch des ausgeführt wird, wenn sich die Regionen nicht überschneiden.

Für OutputROIGradientTensorist die Mathematik etwas anders und kann durch den folgenden Pseudocode zusammengefasst werden (vorausgesetzt, dass MinimumSamplesPerOutput == 1 und 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 oder OutputROIGradientTensor kann weggelassen werden, wenn nur eine benötigt wird, aber mindestens eine bereitgestellt werden muss.

Syntax

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;
};

Member

InputTensor

Typ: _Maybenull_ const DML_TENSOR_DESC*

Ein Tensor, der die Eingabedaten aus dem Vorwärtsdurchlauf mit Dimensionen { BatchCount, ChannelCount, InputHeight, InputWidth }enthält. Dieser Tensor muss bereitgestellt werden, wenn OutputROIGradientTensor oder wenn ReductionFunction == DML_REDUCE_FUNCTION_MAXangegeben wird. Dies ist derselbe Tensor, der für DML_OPERATOR_ROI_ALIGN oder DML_OPERATOR_ROI_ALIGN1 bereitgestellt InputTensor wird.

InputGradientTensor

Typ: const DML_TENSOR_DESC*

ROITensor

Typ: const DML_TENSOR_DESC*

Ein Tensor, der die Roi-Daten (Regions of Interest) enthält– eine Reihe von Begrenzungsrahmen in Gleitkommakoordinaten, die auf die X- und Y-Dimensionen des Eingabe tensors zeigen. Die zulässigen Dimensionen von ROITensor sind { NumROIs, 4 }, { 1, NumROIs, 4 }oder { 1, 1, NumROIs, 4 }. Für jeden ROI sind die Werte die Koordinaten der oberen linken und unteren rechten Ecken in der Reihenfolge [x1, y1, x2, y2]. Regionen können leer sein, was bedeutet, dass alle Ausgabepixel aus der einzelnen Eingabekoordinate stammen und Regionen invertiert werden können (z. B. x2 kleiner als x1), was bedeutet, dass die Ausgabe eine gespiegelte/gespiegelte Version der Eingabe empfängt. Diese Koordinaten werden zuerst nach SpatialScaleX und SpatialScaleYskaliert, aber wenn beide 1,0 sind, entsprechen die Bereichsrechtecke einfach direkt den Eingabe-Tensorkoordinaten. Dies ist derselbe Tensor, der für DML_OPERATOR_ROI_ALIGN oder DML_OPERATOR_ROI_ALIGN1 bereitgestellt ROITensor wird.

BatchIndicesTensor

Typ: const DML_TENSOR_DESC*

Ein Tensor, der die Batchindizes enthält, aus denen die ROIs extrahiert werden sollen. Die zulässigen Dimensionen von BatchIndicesTensor sind { NumROIs }, { 1, NumROIs }, { 1, 1, NumROIs }oder { 1, 1, 1, NumROIs }. Jeder Wert ist der Index eines Batches aus InputTensor. Das Verhalten ist nicht definiert, wenn die Werte nicht im Bereich [0, BatchCount)liegen. Dies ist derselbe Tensor, der für DML_OPERATOR_ROI_ALIGN oder DML_OPERATOR_ROI_ALIGN1 bereitgestellt BatchIndicesTensor wird.

OutputGradientTensor

Typ: _Maybenull_ const DML_TENSOR_DESC*

Ein Ausgabe tensor, der die backpropagierten Farbverläufe in Bezug auf InputTensorenthält. In der Regel hat dieser Tensor die gleichen Größen wie die Eingabe des entsprechenden DML_OPERATOR_ROI_ALIGN1 im Vorwärtsdurchlauf. Wenn OutputROIGradientTensor nicht angegeben wird, OutputGradientTensormuss angegeben werden.

OutputROIGradientTensor

Typ: _Maybenull_ const DML_TENSOR_DESC*

Ein Ausgabe tensor, der die backpropagierten Farbverläufe in Bezug auf ROITensorenthält. Dieser Tensor muss die gleichen Größen wie ROITensoraufweisen. Wenn OutputGradientTensor nicht angegeben wird, OutputROIGradientTensormuss angegeben werden.

ReductionFunction

Typ: DML_REDUCE_FUNCTION

Siehe DML_ROI_ALIGN1_OPERATOR_DESC::ReductionFunction.

InterpolationMode

Typ: DML_INTERPOLATION_MODE

Siehe DML_ROI_ALIGN1_OPERATOR_DESC::InterpolationMode.

SpatialScaleX

Typ: FLOAT

Siehe DML_ROI_ALIGN1_OPERATOR_DESC::SpatialScaleX.

SpatialScaleY

Typ: FLOAT

Siehe DML_ROI_ALIGN1_OPERATOR_DESC::SpatialScaleY.

InputPixelOffset

Typ: FLOAT

Siehe DML_ROI_ALIGN1_OPERATOR_DESC::InputPixelOffset.

OutputPixelOffset

Typ: FLOAT

Siehe DML_ROI_ALIGN1_OPERATOR_DESC::OutputPixelOffset.

MinimumSamplesPerOutput

Typ: UINT

Siehe DML_ROI_ALIGN1_OPERATOR_DESC::MinimumSamplesPerOutput.

MaximumSamplesPerOutput

Typ: UINT

Siehe DML_ROI_ALIGN1_OPERATOR_DESC::MaximumSamplesPerOutput.

AlignRegionsToCorners

Typ: BOOL

Siehe DML_ROI_ALIGN1_OPERATOR_DESC::AlignRegionsToCorners.

Hinweise

Verfügbarkeit

Dieser Operator wurde in DML_FEATURE_LEVEL_4_1eingeführt.

Tensoreinschränkungen

InputGradientTensor, InputTensor, OutputGradientTensor, OutputROIGradientTensor und ROITensor müssen denselben Datentyp aufweisen.

Tensorunterstützung

DML_FEATURE_LEVEL_4_1 und höher

Tensor Variante Unterstützte Dimensionsanzahl Unterstützte Datentypen
InputTensor Optionale Eingabe 4 FLOAT32, FLOAT16
InputGradientTensor Eingabe 4 FLOAT32, FLOAT16
ROITensor Eingabe 2 bis 4 FLOAT32, FLOAT16
BatchIndicesTensor Eingabe 1 bis 4 UINT32
OutputGradientTensor Optionale Ausgabe 4 FLOAT32, FLOAT16
OutputROIGradientTensor Optionale Ausgabe 2 bis 4 FLOAT32, FLOAT16

Anforderungen

Anforderung Wert
Header directml.h