我正在为我的项目研究深度学习方法。我需要在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距离。
通常只需计算这种距离矩阵即可通过光谱聚类对图像进行分割。
例如
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. ]
如果有人能帮助我找到一种计算这种矩阵的有效方法,我将不胜感激。
谢谢
答案 0 :(得分:1)
据我了解,目标是对每个像素及其周围的邻居应用减号运算。对我来说,这听起来像是卷积。
请考虑以下卷积过程(假设padding='SAME'
):
3x3内核为每个像素计算中心像素与其左像素之间的差。对于其他邻居,请考虑以下内核:
因此,可以通过以下方式实现目标:
num_channels
将每个内核重复tf.tile
次; tf.nn.depthwise_conv2d
明智地应用每个内核通道; tf.abs
以获取距离; NxCx(HW)x1
并正确堆叠。为实现高效的for
循环,您可以考虑使用tf.map_fn
。