Partager via


structure DML_ROI_ALIGN_GRAD_OPERATOR_DESC (directml.h)

Calcule des dégradés de rétropropagation pour ROI_ALIGN et ROI_ALIGN1.

Rappelez-vous que DML_ROI_ALIGN1_OPERATOR_DESC cultures et redimensionne les sous-régions d’un tensoreur d’entrée à l’aide de l’échantillonnage voisin proche ou de l’interpolation biligne. Étant donné une avec les mêmes tailles que la sortie d’un DML_OPERATOR_ROI_ALIGN1équivalent, cet opérateur produit un avec les mêmes tailles que les d’entrée de DML_OPERATOR_ROI_ALIGN1.

Prenons l’exemple d’un DML_OPERATOR_ROI_ALIGN1 qui effectue un voisin le plus proche mise à l’échelle de 1,5x dans la largeur, et 0,5x dans la hauteur, pour 4 cultures sans chevauchement d’une entrée avec des dimensions [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]]]]

Notez comment le 0ème élément de chaque région contribue à deux éléments dans la sortie : le 1er élément contribue à un élément de la sortie, et les éléments 2e et 3ème contribuent à aucun élément de la sortie.

Les DML_OPERATOR_ROI_ALIGN_GRAD correspondantes effectuent les opérations suivantes :

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

En résumé, DML_OPERATOR_ROI_ALIGN_GRAD se comporte de la même façon qu’une DML_OPERATOR_RESAMPLE_GRAD effectuée sur chaque lot de l'InputGradientTensor lorsque les régions ne se chevauchent pas.

Pour OutputROIGradientTensor, les mathématiques sont un peu différentes et peuvent être résumées par le pseudo-code suivant (en supposant que MinimumSamplesPerOutput == 1 et 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 ou OutputROIGradientTensor peut être omis si un seul est nécessaire ; mais au moins un doit être fourni.

Syntaxe

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

Membres

InputTensor

Type : _Maybenull_ const DML_TENSOR_DESC*

Un capteur contenant les données d’entrée de la passe avant avec des dimensions { BatchCount, ChannelCount, InputHeight, InputWidth }. Ce tensoriel doit être fourni lorsque OutputROIGradientTensor est fourni, ou lorsque ReductionFunction == DML_REDUCE_FUNCTION_MAX. Il s’agit du même capteur que celui qui serait fourni à InputTensor pour DML_OPERATOR_ROI_ALIGN ou DML_OPERATOR_ROI_ALIGN1.

InputGradientTensor

Type : const DML_TENSOR_DESC*

ROITensor

Type : const DML_TENSOR_DESC*

Un capteur contenant les données d’intérêt (ROI), une série de zones englobantes en coordonnées à virgule flottante qui pointent dans les dimensions X et Y du capteur d’entrée. Les dimensions autorisées de ROITensor sont { NumROIs, 4 }, { 1, NumROIs, 4 }ou { 1, 1, NumROIs, 4 }. Pour chaque retour sur investissement, les valeurs sont les coordonnées de ses coins supérieur gauche et inférieur droit dans l’ordre [x1, y1, x2, y2]. Les régions peuvent être vides, ce qui signifie que tous les pixels de sortie proviennent de la coordonnée d’entrée unique et que les régions peuvent être inversées (par exemple, x2 inférieures à x1), ce qui signifie que la sortie reçoit une version mise en miroir/inversée de l’entrée. Ces coordonnées sont d’abord mises à l’échelle par SpatialScaleX et SpatialScaleY, mais si elles sont toutes deux 1,0, les rectangles de région correspondent simplement directement aux coordonnées de capteur d’entrée. Il s’agit du même capteur que celui qui serait fourni à ROITensor pour DML_OPERATOR_ROI_ALIGN ou DML_OPERATOR_ROI_ALIGN1.

BatchIndicesTensor

Type : const DML_TENSOR_DESC*

Ensor contenant les index de lot à partir duquel extraire les ROIs. Les dimensions autorisées de BatchIndicesTensor sont { NumROIs }, { 1, NumROIs }, { 1, 1, NumROIs }ou { 1, 1, 1, NumROIs }. Chaque valeur est l’index d’un lot de InputTensor. Le comportement n’est pas défini si les valeurs ne figurent pas dans la plage [0, BatchCount). Il s’agit du même capteur que celui qui serait fourni à BatchIndicesTensor pour DML_OPERATOR_ROI_ALIGN ou DML_OPERATOR_ROI_ALIGN1.

OutputGradientTensor

Type : _Maybenull_ const DML_TENSOR_DESC*

Un capteur de sortie contenant les dégradés backpropagated par rapport à InputTensor. En règle générale, ce tensoriel aurait les mêmes tailles que les d’entrée des DML_OPERATOR_ROI_ALIGN1 correspondantes dans le passage avant. Si OutputROIGradientTensor n’est pas fourni, OutputGradientTensordoit être fournie.

OutputROIGradientTensor

Type : _Maybenull_ const DML_TENSOR_DESC*

Un capteur de sortie contenant les dégradés backpropagated par rapport à ROITensor. Ce capteur doit avoir les mêmes tailles que ROITensor. Si OutputGradientTensor n’est pas fourni, OutputROIGradientTensordoit être fournie.

ReductionFunction

Type : DML_REDUCE_FUNCTION

Voir DML_ROI_ALIGN1_OPERATOR_DESC ::ReductionFunction.

InterpolationMode

Type : DML_INTERPOLATION_MODE

Consultez DML_ROI_ALIGN1_OPERATOR_DESC ::InterpolationMode.

SpatialScaleX

Type : FLOAT

Consultez DML_ROI_ALIGN1_OPERATOR_DESC ::SpatialScaleX.

SpatialScaleY

Type : FLOAT

Voir DML_ROI_ALIGN1_OPERATOR_DESC ::SpatialScaleY.

InputPixelOffset

Type : FLOAT

Consultez DML_ROI_ALIGN1_OPERATOR_DESC ::InputPixelOffset.

OutputPixelOffset

Type : FLOAT

Consultez DML_ROI_ALIGN1_OPERATOR_DESC ::OutputPixelOffset.

MinimumSamplesPerOutput

Type : UINT

Voir DML_ROI_ALIGN1_OPERATOR_DESC ::MinimumSamplesPerOutput.

MaximumSamplesPerOutput

Type : UINT

Voir DML_ROI_ALIGN1_OPERATOR_DESC ::MaximumSamplesPerOutput.

AlignRegionsToCorners

Type : BOOL

Voir DML_ROI_ALIGN1_OPERATOR_DESC ::AlignRegionsToCorners.

Remarques

Disponibilité

Cet opérateur a été introduit dans DML_FEATURE_LEVEL_4_1.

Contraintes Tensor

InputGradientTensor , InputTensor , OutputGradientTensor, OutputROIGradientTensoret ROITensor doit avoir le même DataType.

Prise en charge de Tensor

DML_FEATURE_LEVEL_4_1 et versions ultérieures

Tenseur Gentil Nombres de dimensions pris en charge Types de données pris en charge
InputTensor Entrée facultative 4 FLOAT32, FLOAT16
InputGradientTensor Entrée 4 FLOAT32, FLOAT16
ROITensor Entrée 2 à 4 FLOAT32, FLOAT16
BatchIndicesTensor Entrée 1 à 4 UINT32
OutputGradientTensor Sortie facultative 4 FLOAT32, FLOAT16
OutputROIGradientTensor Sortie facultative 2 à 4 FLOAT32, FLOAT16

Exigences

Exigence Valeur
d’en-tête directml.h