我有一个矩阵[3,3,256],我的最终输出必须是[4,2,2,256],我必须使用像''卷积'没有改变价值观。 (在这种情况下使用过滤器2x2)。有没有一种方法可以使用tensorflow来做到这一点?
答案 0 :(得分:0)
如果我理解你的问题,你想在新结构中冗余地存储原始值,就像这样(没有256的最后一个调整):
[ [ 1 2 3 ] [ [ 1 2 ] [ [ 2 3 ] [ [ 4 5 ] [ [ 5 6 ]
[ 4 5 6 ] => [ 4 5 ] ], [ 5 6 ] ], [ 7 8 ] ], [ 8 9 ] ]
[ 7 8 9 ] ]
如果是,您可以使用索引,这样,x
是原始张量,然后堆叠它们:
x2 = []
for i in xrange( 2 ):
for j in xrange( 2 ):
x2.append( x[ i : i + 2, j : j + 2, : ] )
y = tf.stack( x2, axis = 0 )
根据您的评论,如果确实想要避免使用任何循环,您可以使用tf.extract_image_patches
,如下所示(经过测试的代码),但您应该运行一些测试,因为这可能实际上在效率和性能方面比上面更差:
import tensorflow as tf
sess = tf.Session()
x = tf.constant( [ [ [ 1, -1 ], [ 2, -2 ], [ 3, -3 ] ],
[ [ 4, -4 ], [ 5, -5 ], [ 6, -6 ] ],
[ [ 7, -7 ], [ 8, -8 ], [ 9, -9 ] ] ] )
xT = tf.transpose( x, perm = [ 2, 0, 1 ] ) # have to put channel dim as batch for tf.extract_image_patches
xTE = tf.expand_dims( xT, axis = -1 ) # extend dims to have fake channel dim
xP = tf.extract_image_patches( xTE, ksizes = [ 1, 2, 2, 1 ],
strides = [ 1, 1, 1, 1 ], rates = [ 1, 1, 1, 1 ], padding = "VALID" )
y = tf.transpose( xP, perm = [ 3, 1, 2, 0 ] ) # move dims back to original and new dim up front
print( sess.run(y) )
输出(手动添加水平分隔线以提高可读性):
[[[[1 -1] [2 -2]]
[[4 -4] [5 -5]]]
[[[2 -2] [3 -3]]
[[5 -5] [6 -6]]]
[[[4 -4] [5 -5]]
[[7 -7] [8 -8]]]
[[[5 -5] [6 -6]]
[[8 -8] [9 -9]]]]
答案 1 :(得分:0)
我对您也有类似的问题,我发现tf.contrib.kfac.utils
中有一个名为extract_convolution_patches
的函数。假设您有一个形状为X
的张量(1, 3, 3, 256)
,其中初始1表示批处理大小,则可以调用
Y = tf.contrib.kfac.utils.extract_convolution_patches(X, (2, 2, 256, 1), padding='VALID')
Y.shape # (1, 2, 2, 2, 2, 256)
前两个2将是您的输出过滤器的数量(组成您描述中的4
)。后两个2将是滤波器的形状。然后,您可以致电
Y = tf.reshape(Y, [4,2,2,256])
获得最终结果。