一 函数原型
-
tf.transpose(
-
a,
-
perm=None,
-
name='transpose',
-
conjugate=False
-
)
a:表示的是需要变换的张量
perm:a的新的维度序列
name:操作的名字,可选的
conjugate:可选的,设置成True,那么就等于tf.conj(tf.transpose(input)),用的太少啦,这里不展示它的例子了!
技巧:!!!如transpose(A,[1,0,2])则看成2维的,第三维看做一个整体做变换,同理transpose(A,[1,0,3,2])将第三和四维看成一个整体黑盒子,先做0,1变换,完成之后,低纬度的固定做2,3变换。!!!
二 例子
例子一:最简单的二维的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]]