如以下代码所示,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)
有人能启发张量流的简洁文档并解释tf.nn.dilation2D
函数的作用吗?
答案 0 :(得分:0)
如链接的文档页面所述,
计算4D输入和3D滤波器张量的灰度膨胀。
和
详细地说,灰度形态学二维扩展是最大和相关[...]
这意味着将内核的值添加到每个位置的图像的值,然后将最大值作为输出值。
将此与相关性进行比较,将相乘替换为加法,并将积分(或总和)替换为最大值:
卷积: g ( t )=∫ f () h (- t < / em>)d
膨胀: g ( t )= max { f ()+ h (- t )}
或者在离散世界中:
卷积: g [ n ] = ∑ k f [< em> k ] h [ k - n ]
膨胀: g [ n ] = max k { f [ k ] + h [ k - n ]}
带有二进制结构化元素(内核,这个问题称为“常规膨胀”)的膨胀使用仅包含1和0的结构化元素(内核)。这些指示“包括”和“排除”。也就是说,1决定了结构元素的域。
要使用灰度值扩散重新创建相同的行为,请将“包括”像素设置为0,将“排除”像素设置为负无穷大。
例如,问题中使用的3x3正方形结构元素应为零的3x3矩阵。
答案 1 :(得分:0)
可以这样做:
def dilation2d(self, img4D):
'''
'''
with tf.variable_scope('dilation2d'):
kernel = tf.ones((3, 3, img4D.get_shape()[3]))
output4D = tf.nn.dilation2d(img4D, filter=kernel, strides=(1,1,1,1), rates=(1,1,1,1), padding="SAME")
output4D = output4D - tf.ones_like(output4D)
return output4D