структура DML_JOIN_OPERATOR_DESC (directml.h)
Объединяет массив входных тензоров вдоль указанной оси.
Входные тензоры могут быть объединены, только если их размеры идентичны во всех измерениях, кроме оси соединения, которая может содержать любой размер, отличный от нуля. Выходные размеры равны размерам входных данных, за исключением оси соединения, которая представляет собой сумму размера всех входных осей соединения. Эти ограничения показаны в псевдокоде ниже.
joinSize = 0;
for (i = 0; i < InputCount; i++) {
assert(inputTensors[i]->DimensionCount == outputTensor->DimensionCount);
for (dim = 0; dim < outputTensor->DimensionCount; dim++) {
if (dim == Axis) { joinSize += inputTensors[i]->Sizes[dim]; }
else { assert(inputTensors[i]->Sizes[dim] == outputTensor->Sizes[dim]); }
}
}
assert(joinSize == outputTensor->Sizes[Axis]);
Объединение одного входного тензора просто создает копию входного тензора.
Этот оператор является обратным DML_SPLIT_OPERATOR_DESC.
Синтаксис
struct DML_JOIN_OPERATOR_DESC {
UINT InputCount;
const DML_TENSOR_DESC *InputTensors;
const DML_TENSOR_DESC *OutputTensor;
UINT Axis;
};
Члены
InputCount
Тип: UINT
Это поле определяет размер массива InputTensors . Это значение должно быть больше 0.
InputTensors
Тип: _Field_size_(InputCount) const DML_TENSOR_DESC*
Массив, содержащий описания тензоров для объединения в один выходной тензор. Все входные тензоры в этом массиве должны иметь одинаковые размеры, за исключением оси соединения, которая может иметь любое ненулевое значение.
OutputTensor
Тип: const DML_TENSOR_DESC*
Тензор, в который записываются соединенные входные тензоры. Выходные размеры должны иметь те же размеры, что и все входные тензоры, за исключением оси соединения, которая должна быть равна сумме размера всех входных осей соединения.
Axis
Тип: UINT
Индекс измерения входных тензоров для соединения. Все входные и выходные тензоры должны иметь одинаковые размеры во всех измерениях, кроме этой оси. Это значение должно находиться в диапазоне [0, OutputTensor.DimensionCount - 1]
.
Примеры
Пример 1. Объединение тензоров только с одной возможной осью
В этом примере тензоры могут быть соединены только вдоль четвертого измерения (ось 3). Соединение любой другой оси невозможно, так как размер тензоров в четвертом измерении не совпадает.
InputCount: 2
Axis: 3
InputTensors[0]: (Sizes:{1, 1, 2, 3}, DataType:FLOAT32)
[[[[ 1, 2, 3],
[ 4, 5, 6]]]]
InputTensors[1]: (Sizes:{1, 1, 2, 4}, DataType:FLOAT32)
[[[[ 7, 8, 9, 10],
[11, 12, 13, 14]]]]
OutputTensor: (Sizes:{1, 1, 2, 7}, DataType:FLOAT32)
[[[[ 1, 2, 3, 7, 8, 9, 10],
[ 4, 5, 6, 11, 12, 13, 14]]]]
Пример 2. Объединение тензоров с несколькими возможными осями:
В следующих примерах используются те же входные тензоры. Так как все входные данные имеют одинаковый размер во всех измерениях, их можно объединить в любом измерении.
InputCount: 3
InputTensors[0]: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[1, 2],
[3, 4]]]]
InputTensors[1]: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[5, 6],
[7, 8]]]]
InputTensors[2]: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[9, 10],
[11, 12]]]]
Присоединение оси 1:
Axis: 1
OutputTensor: (Sizes:{1, 3, 2, 2}, DataType:FLOAT32)
[[[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]],
[[9, 10],
[11, 12]]]]
Присоединение оси 2:
Axis: 2
OutputTensor: (Sizes:{1, 1, 6, 2}, DataType:FLOAT32)
[[[[1, 2],
[3, 4],
[5, 6],
[7, 8],
[9, 10],
[11, 12]]]]
Присоединение оси 3:
Axis: 3
OutputTensor: (Sizes:{1, 1, 2, 6}, DataType:FLOAT32)
[[[[1, 2, 5, 6, 9, 10],
[3, 4, 7, 8, 11, 12]]]]
Доступность
Этот оператор появился в DML_FEATURE_LEVEL_1_0
.
Ограничения тензоров
InputTensors и OutputTensor должны иметь одинаковые значения DataType и DimensionCount.
Поддержка тензоров
DML_FEATURE_LEVEL_4_1 и выше
Тензор | Kind | Поддерживаемые счетчики измерений | Поддерживаемые типы данных |
---|---|---|---|
Входные модули | Массив входных данных | От 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 | Поддерживаемые счетчики измерений | Поддерживаемые типы данных |
---|---|---|---|
Входные модули | Массив входных данных | от 4 до 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Выходные данные | от 4 до 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_2_1 и выше
Тензор | Kind | Поддерживаемые счетчики измерений | Поддерживаемые типы данных |
---|---|---|---|
Входные модули | Массив входных данных | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Выходные данные | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_1_0 и выше
Тензор | Kind | Поддерживаемые счетчики измерений | Поддерживаемые типы данных |
---|---|---|---|
Входные модули | Массив входных данных | 4 | FLOAT32, FLOAT16, INT32, INT16, UINT32, UINT16 |
OutputTensor | Выходные данные | 4 | FLOAT32, FLOAT16, INT32, INT16, UINT32, UINT16 |
Требования
Верхняя часть | directml.h |