如何切片张量的一部分?

时间:2017-06-26 06:10:01

标签: python tensorflow

我想切片[3.0,33.0]。我试图通过以下代码访问此切片。关于tf.slice命令,我不太清楚。我对文档中提到的有关此命令的开头和大小不太清楚。有人可以让它易于理解。

batch = tf.constant([
  [#First image
    [[0.0,10.0],[1.0,11.0]],
    [[3.0,33.0],[4.0,44.0]]
  ],
  [#Second image
    [[5.0,55.0],[6.0,66.0]],
    [[7.0,77.0],[8.0,88.0]]
  ]
])
slice1 = tf.slice(batch,[0,0,0,0], [0,0,1,0]) 
sess = tf.InteractiveSEssion()
sess.run(tf.initialize_all_variables())
print slice1.eval()

1 个答案:

答案 0 :(得分:4)

我将用示例解释您的代码,因此我创建了一些案例,但首先我会向您解释tf.slice(input, begin, size)参数:

  • input是对Tensor的引用。
  • begin是切片开始的索引。
  • size是切片的偏移量。

因此,tf.slice可以从input选择从begin索引开始到begin + size结束的子张量,处理begin和{{1}作为索引向量。下面的例子将澄清这一点:

size

这种情况下的输出是:

batch = tf.constant([
        [#First image
            [
                [0.0,10.0],
                [1.0,11.0]
            ],
            [
                [3.0,33.0],
                [4.0,44.0]
            ]
        ],
        [#Second image
            [
                [5.0,55.0],
                [6.0,66.0]
            ],
            [
                [7.0,77.0],
                [8.0,88.0]
            ]
        ]
    ])
slice1 = tf.slice(batch,[0,0,0,0], [1,1,1,1]) 
slice2 = tf.slice(batch,[0,1,0,0], [1,1,2,2]) 
slice3 = tf.slice(batch,[1,1,1,0], [1,1,1,2]) 
slice4 = tf.slice(batch,[0,0,0,0], [2,2,2,2]) 
sess = tf.InteractiveSession()
print("slice1: \n" + str(slice1.eval()) + "\n")
print("slice2: \n" + str(slice2.eval()) + "\n")
print("slice3: \n" + str(slice3.eval()) + "\n")
print("slice4: \n" + str(slice4.eval()) + "\n")
  • slice1: [[[[ 0.]]]] slice2: [[[[ 3. 33.] [ 4. 44.]]]] slice3: [[[[ 8. 88.]]]] slice4: [[[[ 0. 10.] [ 1. 11.]] [[ 3. 33.] [ 4. 44.]]] [[[ 5. 55.] [ 6. 66.]] [[ 7. 77.] [ 8. 88.]]]] 选择Tensor的第一个元素,因为它从slice1开始,只选择一个元素。
  • [0,0,0,0]选择Tensor的第一个元素,因为它从slice2开始,并在两个第一维中选择1个元素,在三维和四维中选择2个。
  • [0,1,0,0]选择Tensor的第一个元素,因为它从slice3开始,并且在前三个维度中只选择1个元素,在最后一个维度中选择2个。
  • [1,1,1,0]选择Tensor的所有元素,因为它从slice4开始,两个元素按维度开始,因此它涵盖了所有Tensor

请注意,所有幻灯片中的维数都相同。如果您只使用一个元素删除尺寸,则可以使用tf.squeeze