Freigeben über


DML_ROI_ALIGN_GRAD_OPERATOR_DESC Struktur (directml.h)

Berechnet Hintergrundeigenschaftenverläufe für ROI_ALIGN und ROI_ALIGN1.

Erinnern Sie sich daran, dass DML_ROI_ALIGN1_OPERATOR_DESC Teilregionen eines Eingabe-Tensors unter Verwendung von Nahast-Nachbar-Sampling oder bilinearer Interpolation neu skalieren. Angesichts einer InputGradientTensor mit den gleichen Größen wie die Ausgabe eines entsprechenden DML_OPERATOR_ROI_ALIGN1erzeugt dieser Operator eine OutputGradientTensor mit den gleichen Größen wie die Eingabe von DML_OPERATOR_ROI_ALIGN1.

Betrachten Sie beispielsweise eine DML_OPERATOR_ROI_ALIGN1, die eine nächsten Nachbarn Skalierung von 1,5x in der Breite und 0,5x in der Höhe für 4 nicht überlappende Kulturen 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, dass das 0. Element jeder Region zu zwei Elementen in der Ausgabe beiträgt – das 1. Element trägt zu einem Element in der Ausgabe bei, und die 2. und 3. Elemente tragen zu keinen Elementen der Ausgabe bei.

Die entsprechende DML_OPERATOR_ROI_ALIGN_GRAD würde Folgendes ausführen:

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 verhält sich DML_OPERATOR_ROI_ALIGN_GRAD ähnlich wie eine DML_OPERATOR_RESAMPLE_GRAD, die für jeden Batch der InputGradientTensor ausgeführt wird, wenn sich Regionen nicht überlappen.

Für OutputROIGradientTensorist die Mathematik etwas anders und kann mit dem 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 können weggelassen werden, wenn nur eine benötigt wird; aber mindestens eine muss bereitgestellt werden.

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

Angehörige

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 angegeben werden, wenn OutputROIGradientTensor geliefert wird oder wenn ReductionFunction == DML_REDUCE_FUNCTION_MAX. Dies ist derselbe Tensor, der für DML_OPERATOR_ROI_ALIGN oder DML_OPERATOR_ROI_ALIGN1InputTensor bereitgestellt wird.

InputGradientTensor

Typ: DML_TENSOR_DESC*

ROITensor

Typ: DML_TENSOR_DESC*

Ein Tensor, der die Regionen von Interesse (ROI) enthält – eine Reihe von umgebenden Feldern in Gleitkommakoordinaten, die in die X- und Y-Dimensionen des Eingabe-Tensors zeigen. Die zulässigen Abmessungen 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]. Bereiche können leer sein, was bedeutet, dass alle Ausgabepixel aus der einzelnen Eingabekoordinate stammen, und Regionen können invertiert werden (z. B. x2 kleiner als x1), was bedeutet, dass die Ausgabe eine gespiegelte/gespiegelte Version der Eingabe empfängt. Diese Koordinaten werden zuerst durch 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_ALIGN1ROITensor bereitgestellt wird.

BatchIndicesTensor

Typ: DML_TENSOR_DESC*

Ein Tensor, der die Batchindizes enthält, aus denen die ROIs extrahiert werden sollen. Die zulässigen Abmessungen 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 sich die Werte nicht im Bereich [0, BatchCount)befinden. Dies ist derselbe Tensor, der für DML_OPERATOR_ROI_ALIGN oder DML_OPERATOR_ROI_ALIGN1BatchIndicesTensor bereitgestellt wird.

OutputGradientTensor

Typ: _Maybenull_ const DML_TENSOR_DESC*

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

OutputROIGradientTensor

Typ: _Maybenull_ const DML_TENSOR_DESC*

Ein Ausgabe-Tensor, der die umgekehrten Farbverläufe in Bezug auf ROITensorenthält. Dieser Tensor muss die gleichen Größen wie ROITensorhaben. Wenn OutputGradientTensor nicht angegeben wird, muss OutputROIGradientTensor 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.

Bemerkungen

Verfügbarkeit

Dieser Operator wurde in DML_FEATURE_LEVEL_4_1eingeführt.

Tensoreinschränkungen

InputGradientTensor, InputTensor, OutputGradientTensor, OutputROIGradientTensor, und ROITensor- müssen denselben DataType-haben.

Tensorunterstützung

DML_FEATURE_LEVEL_4_1 und höher

Tensor Art 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