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
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, OutputGradientTensor
doit ê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, OutputROIGradientTensor
doit ê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
Consultez DML_ROI_ALIGN1_OPERATOR_DESC ::SpatialScaleX.
SpatialScaleY
Voir DML_ROI_ALIGN1_OPERATOR_DESC ::SpatialScaleY.
InputPixelOffset
Consultez DML_ROI_ALIGN1_OPERATOR_DESC ::InputPixelOffset.
OutputPixelOffset
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 |