41

我有一个 shape 张量(30, 116, 10),我想交换前两个维度,这样我就有一个 shape 张量(116, 30, 10)

我看到 numpy 作为这样的函数实现了 ( np.swapaxes),我在 tensorflow 中搜索了类似的东西,但我什么也没找到。

你有什么主意吗?

4

3 回答 3

53

tf.transpose提供与 相同的功能np.swapaxes,但形式更通用。在您的情况下,您可以执行tf.transpose(orig_tensor, [1, 0, 2])相当于np.swapaxes(orig_np_array, 0, 1).

于 2016-07-05T20:55:31.540 回答
4

如果输入维数未知,则可以使用tf.einsum交换轴。例如:

  • tf.einsum("ij...->ji...", input)将交换input;的前两个维度
  • tf.einsum("...ij->...ji", input)将交换最后两个维度;
  • tf.einsum("aij...->aji...", input)将交换第二维和第三维;
  • tf.einsum("ijk...->kij...", input)将置换前三个维度;

等等。

于 2020-04-20T17:50:33.520 回答
2

您只能使用 转置最后两个轴tf.linalg.matrix_transpose,或者更一般地说,您可以通过动态计算前导索引是什么来交换任意数量的尾随轴,并为要转置的轴使用相对索引

x = tf.ones([5, 3, 7, 11])
trailing_axes = [-1, -2]

leading = tf.range(tf.rank(x) - len(trailing_axes))   # [0, 1]
trailing = trailing_axes + tf.rank(x)                 # [3, 2]
new_order = tf.concat([leading, trailing], axis=0)    # [0, 1, 3, 2]
res = tf.transpose(x, new_order)
res.shape                                             # [5, 3, 11, 7]
于 2020-12-07T21:31:18.117 回答