estructura DML_ROI_ALIGN_GRAD_OPERATOR_DESC (directml.h)
Calcula degradados de copia inversa para ROI_ALIGN y ROI_ALIGN1.
Recuerde que DML_ROI_ALIGN1_OPERATOR_DESC cultivos y reascala las subdivisiones de un tensor de entrada mediante el muestreo de vecino cercano o la interpolación bilineal. Dado un
Por ejemplo, considere un DML_OPERATOR_ROI_ALIGN1 que realiza un vecino más cercano escalado de 1,5x en el ancho y 0,5x en el alto, para 4 cultivos no superpuestos de una entrada con dimensiones [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]]]]
Observe cómo el 0º elemento de cada región contribuye a dos elementos de la salida: el primer elemento contribuye a un elemento de la salida y los elementos 2 y 3rd contribuyen a ningún elemento de la salida.
El DML_OPERATOR_ROI_ALIGN_GRAD correspondiente realizaría lo siguiente:
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 resumen, DML_OPERATOR_ROI_ALIGN_GRAD se comporta de forma similar a un DML_OPERATOR_RESAMPLE_GRAD realizado en cada lote del InputGradientTensor
cuando las regiones no se superponen.
Para OutputROIGradientTensor
, las matemáticas son un poco diferentes y se pueden resumir mediante el siguiente pseudocódigo (suponiendo que MinimumSamplesPerOutput == 1
y 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
o OutputROIGradientTensor
se pueden omitir si solo se necesita uno; pero se debe proporcionar al menos uno.
Sintaxis
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;
};
Miembros
InputTensor
Tipo: _Maybenull_ const DML_TENSOR_DESC*
Tensor que contiene los datos de entrada del paso hacia delante con dimensiones { BatchCount, ChannelCount, InputHeight, InputWidth }
. Este tensor debe proporcionarse cuando se suministra OutputROIGradientTensor
o cuando se ReductionFunction == DML_REDUCE_FUNCTION_MAX
. Este es el mismo tensor que se proporcionaría a InputTensor
para DML_OPERATOR_ROI_ALIGN o DML_OPERATOR_ROI_ALIGN1.
InputGradientTensor
Tipo: const DML_TENSOR_DESC*
ROITensor
Tipo: const DML_TENSOR_DESC*
Tensor que contiene las regiones de interés (ROI), una serie de cuadros de límite en coordenadas de punto flotante que apuntan a las dimensiones X e Y del tensor de entrada. Las dimensiones permitidas de ROITensor
son { NumROIs, 4 }
, { 1, NumROIs, 4 }
o { 1, 1, NumROIs, 4 }
. Para cada ROI, los valores serán las coordenadas de sus esquinas superior izquierda e inferior derecha en el orden [x1, y1, x2, y2]
. Las regiones pueden estar vacías, lo que significa que todos los píxeles de salida proceden de la única coordenada de entrada y las regiones se pueden invertir (por ejemplo, x2 menos que x1), lo que significa que la salida recibe una versión reflejada/volteada de la entrada. Estas coordenadas se escalan primero por SpatialScaleX
y SpatialScaleY
, pero si ambas son 1,0, los rectángulos de región simplemente se corresponden directamente con las coordenadas de tensor de entrada. Este es el mismo tensor que se proporcionaría a ROITensor
para DML_OPERATOR_ROI_ALIGN o DML_OPERATOR_ROI_ALIGN1.
BatchIndicesTensor
Tipo: const DML_TENSOR_DESC*
Tensor que contiene los índices de lote de los que extraer las ROIs. Las dimensiones permitidas de BatchIndicesTensor
son { NumROIs }
, { 1, NumROIs }
, { 1, 1, NumROIs }
o { 1, 1, 1, NumROIs }
. Cada valor es el índice de un lote de InputTensor
. El comportamiento no está definido si los valores no están en el intervalo [0, BatchCount)
. Este es el mismo tensor que se proporcionaría a BatchIndicesTensor
para DML_OPERATOR_ROI_ALIGN o DML_OPERATOR_ROI_ALIGN1.
OutputGradientTensor
Tipo: _Maybenull_ const DML_TENSOR_DESC*
Tensor de salida que contiene los degradados de copia inversa con respecto a InputTensor
. Normalmente, este tensor tendría los mismos tamaños que la entrada del DML_OPERATOR_ROI_ALIGN1 correspondiente en el paso hacia delante. Si no se proporciona OutputROIGradientTensor
, OutputGradientTensor
debe proporcionarse.
OutputROIGradientTensor
Tipo: _Maybenull_ const DML_TENSOR_DESC*
Tensor de salida que contiene los degradados de copia inversa con respecto a ROITensor
. Este tensor debe tener los mismos tamaños que ROITensor
. Si no se proporciona OutputGradientTensor
, OutputROIGradientTensor
debe proporcionarse.
ReductionFunction
Tipo: DML_REDUCE_FUNCTION
Consulte DML_ROI_ALIGN1_OPERATOR_DESC::ReductionFunction.
InterpolationMode
Tipo: DML_INTERPOLATION_MODE
Vea DML_ROI_ALIGN1_OPERATOR_DESC::InterpolationMode.
SpatialScaleX
Tipo: FLOAT de
Consulte DML_ROI_ALIGN1_OPERATOR_DESC::SpatialScaleX.
SpatialScaleY
Tipo: FLOAT de
Consulte DML_ROI_ALIGN1_OPERATOR_DESC::SpatialScaleY.
InputPixelOffset
Tipo: FLOAT de
Consulte DML_ROI_ALIGN1_OPERATOR_DESC::InputPixelOffset.
OutputPixelOffset
Tipo: FLOAT de
Consulte DML_ROI_ALIGN1_OPERATOR_DESC::OutputPixelOffset.
MinimumSamplesPerOutput
Tipo: UINT de
Consulte DML_ROI_ALIGN1_OPERATOR_DESC::MinimumSamplesPerOutput.
MaximumSamplesPerOutput
Tipo: UINT de
Consulte DML_ROI_ALIGN1_OPERATOR_DESC::MaximumSamplesPerOutput.
AlignRegionsToCorners
Tipo: BOOL de
Consulte DML_ROI_ALIGN1_OPERATOR_DESC::AlignRegionsToCorners.
Observaciones
Disponibilidad
Este operador se introdujo en DML_FEATURE_LEVEL_4_1
.
Restricciones tensor
InputGradientTensor, InputTensor, OutputGradientTensor, OutputROIGradientTensory ROITensor deben tener el mismo DataType.
Compatibilidad con Tensor
DML_FEATURE_LEVEL_4_1 y versiones posteriores
Tensor | Amable | Recuentos de dimensiones admitidos | Tipos de datos admitidos |
---|---|---|---|
InputTensor | Entrada opcional | 4 | FLOAT32, FLOAT16 |
InputGradientTensor | Entrada | 4 | FLOAT32, FLOAT16 |
ROITensor | Entrada | De 2 a 4 | FLOAT32, FLOAT16 |
BatchIndicesTensor | Entrada | De 1 a 4 | UINT32 |
OutputGradientTensor | Salida opcional | 4 | FLOAT32, FLOAT16 |
OutputROIGradientTensor | Salida opcional | De 2 a 4 | FLOAT32, FLOAT16 |
Requisitos
Requisito | Valor |
---|---|
encabezado de |
directml.h |