Как вычислить матрицу парных расстояний L1 на очень больших изображениях только по соседству? - PullRequest
0 голосов
/ 29 июня 2018

Я работаю над подходом глубокого обучения для моего проекта. И мне нужно вычислить матрицу расстояний на 4D Tensor, которая будет иметь размер N x 128 x 64 x 64 (размер партии x каналы x высота x ширина) . Матрица расстояний для этого типа тензора будет иметь размер N x 128 x 4096 x 4096 , и этот тип тензора будет невозможно разместить в графическом процессоре, даже для процессора это потребует большого количества памяти. Итак, я хотел бы рассчитать матрицу расстояний только в некоторых соседних пикселях (скажем, в радиусе 5) и рассмотреть эту прямоугольную матрицу для дальнейшей обработки в нейронной сети. При таком подходе моя матрица расстояний будет иметь размер N x 128 x 4096 x 61 . Это займет меньше памяти по сравнению с матрицей полного расстояния.

Точно, я пытаюсь реализовать сети случайного блуждания Convolution для семантической сегментации . Эта сеть должна рассчитать парное расстояние L1 для объектов.

Архитектура

Просто для добавления этого типа матрицы расстояний обычно рассчитывается для сегментации изображения с помощью спектральной кластеризации.

Например

X = [[a,b],[c,d]]

L1_dist = [ [0, |a-b|, |a-c|, 0], 
            [|a-b|, 0, 0, |b-d|], 
            [|a-c|, 0, 0, |c-d| ], 
            [0,    |b-d|, |c-d|, 0 ] 
          ]

Final_L1_dist = [ [0, |a-b|, |a-c|], // "a" is near to b and c. Including self element i.e. a 
            [|a-b|, 0, |b-d|], // "b" is near to a and d. 
            [|a-c|, 0, |c-d| ], // "c" is near to a and d. 
            [|b-d|, |c-d|, 0 ] // "d" is near to b and c. 
          ]

Буду признателен, если кто-нибудь поможет мне найти эффективный способ вычисления такой матрицы.

Спасибо

1 Ответ

0 голосов
/ 29 июня 2018

Насколько я понимаю, цель - применить минус к каждому пикселю и его соседям. Это звучит как свертка для меня.

Рассмотрим следующий процесс свертки (предположим, padding='SAME'):

equation

Ядро 3x3 рассчитывает для каждого пикселя разницу между центральным пикселем и его левым. Для других соседей рассмотрим следующие ядра:

equation

Таким образом, цель может быть достигнута с помощью следующего:

  1. Повторите каждое ядро ​​num_channels раз, используя tf.tile;
  2. Применять каждое ядро ​​по каналам, используя tf.nn.depthwise_conv2d;
  3. Выполните tf.abs, чтобы получить расстояние;
  4. Измените каждый тензор расстояния до NxCx(HW)x1 и сложите их правильно.

Для эффективного цикла for вы можете рассмотреть возможность использования tf.map_fn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...