首页 > 解决方案 > 提取类似于最大池或可分离卷积的补丁

问题描述

我正在尝试创建一个类似于 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循环?

此外,此操作的正确术语是什么?开窗?平铺?

标签: pythontensorflowconvolutionmax-pooling

解决方案


事实证明,使用 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

推荐阅读