一 函数原型

  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]]

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

  1. tensorflow的tf.transpose()简单使用

    tf.transpose(input, [dimension_1, dimenaion_2,..,dimension_n]):这个函数主要适用于交换输入张量的不同维度用的,如果输入张量是二维,就相当是 ...

  2. tf.transpose

    tf.transpose(input, [dimension_1,dimenaion_2,..,dimension_n]) 这个函数主要适用于交换输入张量的不同维度用的,如果输入张量是二维,就相当是转 ...

  3. tf.transpose()函数(转)

    tensorflow里面许多针对数组操作的函数,官方文档又看了没啥卵用,网上帖子直接copy官方文档而不解释,只能自己写个程序测试理解,以3个维度的tensor进行理解 tf.transpose()作 ...

  4. tf.transpose()

    一 函数原型 tf.transpose(     a,     perm=None,     name='transpose',     conjugate=False ) a:表示的是需要变换的张量 ...

  5. 理解离散傅立叶变换(一)

    理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的 文章,太过抽象,尽是一些让人看了就望而生畏的公式 ...

  6. tf.reshape 和 tf.transpose 用法

    import tensorflow as tf x= tf.constant([[2,3],[4,5],[6,7]],tf.int32) print(x.numpy()) [[2 3][4 5][6 ...

  7. 理解离散傅立叶变换(三.复数)

    理解离散傅立叶变换(三) ------复数形式离散傅立叶变换 复数形式的离散傅立叶变换非常巧妙地运用了复数的方法,使得傅立叶变换变换更加自然和简洁,它并不是只是简单地运用替换的方法来运用复数,而是完全 ...

  8. 理解离散傅立叶变换(一. 傅立叶变换的由来)

    理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,不管是书本还是在网上可以非常easy找到关于傅立叶变换的描写叙述,可是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生 ...

  9. tf.nn.conv2d理解(带通道的卷积图片输出案例)

    三篇参考: 1.https://blog.csdn.net/goodshot/article/details/79655915 TF-卷积函数 tf.nn.conv2d 介绍 2.https://bl ...

最新文章

  1. 【宋红康学习日记11】Object类与equals方法
  2. phoenixcard 获取下载脚本失败,请确认固件版本是否正确
  3. 灰色条怎么写_货车司机必须牢记的5条驾驶经验,最后一个能做到的人不多
  4. 广告深度学习计算:异构硬件加速实践
  5. Firefox 66 将阻止自动播放音频和视频
  6. matlab中多边形滤波器,几种常见空间滤波器MATLAB实现
  7. python手机安装模块_python如何安装模块 模块安装操作教程
  8. RIP引入外部路由配置示例
  9. 为什么学计算机的人不用360,为什么会电脑的人都鄙视他人安装360?
  10. python裁剪图片box并保存_python实现图像随机裁剪
  11. 加快FineReport报表设计的几个心得体会
  12. 构造一个简单的linux系统
  13. 通达oa 2013 php解密,通达OA漏洞学习 - 安全先师的个人空间 - OSCHINA - 中文开源技术交流社区...
  14. Codeforces Global Round 20 A~F1题解
  15. 0ctf_2017_babyheap
  16. uniapp显示服务器请求超时,uniapp发布H5连接服务器超时
  17. windows7下安装sharex视频截图报错,需要下载ffmpeg——Unknown input or output format: gdigrab
  18. C++字符串内数字统计
  19. 气质妈妈“特色”制胜巧心计 情系旗袍书画淘宝梦
  20. 互联网让中国零售业弯道超车:近创新比黑科技重要

热门文章

  1. java powermockrunner_java – PowerMock从@RunWith(PowerMockRunner.class)注释中抛出异常
  2. (转)SqlServer基础之(触发器)(清晰易懂)
  3. mysql dml回滚_mysql binlog回滚/闪回,前滚, 分析各表DML情况, 找出长事务与大事务...
  4. android点滴9:模拟器中如何输入中文
  5. 思杰VDI外篇XDDC安装
  6. [原]防火墙安装配置(日志)
  7. 2020-11-18 Ubuntu 安装 Chrome
  8. PyQt5 QComboBox 样例代码
  9. Jquery实现子菜单散开动画
  10. ArcGIS API + Echarts 实现动态雷达图