python维度变换_tensor维度变换 - osc_op3x65ho的个人空间 - OSCHINA - 中文开源技术交流社区...

本文介绍了维度变换在TensorFlow中的重要性,通过维度变换可以改变数据的表示方式,例如图片数据的压平、增加或减少维度。讨论了tf.reshape、tf.transpose和tf.expand_dims等方法,并通过实例解释了它们的工作原理。强调了理解数据内容(content)在变换过程中的关键作用,以及如何正确恢复数据的原始结构。此外,还提到了SE-Net模型如何利用维度变换提高准确性。
摘要由CSDN通过智能技术生成

维度变换是tensorflow中的重要模块之一,前面mnist实战模块我们使用了图片数据的压平操作,它就是维度变换的应用之一。

在详解维度变换的方法之前,这里先介绍一下View(视图)的概念。所谓View,简单的可以理解成我们对一个tensor不同维度关系的认识。举个例子,一个[ b,28,28,1 ]的tensor(可以理解为mnist数据集的一组图片),对于这样一组图片,我们可以有一下几种理解方式:

(1)按照物理设备储存结构,即一整行的方式(28*28)储存,这一行有连续的784个数据,这种理解方式可以用[ b,28*28 ]表示

(2)按照图片原有结构储存,即保留图片的行列关系,以28行28列的数据理解,这种方式可以用[ b,28,28 ]表示

(3)将图片分块(比如上下两部分),这种理解方式与第二种类似,只是将一张图变为两张,这种方式可以用[ b,2,14*28 ]表示

(4)增加channel通道,这种理解方式也与第二种类似,只是这种对rgb三色图区别更明显,可以用[ b,28 28,1 ]表示

通过维度的等价变换,就可以实现思维上View的转换

维度变换的方式:

方式1:tf.reshape(可通过破坏维度之间的关系改变tensor的维度,但不会改变原有数据的存储顺序)

a = tf.random.normal([4,28,28,3])print(a.shape)print(tf.reshape(a,[4,784,3]).shape)print(tf.reshape(a,[4,-1,3]).shape)print(tf.reshape(a,[4,784*3]).shape)print(tf.reshape(a,[4,-1]).shape)

309d90c444a9c2a611ed2a4e4a031b0f.png

但是reshape在恢复已经reshape的数据时会出现问题,比如[ 4,28,28,3 ]的数据reshape成[ 4,784,3 ]的数据要想再恢复成以前的样子,就需要记录下以前的content(内容)信息,如果记录过程出现错误(如width和height维度记反或者数值记错),就会导致恢复不成想要的样子。

方式2:tf.transpose  (content的变换)

a = tf.random.normal([4,3,2,1])print(a.shape)print(tf.transpose(a).shape)print(tf.transpose(a,perm=[0,1,3,2]).shape)

f230ce304372bf463ffc353494c2ce52.png

通过这种变换方式会彻底改变原来图片数据的维度关系,在经过transpose之后,再用reshape变换得到的数据是基于新的content(transpose之后)进行的变换,所以reshape时要记录新的content信息,不然会导致数据混乱甚至程序异常。

方式3:tf.expand_dims、tf.squeeze (增加和减少维度)

a = tf.random.normal([4,35,8])#tf.expand_dims增加维度#若给定axis>0,则在给定轴前增加维度,若给定axis<0,则在给定轴后增加维度

print(tf.expand_dims(a,axis=0).shape)print(tf.expand_dims(a,axis=3).shape)print(tf.expand_dims(a,axis=-1).shape)print(tf.expand_dims(a,axis=-4).shape)#tf.squeeze用于减少维度

print(tf.squeeze(tf.zeros([1,2,1,1,3])).shape)

a= tf.zeros([1,2,1,3])print(tf.squeeze(a,axis=0).shape)print(tf.squeeze(a,axis=2).shape)print(tf.squeeze(a,axis=-2).shape)print(tf.squeeze(a,axis=-4).shape)

a69c23af670b5b0105c4103d131d916e.png

需要注意的是,squeeze只能减少维度值为1的维度,且axis必须为已存在的轴索引

当前主流的神经网络之一SE-NET就通过巧妙的使用expand和squeeze模块,使得模型准确率更上一个台阶

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值