tensor维度变换
维度变换是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)

但是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)

通过这种变换方式会彻底改变原来图片数据的维度关系,在经过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)

需要注意的是,squeeze只能减少维度值为1的维度,且axis必须为已存在的轴索引
当前主流的神经网络之一SE-NET就通过巧妙的使用expand和squeeze模块,使得模型准确率更上一个台阶
SE-net的github源码地址:https://github.com/hujie-frank/SENet
tensor维度变换的更多相关文章
- [深度学习] pytorch学习笔记(1)(数据类型、基础使用、自动求导、矩阵操作、维度变换、广播、拼接拆分、基本运算、范数、argmax、矩阵比较、where、gather)
一.Pytorch安装 安装cuda和cudnn,例如cuda10,cudnn7.5 官网下载torch:https://pytorch.org/ 选择下载相应版本的torch 和torchvisio ...
- pytorch张量数据索引切片与维度变换操作大全(非常全)
(1-1)pytorch张量数据的索引与切片操作1.对于张量数据的索引操作主要有以下几种方式:a=torch.rand(4,3,28,28):DIM=4的张量数据a(1)a[:2]:取第一个维度的前2 ...
- [TensorFlow]Tensor维度理解
http://wossoneri.github.io/2017/11/15/[Tensorflow]The-dimension-of-Tensor/ Tensor维度理解 Tensor在Tensorf ...
- pytorch 中改变tensor维度的几种操作
具体示例如下,注意观察维度的变化 #coding=utf-8 import torch """改变tensor的形状的四种不同变化形式""" ...
- tensorflow中的函数获取Tensor维度的两种方法:
获取Tensor维度的两种方法: Tensor.get_shape() 返回TensorShape对象, 如果需要确定的数值而把TensorShape当作list使用,肯定是不行的. 需要调用Tens ...
- Pytorch Tensor 维度的扩充和压缩
维度扩展 x.unsqueeze(n) 在 n 号位置添加一个维度 例子: import torch x = torch.rand(3,2) x1 = x.unsqueeze(0) # 在第一维的位置 ...
- 机器学习进阶-图像基本操作-数值计算 1.cv2.add(将图片进行加和) 2.cv2.resize(图片的维度变换) 3.cv2.addWeighted(将图片按照公式进行重叠操作)
1.cv2.add(dog_img, cat_img) # 进行图片的加和 参数说明: cv2.add将两个图片进行加和,大于255的使用255计数 2.cv2.resize(img, (500, ...
- tensor 维度 问题。
tf.argmax takes two arguments: input and dimension. example: tf.argmx(arr, dimension = 1). or tf.arg ...
- pytorch tensor 维度理解.md
torch.randn torch.randn(*sizes, out=None) → Tensor(张量) 返回一个张量,包含了从标准正态分布(均值为0,方差为 1)中抽取一组随机数,形状由可变参数 ...
随机推荐
- codeforces 1020 C Elections(枚举+贪心)
题意: 有 n个人,m个党派,第i个人开始想把票投给党派pi,而如果想让他改变他的想法需要花费ci元.你现在是党派1,问你最少花多少钱使得你的党派得票数大于其它任意党派. n,m<3000 思路 ...
- Java并发读书笔记:Lock与ReentrantLock
Lock位于java.util.concurrent.locks包下,是一种线程同步机制,就像synchronized块一样.但是,Lock比synchronized块更灵活.更复杂. 话不多说,我们 ...
- Python:自动化上传OSS
简介 最近在学习Python,为之庞大的第三方库感到震撼.今天分享一个Python 自动化脚本,功能是将H5静态资源上传到OSS,以方便实现CDN加速,我将其放在Jenkins自动发布中使用.该脚本不 ...
- ubuntu 18. root登录图形界面
修改文件 vim /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 增加两行: greeter-show-manual-login=true all-g ...
- java中深拷贝浅拷贝简析
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- Apache 日志记录相关设置
小编最近在配置Apache 服务器啊 就把遇到的信息给记录下来 Apache 自动生成的日志会给系统带来很大的损耗.关闭日志以后,甚至最高可以提高整体性能近40%(粗略估计) 那么如何关闭日志呢? 可 ...
- Springboot 自动装配置
Spring Boot 相对于传统的Spring引入了自动配置功能,简化了项目中繁琐的配置,让开发者利用起来更加的简便.快捷.比如内嵌的tomcat容器等,这些都属于Spring Boot自动配置的范 ...
- linux下搭建DHCP服务
一键搭建dhcpd服务脚本 [root@dhcp-server~]# cat auto_install_dhcpd.sh #!/bin/sh . /etc/init.d/functions #安装dh ...
- drf认证组件、权限组件、jwt认证、签发、jwt框架使用
目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...
- MySQL 什么是事务?
该文为< MySQL 实战 45 讲>的学习笔记,感谢查看,如有错误,欢迎指正 一.事务简介 事务就是为了保证一组数据库操作,要么全部成功,要么全部失败. 事务是在引擎层实现的,也就是说并 ...