tf.transpose()个人理解,高纬度的变换,可以将部分维度看成黑盒(整体)

一 函数原型

  1. tf.transpose(
  2.     a,
  3.     perm=None,
  4.     name='transpose',
  5.     conjugate=False
  6. )

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,就是矩阵的转置


 
 
  1. import tensorflow as tf
  2. import numpy as np
  3. A = np.array([[ 1, 2, 3], [ 4, 5, 6]])
  4. X = tf.transpose(A, [ 1, 0])
  5. with tf.Session() as sess:
  6. print( "original:",A)
  7. print( "tranpose:",sess.run(X))

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


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

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


 
 
  1. import tensorflow as tf
  2. import numpy as np
  3. A=np.arange( 12).reshape([ 2, 3, 2])
  4. X=tf.transpose(A,[ 0, 2, 1])
  5. Y=tf.transpose(A,[ 1, 0, 2])
  6. with tf.Session() as sess:
  7. print( "original:")
  8. print(A)
  9. print( "transpose [0,2,1]:")
  10. print(sess.run(X))
  11. print( "transpose [0,2,1]‘s shape:")
  12. print(X.get_shape().as_list())
  13. print( "transpose [1,0,2]:")
  14. print(sess.run(Y))
  15. print( "transpose [1,0,2]'s shape")
  16. print(Y.get_shape().as_list())

结果:


 
 
  1. original:
  2. [[[ 0 1]
  3. [ 2 3]
  4. [ 4 5]]
  5. [[ 6 7]
  6. [ 8 9]
  7. [ 10 11]]]
  8. transpose [ 0, 2, 1]:
  9. [[[ 0 2 4]
  10. [ 1 3 5]]
  11. [[ 6 8 10]
  12. [ 7 9 11]]]
  13. transpose [ 0, 2, 1]‘s shape:
  14. [ 2, 2, 3]
  15. transpose [ 1, 0, 2]:
  16. [[[ 0 1]
  17. [ 6 7]]
  18. [[ 2 3]
  19. [ 8 9]]
  20. [[ 4 5]
  21. [ 10 11]]]
  22. transpose [ 1, 0, 2] 's shape
  23. [ 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].下面的代码你可以看出结论是正确的!


 
 
  1. import tensorflow as tf
  2. import numpy as np
  3. A=np.arange( 12).reshape([ 2, 3, 2])
  4. X=tf.transpose(A,[ 0, 2, 1])
  5. Y=tf.transpose(A,[ 1, 0, 2])
  6. with tf.Session() as sess:
  7. print( "A[1][1][0]:")
  8. print(A[ 1][ 1][ 0])
  9. print( "transpose [0,2,1]:X[1][0][1]")
  10. print(sess.run(X)[ 1][ 0][ 1])
  11. print( "A[0][1][1]:")
  12. print(A[ 0][ 1][ 1])
  13. print( "transpose [1,0,2]:Y[1][0][1]")
  14. print(sess.run(Y)[ 1][ 0][ 1])

结果:


 
 
  1. A [1] [1] [0]:
  2. 8
  3. transpose [0,2,1] :X [1] [0] [1]
  4. 8
  5. A [0] [1] [1]:
  6. 3
  7. transpose [1,0,2] :Y [1] [0] [1]
  8. 3

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


 
 
  1. import tensorflow as tf
  2. import numpy as np
  3. A=np.arange( 24).reshape([ 2, 3, 2, 2])
  4. X=tf.transpose(A,[ 0, 2, 1, 3])
  5. Y=tf.transpose(A,[ 1, 0, 3, 2])
  6. with tf.Session() as sess:
  7. print( "A")
  8. print(A)
  9. print( "X.shape")
  10. print(X.get_shape().as_list())
  11. print( "X")
  12. print(sess.run(X))
  13. print( "Y.shape")
  14. print(Y.get_shape().as_list())
  15. print( "Y")
  16. print(sess.run(Y))

结果:


 
 
  1. A
  2. [[[[ 0 1]
  3. [ 2 3]]
  4. [[ 4 5]
  5. [ 6 7]]
  6. [[ 8 9]
  7. [10 11]]]
  8. [[[12 13]
  9. [14 15]]
  10. [[16 17]
  11. [18 19]]
  12. [[20 21]
  13. [22 23]]]]
  14. X .shape
  15. [2, 2, 3, 2]
  16. X
  17. [[[[ 0 1]
  18. [ 4 5]
  19. [ 8 9]]
  20. [[ 2 3]
  21. [ 6 7]
  22. [10 11]]]
  23. [[[12 13]
  24. [16 17]
  25. [20 21]]
  26. [[14 15]
  27. [18 19]
  28. [22 23]]]]
  29. Y .shape
  30. [3, 2, 2, 2]
  31. Y
  32. [[[[ 0 2]
  33. [ 1 3]]
  34. [[12 14]
  35. [13 15]]]
  36. [[[ 4 6]
  37. [ 5 7]]
  38. [[16 18]
  39. [17 19]]]
  40. [[[ 8 10]
  41. [ 9 11]]
  42. [[20 22]
  43. [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()

代码如下:


 
 
  1. import tensorflow as tf
  2. import numpy as np
  3. def rotate_90_cc(inputs):
  4. rotates = tf.transpose(inputs, [ 0, 2, 1, 3])
  5. rotates = tf.reverse(rotates, axis=[ 1])
  6. return rotates
  7. A=np.arange( 24).reshape([ 2, 3, 2, 2])
  8. X=tf.transpose(A,[ 0, 2, 1, 3])
  9. with tf.Session() as sess:
  10. print( "A")
  11. print(A)
  12. print( "X")
  13. print(sess.run(X))
  14. print( "rotate_90_cc:")
  15. print(sess.run(rotate_90_cc(A)))
  16. print( "我们取出A[0,:,:,0]与进行rotate_90_cc之后的结果看看,发现进行了逆时针选择90度:")
  17. print( "A[0,:,:,0]:")
  18. print(A[ 0,:,:, 0])
  19. print( "rotate之后的结果")
  20. print(sess.run(rotate_90_cc(A))[ 0,:,:, 0])

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


 
 
  1. A
  2. [[[[ 0 1]
  3. [ 2 3]]
  4. [[ 4 5]
  5. [ 6 7]]
  6. [[ 8 9]
  7. [10 11]]]
  8. [[[12 13]
  9. [14 15]]
  10. [[16 17]
  11. [18 19]]
  12. [[20 21]
  13. [22 23]]]]
  14. X
  15. [[[[ 0 1]
  16. [ 4 5]
  17. [ 8 9]]
  18. [[ 2 3]
  19. [ 6 7]
  20. [10 11]]]
  21. [[[12 13]
  22. [16 17]
  23. [20 21]]
  24. [[14 15]
  25. [18 19]
  26. [22 23]]]]
  27. rotate_90_cc:
  28. [[[[ 2 3]
  29. [ 6 7]
  30. [10 11]]
  31. [[ 0 1]
  32. [ 4 5]
  33. [ 8 9]]]
  34. [[[14 15]
  35. [18 19]
  36. [22 23]]
  37. [[12 13]
  38. [16 17]
  39. [20 21]]]]
  40. 我们取出 A [0,:,:,0]与进行 rotate_90_cc之后的结果看看,发现进行了逆时针选择90度:
  41. A [0,:,:,0]:
  42. [[ 0 2]
  43. [ 4 6]
  44. [ 8 10]]
  45. rotate之后的结果
  46. [[ 2 6 10]
  47. [ 0 4 8]]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值