例如,我得到张量[30,6,6,3]
:30是batch_size
,6X6是height x width
,3是channels
。
我怎样才能将其元素从每个3X3重新排列到1X9,就像MATLAB中的像素一样?如图所示:
tf.reshape()
似乎行不通。
答案 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, ...)
。由于行主要顺序,要展平的尺寸必须在左侧,以便重新整形以用作展平操作。因此,如果在您的示例中,通道是最后一个维度,则需要将它们转置到左侧,展平(使用整形),然后将它们转置回来。