structure DML_SLICE1_OPERATOR_DESC (directml.h)
Extrait une sous-région unique (une « tranche ») d’un tenseur d’entrée.
La fenêtre d’entrée décrit les limites du tenseur d’entrée à prendre en compte dans la tranche. La fenêtre est définie à l’aide de trois valeurs pour chaque dimension.
- Le décalage marque le début de la fenêtre dans une dimension.
- La taille marque l’étendue de la fenêtre dans une dimension. La fin de la fenêtre dans une dimension est
offset + size - 1
. - La foulée indique comment parcourir les éléments d’une dimension.
- L’ampleur de la foulée indique le nombre d’éléments à avancer lors de la copie dans la fenêtre.
- Si une foulée est positive, les éléments sont copiés en commençant au début de la fenêtre dans la dimension.
- Si une foulée est négative, les éléments sont copiés en commençant à la fin de la fenêtre dans la dimension.
Le pseudo-code suivant illustre la façon dont les éléments sont copiés à l’aide de la fenêtre d’entrée. Notez comment les éléments d’une dimension sont copiés du début à la fin avec une foulée positive et copiés de bout en début avec une foulée négative.
CopyStart = InputWindowOffsets
for dimension i in [0, DimensionCount - 1]:
if InputWindowStrides[i] < 0:
CopyStart[i] += InputWindowSizes[i] - 1 // start at the end of the window in this dimension
OutputTensor[OutputCoordinates] = InputTensor[CopyStart + InputWindowStrides * OutputCoordinates]
La fenêtre d’entrée ne doit pas être vide dans une dimension et la fenêtre ne doit pas s’étendre au-delà des dimensions du tenseur d’entrée (les lectures hors limites ne sont pas autorisées). La taille et les foulées de la fenêtre limitent efficacement le nombre d’éléments pouvant être copiés à partir de chaque dimension i
du tenseur d’entrée.
MaxCopiedElements[i] = 1 + (InputWindowSize[i] - 1) / InputWindowStrides[i]
Le tenseur de sortie n’est pas nécessaire pour copier tous les éléments accessibles dans la fenêtre. La tranche est valide tant que 1 <= OutputSizes[i] <= MaxCopiedElements[i]
.
Syntaxe
struct DML_SLICE1_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT DimensionCount;
const UINT *InputWindowOffsets;
const UINT *InputWindowSizes;
const INT *InputWindowStrides;
};
Membres
InputTensor
Type : const DML_TENSOR_DESC*
Tenseur à partir duquel extraire des tranches.
OutputTensor
Type : const DML_TENSOR_DESC*
Tenseur dans lequel écrire les résultats des données segmentées.
DimensionCount
Type : UINT
Nombre de dimensions. Ce champ détermine la taille des tableaux InputWindowOffsets, InputWindowSizes et InputWindowStrides . Cette valeur doit correspondre au DimensionCount des tenseurs d’entrée et de sortie. Cette valeur doit être comprise entre 1 et 8, inclusivement, à partir de DML_FEATURE_LEVEL_3_0
; les niveaux de fonctionnalités antérieurs nécessitent une valeur de 4 ou 5.
InputWindowOffsets
Type : _Field_size_(DimensionCount) const UINT*
Tableau contenant le début (en éléments) de la fenêtre d’entrée dans chaque dimension. Les valeurs du tableau doivent satisfaire à la contrainte InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowSizes
Type : _Field_size_(DimensionCount) const UINT*
Tableau contenant l’étendue (en éléments) de la fenêtre d’entrée dans chaque dimension. Les valeurs du tableau doivent satisfaire à la contrainte InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowStrides
Type : _Field_size_(DimensionCount) const UINT*
Tableau contenant la foulée de la tranche le long de chaque dimension du tenseur d’entrée, dans des éléments. L’ampleur de la foulée indique le nombre d’éléments à avancer lors de la copie dans la fenêtre d’entrée. Le signe de la foulée détermine si les éléments sont copiés en commençant au début de la fenêtre (foulée positive) ou à la fin de la fenêtre (pas négatif). Les foulées peuvent ne pas être 0.
Exemples
Les exemples suivants utilisent ce même tenseur d’entrée.
InputTensor: (Sizes:{1, 1, 4, 4}, DataType:FLOAT32)
[[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]]]
Exemple 1. Tranche enjambée avec des foulées positives
InputWindowOffsets = {0, 0, 0, 1}
InputWindowSizes = {1, 1, 4, 3}
InputWindowStrides = {1, 1, 2, 2}
OutputTensor: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[ 2, 4],
[10, 12]]]]
Les éléments copiés sont calculés comme suit.
Output[0,0,0,0] = {0,0,0,1} + {1,1,2,2} * {0,0,0,0} = Input[{0,0,0,1}] = 2
Output[0,0,0,1] = {0,0,0,1} + {1,1,2,2} * {0,0,0,1} = Input[{0,0,0,3}] = 4
Output[0,0,1,0] = {0,0,0,1} + {1,1,2,2} * {0,0,1,0} = Input[{0,0,2,1}] = 10
Output[0,0,1,1] = {0,0,0,1} + {1,1,2,2} * {0,0,1,1} = Input[{0,0,2,3}] = 12
Exemple 2. Segment à foulées avec des foulées négatives
InputWindowOffsets = {0, 0, 0, 1}
InputWindowSizes = {1, 1, 4, 3}
InputWindowStrides = {1, 1, -2, 2}
OutputTensor: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[14, 16],
[ 6, 8]]]]
Rappelez-vous que les dimensions avec des foulées de fenêtre négatives commencent à copier à la fin de la fenêtre d’entrée pour cette dimension ; pour ce faire, ajoutez InputWindowSize[i] - 1
au décalage de fenêtre. Les dimensions avec une foulée positive commencent simplement à InputWindowOffset[i]
.
- L’axe 0 (
+1
foulée de fenêtre) commence la copie àInputWindowOffsets[0] = 0
. - L’axe 1 (
+1
foulée de fenêtre) commence la copie àInputWindowOffsets[1] = 0
. - L’axe 2 (
-2
foulée de fenêtre) commence la copie à l’emplacementInputWindowOffsets[2] + InputWindowSizes[0] - 1 = 0 + 4 - 1 = 3
. - L’axe 3 (
+2
foulée de fenêtre) commence la copie àInputWindowOffsets[3] = 1
.
Les éléments copiés sont calculés comme suit.
Output[0,0,0,0] = {0,0,3,1} + {1,1,-2,2} * {0,0,0,0} = Input[{0,0,3,1}] = 14
Output[0,0,0,1] = {0,0,3,1} + {1,1,-2,2} * {0,0,0,1} = Input[{0,0,3,3}] = 16
Output[0,0,1,0] = {0,0,3,1} + {1,1,-2,2} * {0,0,1,0} = Input[{0,0,1,1}] = 6
Output[0,0,1,1] = {0,0,3,1} + {1,1,-2,2} * {0,0,1,1} = Input[{0,0,1,3}] = 8
Remarques
Cet opérateur est similaire à DML_SLICE_OPERATOR_DESC, mais il diffère de deux manières importantes.
- Les foulées de tranche peuvent être négatives, ce qui permet d’inverser les valeurs le long des dimensions.
- Les tailles de fenêtre d’entrée ne sont pas nécessairement identiques à celles des tenseurs de sortie.
Disponibilité
Cet opérateur a été introduit dans DML_FEATURE_LEVEL_2_1
.
Contraintes tensoriels
InputTensor et OutputTensor doivent avoir les mêmes DataType et DimensionCount.
Prise en charge de Tensor
DML_FEATURE_LEVEL_4_1 et versions ultérieures
Tenseur | Genre | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|
InputTensor | Entrée | 1 à 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
OutputTensor | Sortie | 1 à 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_3_0 et versions ultérieures
Tenseur | Genre | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|
InputTensor | Entrée | 1 à 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Sortie | 1 à 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_2_1 et versions ultérieures
Tenseur | Genre | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|
InputTensor | Entrée | 4 à 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Sortie | 4 à 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 10 Build 20348 |
Serveur minimal pris en charge | Windows 10 Build 20348 |
En-tête | directml.h |