提取类似于最大合并或可分离卷积的补丁

时间:2018-07-14 08:09:10

标签: python tensorflow convolution max-pooling

我试图创建一个类似于Max Pooling或可分离卷积的第一步的自定义层。

例如,对于2张量,我要提取不重叠的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张量,我想要类似的东西,但也要分开3维。 tf.extract_image_patches 几乎可以满足我的要求,但是它将“深度”维度折叠到每个补丁中。

理想情况下,如果我有一个形状为[32,64,7]的张量,并想从中提取所有的[2,2]色块:我最终会得到一个[16,32,7,4]的形状]

要清楚,我只想提取补丁,而不是实际进行最大池化或可分离的卷积。

由于我实际上并没有扩充数据,所以我怀疑您可以使用一些tf.reshape技巧来完成它...是否有任何好的方法可以在tensorflow中实现此目的而无需依靠切片+缝合/ for循环?

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

1 个答案:

答案 0 :(得分:0)

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