如何在张量中重新排列元素,就像在MATLAB中一样?

时间:2017-09-09 07:13:35

标签: tensorflow

例如,我得到张量[30,6,6,3]:30是batch_size,6X6是height x width,3是channels

我怎样才能将其元素从每个3X3重新排列到1X9,就像MATLAB中的像素一样?如图所示: enter image description here

tf.reshape()似乎行不通。

1 个答案:

答案 0 :(得分:1)

您可以使用转置和重塑的组合来进行这些类型的转换。 Numpy和TensorFlow逻辑是一样的,所以这里使用numpy是一个更简单的例子。假设您有4x4数组,并希望通过跳过行/列来将其吐入4个子数组中。

IE,以

开头
a=array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])

你想获得4个子图像,如

[0, 2]
[8, 10]

[1, 3]
[9, 11]

首先,您可以通过单步列生成子阵列

b = a.reshape((4,2,2)).transpose([2,0,1])

这将生成以下数组

array([[[ 0,  2],
        [ 4,  6],
        [ 8, 10],
        [12, 14]],

       [[ 1,  3],
        [ 5,  7],
        [ 9, 11],
        [13, 15]]])

现在你跳过行

c = b.reshape([2,2,2,2]).transpose(2,0,1,3)

这会生成以下数组

array([[[[ 0,  2],
         [ 8, 10]],

        [[ 1,  3],
         [ 9, 11]]],


       [[[ 4,  6],
         [12, 14]],

        [[ 5,  7],
         [13, 15]]]])

现在注意到你有所需的子阵列,但是最左边的形状是2x2,但你想拥有4,所以你重塑

c.reshape([4,2,2])

给你

array([[[ 0,  2],
        [ 8, 10]],

       [[ 1,  3],
        [ 9, 11]],

       [[ 4,  6],
        [12, 14]],

       [[ 5,  7],
        [13, 15]]])

请注意,将n,m数组合并到n*m单维的一般技巧是reshape(m*n, ...)。由于行主要顺序,要展平的尺寸必须在左侧,以便重新整形以用作展平操作。因此,如果在您的示例中,通道是最后一个维度,则需要将它们转置到左侧,展平(使用整形),然后将它们转置回来。