如何仅在附近的非常大的图像上计算成对L1距离矩阵?

时间:2018-06-28 21:30:14

标签: c++ numpy tensorflow pytorch

我正在为我的项目研究深度学习方法。我需要在4D张量上计算距离矩阵,其大小为 N x 128 x 64 x 64(批处理大小x通道x高度x宽度)。这种类型的张量的距离矩阵的大小为 N x 128 x 4096 x 4096 ,并且即使在CPU上它也需要大量内存,也无法在GPU中容纳这种类型的张量。因此,我只想计算某些邻域像素(例如,半径在5内)的距离矩阵,并考虑将此矩形矩阵用于神经网络中的进一步处理。通过这种方法,我的距离矩阵的大小将为 N x 128 x 4096 x 61 。与全距离矩阵相比,它将占用更少的内存。

准确地说,我正在尝试实现Convolution Random Walk Networks for Semantic Segmentation。该网络需要计算特征的成对L1距离。

Architecture

通常只需计算这种距离矩阵即可通过光谱聚类对图像进行分割。

例如

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 :(得分:1)

据我了解,目标是对每个像素及其周围的邻居应用减号运算。对我来说,这听起来像是卷积。

请考虑以下卷积过程(假设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