python - Tensorflow 膨胀的行为与形态膨胀不同
问题描述
如以下代码所示,张量流tf.nn.dilation2D
函数的行为不像传统的膨胀运算符。
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
函数的作用吗?
解决方案
如链接的文档页面中所述,
计算 4-D 输入和 3-D 滤波器张量的灰度膨胀。
和
详细地说,灰度形态二维膨胀是最大和相关 [...]
这意味着将内核的值添加到每个位置的图像值中,然后将最大值作为输出值。
将此与相关性进行比较,将乘法替换为加法,将积分(或总和)替换为最大值:
卷积:g ( t ) = ∫ f () h (- t ) d
膨胀:g ( t ) = 最大值{ f () + h (- t ) }
或者在离散世界中:
卷积:g [ n ] = ∑<sub> k f [ k ] h [ k - n ]
膨胀:g [ n ] = max k { f [ k ] + h [ k - n ] }
具有二进制结构元素的膨胀(内核,问题称为“常规膨胀”)使用仅包含 1 和 0 的结构元素(内核)。这些表示“包含”和“排除”。也就是说,1 决定了结构元素的域。
要使用灰度值膨胀重新创建相同的行为,请将“包含”像素设置为 0,将“排除”像素设置为负无穷大。
例如,问题中使用的 3x3 方形结构元素应该是 3x3 零矩阵。
推荐阅读
- chatbot - Microsoft LUIS 多语言支持
- javascript - Firefox JavaScript 中的插件 - 将本机应用程序与 Promise 链接
- hadoop - 如何获取特定配置单元查询的 CPU、内存和 IO 使用情况?
- rest - 从QA工程师的角度如何搭建mock server
- javascript - 如何在 three.js 中使用 AMFLoader 加载 3D 对象?
- sql - 为什么 SQLite CTE JOIN 中的 RANDOM() 行为与其他 RDBMS 不同?
- kubernetes - 在实现 HA Kubernetes 集群时将 master1 和 master2 添加到负载均衡器
- collections - 如何在集合聚合器中一次聚合 10 条记录?我想用集合拆分器拆分 100 条记录
- java - 将物品添加到库存混乱中
- google-chrome - 允许 Chrome 上的 Google Colab 域 cookie