使用指定的對角線範圍產生一個類似識別的矩陣(或其他明確值),而其他元素則填入輸入值或零(如果沒有傳遞 InputTensor )。 對角線值可能會在 DiagonalFillBegin 和 DiagonalFillEnd 之間移動,其中大於零的值會將所有值移向右邊,而小於零會將值移向左邊。 此產生器運算子適用於模型,以避免儲存大型常數張量。 最後兩個之前的任何前置維度都會被視為批次計數,這表示張量會視為 2D 矩陣的堆疊。 此運算子會執行下列虛擬程式代碼:
// Given each current coordinate's x, figure out the corresponding x on the top (0th) row.
// Then fill it with Value if that x coordinate is either within the fill bounds, or outside
// the fill bounds when inverted. Otherwise, use the original input value or zero.
for each coordinate in OutputTensor
topX = coordinate.x - coordinate.y
useValue = (DiagonalFillEnd >= DiagonalFillBegin) ^ (topX >= DiagonalFillBegin) ^ (topX < DiagonalFillEnd)
OutputTensor[coordinate] = if useValue then Value
else if InputTensor not null then InputTensor[coordinate]
else 0
endfor
這很重要
此 API 是 DirectML 獨立可轉散發套件的一部分,請參閱 Microsoft.AI.DirectML 1.9 版和更新版本。 另請參閱 DirectML 版本歷程記錄。
語法
struct DML_DIAGONAL_MATRIX1_OPERATOR_DESC
{
_Maybenull_ const DML_TENSOR_DESC* InputTensor;
const DML_TENSOR_DESC* OutputTensor;
DML_TENSOR_DATA_TYPE ValueDataType;
DML_SCALAR_UNION Value;
INT DiagonalFillBegin;
INT DiagonalFillEnd;
};
成員
InputTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
選擇性的輸入張量。
OutputTensor
類型: const DML_TENSOR_DESC*
要寫入結果的張量。 維度為 { Batch1, Batch2, OutputHeight, OutputWidth }。 高度和寬度不需要是正方形。
ValueDataType
Value 成員的數據類型,必須符合 OutputTensor::D ataType。
Value
類型: DML_SCALAR_UNION
要填入輸出的常數值,以 ValueDataType 決定如何解譯成員。
DiagonalFillBegin
類型: INT
要填入 Value 的範圍下限(開頭包含)。 如果開頭和結尾是反轉的(開始 > 結束),則會反轉填滿。
DiagonalFillEnd
類型: INT
要填入 Value 之範圍的上限(結束獨佔)。 如果開頭和結尾是反轉的(開始 > 結束),則會反轉填滿。
範例
預設身分識別矩陣:
InputTensor: none
ValueDataType: FLOAT32
Value: 7
DiagonalFillBegin: 0
DiagonalFillEnd: 1
OutputTensor: (Sizes:{4,5} DataType:FLOAT32)
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]]
填入 3 元素寬對角線:
InputTensor: none
ValueDataType: FLOAT32
Value: 7
DiagonalFillBegin: 0
DiagonalFillEnd: 3
OutputTensor: (Sizes:{4,5} DataType:FLOAT32)
[[7, 7, 7, 0, 0],
[0, 7, 7, 7, 0],
[0, 0, 7, 7, 7],
[0, 0, 0, 7, 7]]
保持右上對角線半角線(嚴格上三角形),將左下角零。
InputTensor: (Sizes:{4,5} DataType:FLOAT32)
[[4, 7, 3, 7, 9],
[1, 2, 8, 6, 9],
[9, 4, 1, 8, 7],
[4, 3, 4, 2, 4]]
ValueDataType: FLOAT32
Value: 0
DiagonalFillBegin: INT32_MIN
DiagonalFillEnd: 1
OutputTensor: (Sizes:{4,5} DataType:FLOAT32)
[[0, 7, 3, 7, 9],
[0, 0, 8, 6, 9],
[0, 0, 0, 8, 7],
[0, 0, 0, 0, 4]]
只保留對角線中的值,將所有其他值都零。
InputTensor: (Sizes:{4,5} DataType:FLOAT32)
[[4, 7, 3, 7, 9],
[1, 2, 8, 6, 9],
[9, 4, 1, 8, 7],
[4, 3, 4, 2, 4]]
ValueDataType: FLOAT32
Value: 0
DiagonalFillBegin: 1
DiagonalFillEnd: 0
OutputTensor: (Sizes:{4,5} DataType:FLOAT32)
[[4, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 2, 0]]
備註
當DiagonalFillBegin 設定為 DML_OPERATOR_DIAGONAL_MATRIX::Offset,而 DiagonalFillEnd 設定為 DML_OPERATOR_DIAGONAL_MATRIX::Offset + 1 時,這個運算符相當於DML_DIAGONAL_MATRIX_OPERATOR_DESC。
可用性
此運算子是在 DML_FEATURE_LEVEL_5_1 中引進的。
Tensor 條件約束
InputTensor 和 OutputTensor 必須具有相同 的 DataType 和 DimensionCount。
Tensor 支援
| 張量 | 仁慈 (if context refers to kindness) | 支援的維度計數 | 支援的數據類型 |
|---|---|---|---|
| InputTensor 的 | 選擇性輸入 | 2 到 4 | FLOAT64、FLOAT32、FLOAT16、INT64、INT32、INT16、INT8、UINT64、UINT32、UINT16、UINT8 |
| OutputTensor | 輸出 | 2 到 4 | FLOAT64、FLOAT32、FLOAT16、INT64、INT32、INT16、INT8、UINT64、UINT32、UINT16、UINT8 |
需求
| 頁眉 | directml.h |