структура DML_SLICE1_OPERATOR_DESC (directml.h)
Извлекает один регион ("срез") входного тензора.
Окно ввода описывает границы входного тензора, который следует учитывать в срезе. Окно определяется с помощью трех значений для каждого измерения.
- Смещение помечает начало окна в измерении.
- Размер помечает экстент окна в измерении. Конец окна в измерении —
offset + size - 1
. - Шаг показывает, как обходить элементы в измерении.
- Величина шага указывает, сколько элементов следует продвигать при копировании в окне.
- Если шаг положительный, элементы копируются, начиная с начала окна в измерении.
- Если шаг отрицательный, элементы копируются, начиная с конца окна в измерении.
В следующем псевдокоде показано, как элементы копируются с помощью окна ввода. Обратите внимание, как элементы в измерении копируются от начала до конца с положительным шагом и копируются от конца к началу с отрицательным шагом.
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]
Окно ввода не должно быть пустым ни в одном измерении, а окно не должно расширяться за пределы размеров входного тензора (операции чтения вне пределов не разрешены). Размер и шаг окна фактически ограничивают количество элементов, которые могут быть скопированы из каждого измерения i
входного тензора.
MaxCopiedElements[i] = 1 + (InputWindowSize[i] - 1) / InputWindowStrides[i]
Выходной тензор не требуется для копирования всех доступных элементов в окне. Срез действителен до тех пор, как 1 <= OutputSizes[i] <= MaxCopiedElements[i]
.
Синтаксис
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;
};
Члены
InputTensor
Тип: const DML_TENSOR_DESC*
Тензор, из который извлекаются срезы.
OutputTensor
Тип: const DML_TENSOR_DESC*
Тензор, в который записываются результаты срезаных данных.
DimensionCount
Тип: UINT
Количество измерений. Это поле определяет размер массивов InputWindowOffsets, InputWindowSizes и InputWindowStrides . Это значение должно соответствовать DimensionCount входных и выходных тензоров. Это значение должно быть от 1 до 8 включительно, начиная с DML_FEATURE_LEVEL_3_0
; для более ранних уровней функций требуется значение 4 или 5.
InputWindowOffsets
Тип: _Field_size_(DimensionCount) const UINT*
Массив, содержащий начало (в элементах) входного окна в каждом измерении. Значения в массиве должны соответствовать ограничению InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowSizes
Тип: _Field_size_(DimensionCount) const UINT*
Массив, содержащий экстент (в элементах) входного окна в каждом измерении. Значения в массиве должны соответствовать ограничению InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowStrides
Тип: _Field_size_(DimensionCount) const UINT*
Массив, содержащий шаг среза вдоль каждого измерения входного тензора в элементах. Величина шага указывает, сколько элементов следует продвигать при копировании в окне ввода. Знак шага определяет, копируются ли элементы, начиная с начала окна (положительный шаг) или в конце окна (отрицательный шаг). Шаги могут быть не 0.
Примеры
В следующих примерах используется тот же входной тензор.
InputTensor: (Sizes:{1, 1, 4, 4}, DataType:FLOAT32)
[[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]]]
Пример 1. Срез с положительными шагами
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]]]]
Скопированные элементы вычисляются следующим образом.
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
Пример 2. Срез с отрицательными шагами
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]]]]
Помните, что измерения с отрицательными шагами окна начинают копироваться в конце входного окна для этого измерения; Это делается путем добавления InputWindowSize[i] - 1
к смещению окна. Измерения с положительным шагом просто начинаются с InputWindowOffset[i]
.
- Ось 0 (
+1
шаг окна) начинает копирование вInputWindowOffsets[0] = 0
. - Ось 1 (
+1
шаг окна) начинает копирование вInputWindowOffsets[1] = 0
. - Ось 2 (
-2
шаг окна) начинает копирование вInputWindowOffsets[2] + InputWindowSizes[0] - 1 = 0 + 4 - 1 = 3
. - Ось 3 (
+2
шаг окна) начинает копирование вInputWindowOffsets[3] = 1
.
Скопированные элементы вычисляются следующим образом.
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
Комментарии
Этот оператор аналогичен DML_SLICE_OPERATOR_DESC, но отличается двумя важными способами.
- Шаг среза может быть отрицательным, что позволяет изменить значения по измерениям.
- Размеры входных окон не обязательно совпадают с размерами выходных тензоров.
Доступность
Этот оператор появился в DML_FEATURE_LEVEL_2_1
.
Ограничения тензоров
InputTensor и OutputTensor должны иметь одинаковые значения DataType и DimensionCount.
Поддержка тензоров
DML_FEATURE_LEVEL_4_1 и выше
Тензор | Kind | Поддерживаемые счетчики измерений | Поддерживаемые типы данных |
---|---|---|---|
InputTensor | Входные данные | От 1 до 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
OutputTensor | Выходные данные | От 1 до 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_3_0 и выше
Тензор | Kind | Поддерживаемые счетчики измерений | Поддерживаемые типы данных |
---|---|---|---|
InputTensor | Входные данные | От 1 до 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Выходные данные | От 1 до 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_2_1 и выше
Тензор | Kind | Поддерживаемые счетчики измерений | Поддерживаемые типы данных |
---|---|---|---|
InputTensor | Входные данные | от 4 до 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Выходные данные | От 4 до 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | сборка Windows 10 20348 |
Минимальная версия сервера | сборка Windows 10 20348 |
Верхняя часть | directml.h |