python - 提取类似于最大池或可分离卷积的补丁
问题描述
我正在尝试创建一个类似于 Max Pooling 或可分离卷积的第一步的自定义层。
例如,对于一个 2-Tensor,我想在其中提取不重叠的 2x2 补丁:如果我有[4,4]
张量
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9,10,11],
[12,13,14,15]]
我想结束以下[2,2,4
]张量
[[[ 0, 1, 4, 5],[ 2, 3, 6, 7]],
[[ 8, 9,12,13],[10,11,14,15]]]
对于 3-Tensor,我想要类似的东西,但也要分离出第三维。tf.extract_image_patches
几乎可以满足我的要求,但是它将“深度”维度折叠到每个补丁中。
理想情况下,如果我有一个形状为 [32,64,7] 的张量并想从中提取所有 [2,2] 块:我最终会得到一个 [16,32,7,4] 的形状
需要明确的是,我只想提取补丁,而不是实际进行最大池化或可分离卷积。
由于我实际上并没有增加数据,我怀疑你可以用一些tf.reshape
技巧来做到这一点......有没有什么好的方法可以在 tensorflow 中实现这一点而无需使用切片+拼接/for循环?
此外,此操作的正确术语是什么?开窗?平铺?
解决方案
事实证明,使用 tf.transpose 很容易做到这一点。最终为我工作的解决方案是:
#Assume x is in BHWC form
def pool(x,size=2):
channels = x.get_shape()[-1]
x = tf.extract_image_patches(
x,
ksizes=[1,size,size,1],
strides=[1,size,size,1],
rates=[1,1,1,1],
padding="SAME"
)
x = tf.reshape(x,[-1],x.get_shape()[1:3]+[size**2,channels])
x = tf.transpose(x,[0,1,2,4,3])
return x
推荐阅读
- javascript - 如何防止谷歌浏览器缓冲
- angular - 在我的自定义输入模板中使用 ngx-formly 模板“pdfviewer”
- python - 如何操作 MultiIndex 熊猫系列?
- c# - 如何使用 iTextSharp 在特定打印机上打印现有的 pdf 文件?
- eclipselink - Eclipselink 继承策略导致查询格式错误
- c# - 在 .NET MVC5 应用程序中找不到自定义错误页面的来源
- visual-studio-code - 如何仅更改编辑器窗口的语法主题,而不是整个 UI
- reactjs - React Private Route Redirect 不适用于 Asp.net 核心
- python - 从所需类型的 excel 文件 pandas 中读取
- docker - Node 和 Docker 的最佳构建工作流程