一 函数原型
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]]