例如,我得到一个张量[30,6,6,3]:30是batch_size,6X6是height x width,3是channels)。
我如何将它的元素从3X3重新排列到1X9,就像MATLAB中的像素一样?如图所述:

tf.reshape()似乎行不通。
发布于 2017-09-09 18:42:10
您可以使用转置和整形的组合来完成这些类型的转换。numpy和TensorFlow逻辑是相同的,因此这里有一个使用Numpy的简单示例。假设您有4x4数组,并希望通过跳过行/列(如您的示例中所示),将其分解为4个子数组。
伊,从
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, ...)。由于行的主要顺序,平坦的尺寸必须在左边,这样才能使整形作为扁平操作工作。因此,如果在您的例子中通道是最后一个维度,您将需要将它们转到左边,扁平(使用整形),然后将它们转回来。
https://stackoverflow.com/questions/46128117
复制相似问题