张量,像卷积一样重塑



我有一个矩阵[3,3,256],我的最终输出必须为[4,2,2,256],我必须使用诸如'卷积'的重塑,而不会更改值。(在这种情况下,使用过滤器2x2(。是否有一种使用TensorFlow进行此操作的方法?

如果我正确理解您的问题,您想将原始值冗余地存储在新结构中(没有最后一个dim的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]]]]

我对您有类似的问题,我发现在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])

获得最终结果。

最新更新