我试图创建一个类似于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循环?
此外,此操作的正确术语是什么?开窗?平铺?
答案 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