Поделиться через


структура 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