在张量流中交换张量轴

Ale*_*uel 19 swap axis axes permute tensorflow

我有一个形状的张量(30,116,10),我想交换前两个维度,所以我有一个张量的形状(116,30,10)

我看到numpy实现了这样一个函数(np.swapaxes),我在tensorflow中搜索了类似的东西,但我什么都没发现.

你有什么主意吗 ?

提前致谢,

亚历克西斯

kev*_*man 34

tf.transposenp.swapaxes虽然以更通用的形式提供了相同的功能.在你的情况下,你可以做到tf.transpose(orig_tensor, [1, 0, 2])相当于np.swapaxes(orig_np_array, 0, 1).

  • 如果我不知道输入张量的尺寸,但是我确定要交换最后两个轴怎么办?就像,我应该对张量变量做些什么,以使形状为((2,3,4,5))的输入最终会变成为((2,3,5,4)),但同样可以在输入上使用(3、4、5、6、7)形状的(并将其变成(3、4、5、7、6)的形状) (11认同)

小智 7

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

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

等等。


Joe*_*ley 6

您可以使用 转置最后两个轴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]
Run Code Online (Sandbox Code Playgroud)