例如,我得到一个张量[30,6,6,3]
:30是batch_size
,6X6是height x width
, 3 是 channels
).
我如何重新排列它的元素,从 3X3 到 1X9,就像 MATLAB 中的像素一样?正如图片描述的那样:
tf.reshape()
似乎行不通。
最佳答案
您可以结合使用转置和 reshape 来进行这些类型的转换。 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, ...)
。由于行优先顺序,要展平的维度必须在左侧,以便 reshape 作为展平操作。因此,如果在您的示例中 channel 是最后一个维度,您将需要将它们转置到左侧,展平(使用 reshape ),然后将它们转回原位。
关于tensorflow - 如何重新排列张量中的元素,就像在 MATLAB 中一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46128117/