tf.transpose()

本文主要介绍了tf.transpose()函数,先给出函数原型,接着通过二维、三维、四维数组的例子展示其使用。二维是矩阵转置,三维可对不同维度进行调换,四维常用于图像。还提及对四维数组旋转第二、三维度需结合tf.transpose()和tf.reverse()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 函数原型

tf.transpose(
    a,
    perm=None,
    name='transpose',
    conjugate=False
)

a:表示的是需要变换的张量

perm:a的新的维度序列

name:操作的名字,可选的

conjugate:可选的,设置成True,那么就等于tf.conj(tf.transpose(input)),用的太少啦,这里不展示它的例子了!

 

二 例子

例子一:最简单的二维的transpose,就是矩阵的转置

import tensorflow as tf
import numpy as np

A = np.array([[1, 2, 3], [4, 5, 6]])
X = tf.transpose(A, [1, 0])

with tf.Session() as sess:
    print("original:",A)
    print("tranpose:",sess.run(X))

结果:其实就是第一行变成第一列,第二行变成第二列,原本的大小是[2,3],现在变成了[3,2]

original: [[1 2 3]
 [4 5 6]]
tranpose: [[1 4]
 [2 5]
 [3 6]]

例子二:三维,一个三维的array,shape为[i,j,k],可以看成是i个[j,k]的二维数组,那么i在这个三维数组的高度,j表示的是二维数组的行数,k表示的是二维数组的列数。

import tensorflow as tf
import numpy as np

A=np.arange(12).reshape([2,3,2])
X=tf.transpose(A,[0,2,1])
Y=tf.transpose(A,[1,0,2])
with tf.Session() as sess:
    print("original:")
    print(A)
    print("transpose [0,2,1]:")
    print(sess.run(X))
    print("transpose [0,2,1]‘s shape:")
    print(X.get_shape().as_list())
    print("transpose [1,0,2]:")
    print(sess.run(Y))
    print("transpose [1,0,2]'s shape")
    print(Y.get_shape().as_list())

结果:

original:
[[[ 0  1]
  [ 2  3]
  [ 4  5]]

 [[ 6  7]
  [ 8  9]
  [10 11]]]
transpose [0,2,1]:
[[[ 0  2  4]
  [ 1  3  5]]

 [[ 6  8 10]
  [ 7  9 11]]]
transpose [0,2,1]‘s shape:
[2, 2, 3]
transpose [1,0,2]:
[[[ 0  1]
  [ 6  7]]

 [[ 2  3]
  [ 8  9]]

 [[ 4  5]
  [10 11]]]
transpose [1,0,2]'s shape
[3, 2, 2]

你可以观察上面的结果,原本输入的shape为[2,3,2],经过transpose(perm=[0,2,1])也就是将第二维度和第三维度进行调换,得到的shape为[2,2,3],同理经过transpose(perm=[1,0,2])也就是将第一和第二维度进行调换,得到的shape为[3,2,2].

你可以很清楚的观察到是怎么进行变换的,同样你可以知道原本的A[1][1][0]经过transpose([0,2,1])之后变成了X[1][0][1].同样的原本的A[0][1][1]经过transpose([1,0,2])也就变成了Y[1][0][1].下面的代码你可以看出结论是正确的!

import tensorflow as tf
import numpy as np

A=np.arange(12).reshape([2,3,2])
X=tf.transpose(A,[0,2,1])
Y=tf.transpose(A,[1,0,2])
with tf.Session() as sess:
    print("A[1][1][0]:")
    print(A[1][1][0])
    print("transpose [0,2,1]:X[1][0][1]")
    print(sess.run(X)[1][0][1])
    print("A[0][1][1]:")
    print(A[0][1][1])
    print("transpose [1,0,2]:Y[1][0][1]")
    print(sess.run(Y)[1][0][1])

结果:

A[1][1][0]:
8
transpose [0,2,1]:X[1][0][1]
8
A[0][1][1]:
3
transpose [1,0,2]:Y[1][0][1]
3

例子三:四维,应用在图像上一般!

import tensorflow as tf
import numpy as np

A=np.arange(24).reshape([2,3,2,2])
X=tf.transpose(A,[0,2,1,3])
Y=tf.transpose(A,[1,0,3,2])

with tf.Session() as sess:
    print("A")
    print(A)
    print("X.shape")
    print(X.get_shape().as_list())
    print("X")
    print(sess.run(X))
    print("Y.shape")
    print(Y.get_shape().as_list())
    print("Y")
    print(sess.run(Y))

结果:

A
[[[[ 0  1]
   [ 2  3]]

  [[ 4  5]
   [ 6  7]]

  [[ 8  9]
   [10 11]]]


 [[[12 13]
   [14 15]]

  [[16 17]
   [18 19]]

  [[20 21]
   [22 23]]]]
X.shape
[2, 2, 3, 2]
X
[[[[ 0  1]
   [ 4  5]
   [ 8  9]]

  [[ 2  3]
   [ 6  7]
   [10 11]]]


 [[[12 13]
   [16 17]
   [20 21]]

  [[14 15]
   [18 19]
   [22 23]]]]
Y.shape
[3, 2, 2, 2]
Y
[[[[ 0  2]
   [ 1  3]]

  [[12 14]
   [13 15]]]


 [[[ 4  6]
   [ 5  7]]

  [[16 18]
   [17 19]]]


 [[[ 8 10]
   [ 9 11]]

  [[20 22]
   [21 23]]]]

你可以自己随便的输出几个点看看结果对不对,比如A[0][1][0][0]肯定是等于X[0][0][1][0],肯定等于Y[1][0][0][0].这里就不写啦!

三 对于四维的数组,[batch_size,height,width,nchannels],我们只需要旋转第二第三维度怎么操作,需要用到tf.transpose()和tf.reverse()

tf.reverse()我之前写过博客,可以查看:tf.reverse()

代码如下:

import tensorflow as tf
import numpy as np

def rotate_90_cc(inputs):
    rotates = tf.transpose(inputs, [0, 2, 1, 3])
    rotates = tf.reverse(rotates, axis=[1])
    return rotates

A=np.arange(24).reshape([2,3,2,2])
X=tf.transpose(A,[0,2,1,3])

with tf.Session() as sess:
    print("A")
    print(A)
    print("X")
    print(sess.run(X))
    print("rotate_90_cc:")
    print(sess.run(rotate_90_cc(A)))
    print("我们取出A[0,:,:,0]与进行rotate_90_cc之后的结果看看,发现进行了逆时针选择90度:")
    print("A[0,:,:,0]:")
    print(A[0,:,:,0])
    print("rotate之后的结果")
    print(sess.run(rotate_90_cc(A))[0,:,:,0])

结果:你可以看到操作就是现将我们的tensor进行第二第三维度的transpose,之后在在axis=1上进行reverse.

A
[[[[ 0  1]
   [ 2  3]]

  [[ 4  5]
   [ 6  7]]

  [[ 8  9]
   [10 11]]]


 [[[12 13]
   [14 15]]

  [[16 17]
   [18 19]]

  [[20 21]
   [22 23]]]]
X
[[[[ 0  1]
   [ 4  5]
   [ 8  9]]

  [[ 2  3]
   [ 6  7]
   [10 11]]]


 [[[12 13]
   [16 17]
   [20 21]]

  [[14 15]
   [18 19]
   [22 23]]]]
rotate_90_cc:
[[[[ 2  3]
   [ 6  7]
   [10 11]]

  [[ 0  1]
   [ 4  5]
   [ 8  9]]]


 [[[14 15]
   [18 19]
   [22 23]]

  [[12 13]
   [16 17]
   [20 21]]]]
我们取出A[0,:,:,0]与进行rotate_90_cc之后的结果看看,发现进行了逆时针选择90度:
A[0,:,:,0]:
[[ 0  2]
 [ 4  6]
 [ 8 10]]
rotate之后的结果
[[ 2  6 10]
 [ 0  4  8]]

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值