Tensorflow,重塑像卷积

时间:2018-04-03 22:02:29

标签: tensorflow convolution

我有一个矩阵[3,3,256],我的最终输出必须是[4,2,2,256],我必须使用像''卷积'没有改变价值观。 (在这种情况下使用过滤器2x2)。有没有一种方法可以使用tensorflow来做到这一点?

2 个答案:

答案 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])

获得最终结果。