tf.transpose()个人理解,高纬度的变换,可以将部分维度看成黑盒(整体)
一 函数原型
- 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]]
tf.transpose()个人理解,高纬度的变换,可以将部分维度看成黑盒(整体)相关推荐
- tensorflow的tf.transpose()简单使用
tf.transpose(input, [dimension_1, dimenaion_2,..,dimension_n]):这个函数主要适用于交换输入张量的不同维度用的,如果输入张量是二维,就相当是 ...
- tf.transpose
tf.transpose(input, [dimension_1,dimenaion_2,..,dimension_n]) 这个函数主要适用于交换输入张量的不同维度用的,如果输入张量是二维,就相当是转 ...
- tf.transpose()函数(转)
tensorflow里面许多针对数组操作的函数,官方文档又看了没啥卵用,网上帖子直接copy官方文档而不解释,只能自己写个程序测试理解,以3个维度的tensor进行理解 tf.transpose()作 ...
- tf.transpose()
一 函数原型 tf.transpose( a, perm=None, name='transpose', conjugate=False ) a:表示的是需要变换的张量 ...
- 理解离散傅立叶变换(一)
理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的 文章,太过抽象,尽是一些让人看了就望而生畏的公式 ...
- 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 ...
- 理解离散傅立叶变换(三.复数)
理解离散傅立叶变换(三) ------复数形式离散傅立叶变换 复数形式的离散傅立叶变换非常巧妙地运用了复数的方法,使得傅立叶变换变换更加自然和简洁,它并不是只是简单地运用替换的方法来运用复数,而是完全 ...
- 理解离散傅立叶变换(一. 傅立叶变换的由来)
理解离散傅立叶变换(一) ------傅立叶变换的由来 关于傅立叶变换,不管是书本还是在网上可以非常easy找到关于傅立叶变换的描写叙述,可是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生 ...
- tf.nn.conv2d理解(带通道的卷积图片输出案例)
三篇参考: 1.https://blog.csdn.net/goodshot/article/details/79655915 TF-卷积函数 tf.nn.conv2d 介绍 2.https://bl ...
最新文章
- 【宋红康学习日记11】Object类与equals方法
- phoenixcard 获取下载脚本失败,请确认固件版本是否正确
- 灰色条怎么写_货车司机必须牢记的5条驾驶经验,最后一个能做到的人不多
- 广告深度学习计算:异构硬件加速实践
- Firefox 66 将阻止自动播放音频和视频
- matlab中多边形滤波器,几种常见空间滤波器MATLAB实现
- python手机安装模块_python如何安装模块 模块安装操作教程
- RIP引入外部路由配置示例
- 为什么学计算机的人不用360,为什么会电脑的人都鄙视他人安装360?
- python裁剪图片box并保存_python实现图像随机裁剪
- 加快FineReport报表设计的几个心得体会
- 构造一个简单的linux系统
- 通达oa 2013 php解密,通达OA漏洞学习 - 安全先师的个人空间 - OSCHINA - 中文开源技术交流社区...
- Codeforces Global Round 20 A~F1题解
- 0ctf_2017_babyheap
- uniapp显示服务器请求超时,uniapp发布H5连接服务器超时
- windows7下安装sharex视频截图报错,需要下载ffmpeg——Unknown input or output format: gdigrab
- C++字符串内数字统计
- 气质妈妈“特色”制胜巧心计 情系旗袍书画淘宝梦
- 互联网让中国零售业弯道超车:近创新比黑科技重要
热门文章
- java powermockrunner_java – PowerMock从@RunWith(PowerMockRunner.class)注释中抛出异常
- (转)SqlServer基础之(触发器)(清晰易懂)
- mysql dml回滚_mysql binlog回滚/闪回,前滚, 分析各表DML情况, 找出长事务与大事务...
- android点滴9:模拟器中如何输入中文
- 思杰VDI外篇XDDC安装
- [原]防火墙安装配置(日志)
- 2020-11-18 Ubuntu 安装 Chrome
- PyQt5 QComboBox 样例代码
- Jquery实现子菜单散开动画
- ArcGIS API + Echarts 实现动态雷达图