如以下代码所示, tensorflow tf.nn.dilation2D function 的行为与 conventional dilation operator 不同。

import tensorflow as tf
tf.InteractiveSession()
A = [[0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 1, 0, 0],
     [0, 0, 0, 1, 1, 1, 0],
     [0, 0, 0, 0, 1, 0, 0],
     [0, 0, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 0, 0]]
kernel = tf.ones((3,3,1))
input4D = tf.cast(tf.expand_dims(tf.expand_dims(A, -1), 0), tf.float32)
output4D = tf.nn.dilation2d(input4D, filter=kernel, strides=(1,1,1,1), rates=(1,1,1,1), padding="SAME")
print(tf.cast(output4D[0,:,:,0], tf.int32).eval())

返回以下张量:
array([[1, 1, 1, 2, 2, 2, 1],
       [1, 1, 2, 2, 2, 2, 2],
       [1, 1, 2, 2, 2, 2, 2],
       [1, 1, 2, 2, 2, 2, 2],
       [1, 1, 1, 2, 2, 2, 1],
       [1, 1, 1, 1, 1, 1, 1]], dtype=int32)

我既不明白 为什么 它的行为如此,也不明白 我应该如何使用 tf.nn.dilation2d 来检索预期的输出:
array([[0, 0, 0, 1, 1, 1, 0],
       [0, 0, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=int32)

有人可以启发 tensorflow 的简洁文档并解释 tf.nn.dilation2D 函数的作用吗?

最佳答案

正如链接的文档页面中所述,







这意味着将内核的值与每个位置的图像值相加,然后取最大值作为输出值。

将此与相关性进行比较,将乘法替换为加法,并将积分(或和)替换为最大值:

卷积:g(t) = ∫ f(𝜏) h(𝜏-t) d𝜏

膨胀:g(t) = max𝜏 { f(𝜏) + h(𝜏-t) }

或者在离散世界中:

卷积:g[n] = ∑k f[k] h[k-n]

膨胀:g[n] = maxk { f[k] + h[k-n] }

具有二元结构元素(内核,问题称为“常规扩张”)的扩张使用仅包含 1 和 0 的结构元素(内核)。这些表示“包括”和“排除”。也就是说,1 确定结构元素的域。

要使用灰度值膨胀重新创建相同的行为,请将“包含”像素设置为 0,将“排除”像素设置为负无穷大。

例如,问题中使用的 3x3 正方形结构元素应该是 3x3 零矩阵。

关于python - Tensorflow 膨胀的行为与形态膨胀不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54686895/

10-12 17:48