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

标签 tensorflow

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

我如何重新排列它的元素,从 3X3 到 1X9,就像 MATLAB 中的像素一样?正如图片描述的那样: enter image description here

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/

相关文章:

python - keras 嵌入选项、batch_size 和单位数量 -- 关于目标形状的 valueerror

python - 在多 GPU 的情况下,CPU 代码可以存在于 "with tf.device(gpu_id) :"下吗?

python - 如何在 tensorflow 上将 3D 矩阵的每一行与另一个 3D 矩阵的每个元素相乘?

python - 在 Tensorflow 2 中为类 Model(object) 创建检查点

tensorflow - 如何用元信息丰富卷积神经网络?

python - 通过使用python中的log(1 + e ^ x)的taylor级数展开1个暗淡矢量

TensorFlow 的目标剪枝找不到节点

python - ValueError : The model is not configured to compute accuracy. 您应该传递 `metrics=["准确度“]` to the ` model.compile()` 方法

python - 在 Tensorflow 中计算梯度

python - 用于训练/验证/测试集拆分的 SHA 哈希