DML_ROI_ALIGN_GRAD_OPERATOR_DESC結構 (directml.h)
計算 ROI_ALIGN 和 ROI_ALIGN1的反向傳播漸層。
回想一下,DML_ROI_ALIGN1_OPERATOR_DESC 作物,並使用近鄰取樣或雙線性插補來調整輸入張量子系。 假設 InputGradientTensor
的大小與對等 DML_OPERATOR_ROI_ALIGN1的 輸出 相同,這個運算符會產生與 DML_OPERATOR_ROI_ALIGN1輸入 相同大小的 OutputGradientTensor
。
例如,假設有 DML_OPERATOR_ROI_ALIGN1 執行 近鄰 寬度為 1.5x,高度為 0.5x,針對 4 個具有維度之輸入的非重疊裁剪 [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]]]]
請注意,每個區域的第0個元素如何參與輸出中的兩個元素:第1個元素會參與輸出中的一個元素,而第2個和第3個元素則參與輸出中沒有任何元素。
對應的 DML_OPERATOR_ROI_ALIGN_GRAD 會執行下列動作:
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]]]]
總而言之,當區域沒有重疊時,DML_OPERATOR_ROI_ALIGN_GRAD 的行為類似於在 InputGradientTensor
的每個批次上執行的 DML_OPERATOR_RESAMPLE_GRAD。
對於 OutputROIGradientTensor
,數學有點不同,而且可以透過下列虛擬程式代碼來摘要(假設 MinimumSamplesPerOutput == 1
和 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
或 OutputROIGradientTensor
;但至少必須提供一個。
語法
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;
};
成員
InputTensor
類型:_Maybenull_ const DML_TENSOR_DESC*
包含正向傳遞中輸入資料的張量,維度 { BatchCount, ChannelCount, InputHeight, InputWidth }
。 提供 OutputROIGradientTensor
時,或 ReductionFunction == DML_REDUCE_FUNCTION_MAX
時,必須提供這個張量 。 這是提供給 DML_OPERATOR_ROI_ALIGN 或 DML_OPERATOR_ROI_ALIGN1之 InputTensor
的相同張量。
InputGradientTensor
類型:const DML_TENSOR_DESC*
ROITensor
類型:const DML_TENSOR_DESC*
包含感興趣區域 (ROI) 數據的張量—浮點座標中的一系列周框方塊,指向輸入張量 X 和 Y 維度。
ROITensor
允許的維度為 { NumROIs, 4 }
、{ 1, NumROIs, 4 }
或 { 1, 1, NumROIs, 4 }
。 針對每個 ROI,這些值會是左上角和右下角的座標,順序為 [x1, y1, x2, y2]
。 區域可以是空的,這表示所有輸出圖元都來自單一輸入座標,而且區域可以反轉(例如 x2 小於 x1),這表示輸出會接收鏡像/翻轉版本的輸入。 這些座標會先由 SpatialScaleX
和 SpatialScaleY
縮放,但如果兩者都是 1.0,則區域矩形只會直接對應至輸入張量座標。 這是提供給 DML_OPERATOR_ROI_ALIGN 或 DML_OPERATOR_ROI_ALIGN1之 ROITensor
的相同張量。
BatchIndicesTensor
類型:const DML_TENSOR_DESC*
包含要從中擷取ROIS之批次索引的張量。
BatchIndicesTensor
允許的維度為 { NumROIs }
、{ 1, NumROIs }
、{ 1, 1, NumROIs }
或 { 1, 1, 1, NumROIs }
。 每個值都是來自 InputTensor
的批次索引。 如果值不在 範圍中 [0, BatchCount)
,則行為為未定義。 這是提供給 DML_OPERATOR_ROI_ALIGN 或 DML_OPERATOR_ROI_ALIGN1之 BatchIndicesTensor
的相同張量。
OutputGradientTensor
類型:_Maybenull_ const DML_TENSOR_DESC*
輸出張量,包含與 InputTensor
相關的反向傳播漸層。 一般而言,此張量的大小會與正向傳遞中對應 DML_OPERATOR_ROI_ALIGN1 的 輸入 相同。 如果未提供 OutputROIGradientTensor
,則必須提供 OutputGradientTensor
。
OutputROIGradientTensor
類型:_Maybenull_ const DML_TENSOR_DESC*
輸出張量,包含與 ROITensor
相關的反向傳播漸層。 此張量的大小必須與 ROITensor
相同。 如果未提供 OutputGradientTensor
,則必須提供 OutputROIGradientTensor
。
ReductionFunction
請參閱 DML_ROI_ALIGN1_OPERATOR_DESC::ReductionFunction。
InterpolationMode
請參閱 DML_ROI_ALIGN1_OPERATOR_DESC::InterpolationMode。
SpatialScaleX
類型:FLOAT
請參閱 DML_ROI_ALIGN1_OPERATOR_DESC::SpatialScaleX。
SpatialScaleY
類型:FLOAT
請參閱 DML_ROI_ALIGN1_OPERATOR_DESC::SpatialScaleY。
InputPixelOffset
類型:FLOAT
請參閱 DML_ROI_ALIGN1_OPERATOR_DESC::InputPixelOffset。
OutputPixelOffset
類型:FLOAT
請參閱 DML_ROI_ALIGN1_OPERATOR_DESC::OutputPixelOffset。
MinimumSamplesPerOutput
類型:UINT
請參閱 DML_ROI_ALIGN1_OPERATOR_DESC::MinimumSamplesPerOutput。
MaximumSamplesPerOutput
類型:UINT
請參閱 DML_ROI_ALIGN1_OPERATOR_DESC::MaximumSamplesPerOutput。
AlignRegionsToCorners
類型:BOOL
請參閱 DML_ROI_ALIGN1_OPERATOR_DESC::AlignRegionsToCorners。
言論
可用性
此運算子是在 DML_FEATURE_LEVEL_4_1
中引進的。
Tensor 條件約束
InputGradientTensor、InputTensor、OutputGradientTensor、OutputROIGradientTensor,ROITensor 必須具有相同 DataType。
Tensor 支援
DML_FEATURE_LEVEL_4_1和更新版本
張肌 | 類 | 支援的維度計數 | 支援的數據類型 |
---|---|---|---|
InputTensor | 選擇性輸入 | 4 | FLOAT32,FLOAT16 |
InputGradientTensor | 輸入 | 4 | FLOAT32,FLOAT16 |
ROITensor | 輸入 | 2 到 4 | FLOAT32,FLOAT16 |
BatchIndicesTensor | 輸入 | 1 到 4 | UINT32 |
OutputGradientTensor | 選擇性輸出 | 4 | FLOAT32,FLOAT16 |
OutputROIGradientTensor | 選擇性輸出 | 2 到 4 | FLOAT32,FLOAT16 |
要求
要求 | 價值 |
---|---|
標頭 | directml.h |