Pytorch基础 - 6. torch.reshape() 和 torch.view()

news/2024/7/10 23:46:00 标签: pytorch, 深度学习, python, reshape, view
views" class="htmledit_views">

目录

reshape(shape)%20%E5%92%8C%20torch.view(shape)%E5%87%BD%E6%95%B0%E7%94%A8%E6%B3%95-toc" style="margin-left:80px;">1. torch.reshape(shape) 和 torch.view(shape)函数用法

2. 当处理的tensor是连续性的(contiguous)

3. 当处理的tensor是非连续性的(contiguous)

4. PyTorch中的contiguous


在本文开始之前,需要了解最基础的Tensor存储方式,具体见 Tensor数据类型与存储结构

注:如果不想继续往下看,就无脑使用reshape()函数来进行tensor处理!!

reshape(shape)%20%E5%92%8C%20torch.view(shape)%E5%87%BD%E6%95%B0%E7%94%A8%E6%B3%95">1. torch.reshape(shape) 和 torch.view(shape)函数用法

torch.reshape() 和 torch.view()不会修改tensor内部的值,只是对tensor的形状进行变化,里面只包含了shape的参数,shape为当前tensor改变后的形状

示例:将x改变成shape为[2,3] 和 [3,2]的方式,reshapeview均可 

python">x = torch.tensor([1, 2, 3, 4, 5, 6])
y1 = x.reshape(2, 3)
y2 = x.view(3, 2)
print(y1.shape, y2.shape)   # torch.Size([2, 3]) torch.Size([3, 2])

2. 当处理的tensor是连续性的(contiguous)

当tensor是连续的,torch.reshape() 和 torch.view()这两个函数的处理过程也是相同的,即两者均不会开辟新的内存空间,也不会产生数据的副本,只是新建了一份tensor的头信息区,并在头信息区中指定重新指定某些信息,如stride , 并没有修改这个tensor的存储区 Storage

示例:尽管y1和y2的stride不同,但他们的storage()是相同的

python">x = torch.tensor([1, 2, 3, 4, 5, 6])
y1 = x.reshape(2, 3)
y2 = x.view(3, 2)
print(y1.stride(), y2.stride())   # (3, 1) (2, 1)
print(y1.storage().data_ptr() == y2.storage().data_ptr())   # True

3. 当处理的tensor是非连续性的(contiguous)

view():在调用view()函数之前需要先调用 contiguous()方法,即x.contiguous().view()。但这种方法变换后的tensor就不是与原始tensor共享内存了,而是重新开辟了一个空间

reshape():仅需要直接调用reshape()函数即可,返回结果等同于 contiguous().view()

示例:通过transpose将x变成了 uncontiguous,然后使用contiguous().view()和reshape()均会重新开辟一个新空间,不与原始tensor共享内存了。

python">x = torch.tensor([1, 2, 3, 4, 5, 6]).reshape(2, 3).transpose(0, 1)
print(x.is_contiguous())    # False
print(x.storage().data_ptr())   # 1690151067136
y1 = x.contiguous().view(2, 3)
print(y1.storage().data_ptr())  # 1690151068544
y2 = x.reshape(2, 3)
print(y2.storage().data_ptr())  # 1690151076736

4. PyTorch中的contiguous

上面说了这么多,什么情况下是连续的,什么时候不连续呢?很简单,在PyTorch中定义了:(不)连续:Tensor底层一维数组元素的存储顺序与Tensor按行优先一维展开的元素顺序是否一致

比如:可以通过storage()查看底层一维数组的存储顺序,通过is_contiguous()判断是否连续

python">x = torch.tensor([1, 2, 3, 4, 5, 6]).reshape(2, 3)
print(x.storage())  #  1 2 3 4 5 6
print(x.is_contiguous())    # True
xt = x.transpose(0, 1)
print(xt.storage()) # 转置后,底层存储仍为 1 2 3 4 5 6
print(xt.is_contiguous())    # False

x按行展开后与x.stoage()相同,而xt按行展开后与stoage()不同,所以x是连续的,xt是不连续的。那我们继续实验,将xt再次进行转置,变成 xtt,xtt与原始x相同,所以变为连续

python">x = torch.tensor([1, 2, 3, 4, 5, 6]).reshape(2, 3)
print(x.storage())  #  1 2 3 4 5 6
print(x.is_contiguous())   # True
xtt = x.transpose(0, 1).transpose(0, 1)
print(xtt.storage()) # 转置的转置后,底层存储为 1 2 3 4 5 6,按行展开仍为 1 2 3 4 5 6
print(xtt.is_contiguous())  # True

导致导致不连续的函数常见有:transpose(), permute(), narrow(), expand()等

注:推荐一篇讲contiguous非常好的文章:PyTorch中的contiguous - 知乎


http://www.niftyadmin.cn/n/220638.html

相关文章

ipmi+nfs挂载实现安装操作系统(解决无usb/Kvm远程挂载太卡问题)

前言 背景:经常安装各种os;因为人在成都,机房都在北京和深圳,每次打开ipmi远程Kvm挂载镜像,要么巨慢,要么直接卡死,很难受,看到ipmi上的nfs挂载,就用虚拟机配了一台作为…

ch04-损失优化

ch04-损失优化0.引言1.权值初始化1.1. 梯度消失与爆炸1.2. Xavier 初始化1.3. Kaiming 初始化1.4. 常用的权值始化方法1.5. 总结2.损失函数 (一)2.1. 损失函数的概念2.2. 交叉熵损失函数2.3. NLL/BCE/BCEWithLogits Loss2.4. 总结3.损失函数 (二)3.1. PyTorch 中的损失函数3.2.…

GELU激活函数

GELU是一种常见的激活函数,全称为“Gaussian Error Linear Unit”, 作为2020年提出的优秀激活函数,越来越多的引起了人们的注意。 GELU (Gaussian Error Linear Units) 是一种基于高斯误差函数的激活函数,相较于 ReLU 等激活函数&#xff0c…

图片的四个角怎么做成圆弧形,2种方法分享

图片的四个角怎么做成圆弧形?今天来说一说直角和圆弧,小伙伴们可能会疑惑了,怎么今天讲的内容和之前不一样啊,不要着急干货在后面,听我娓娓道来。相信很多小伙伴们都使用过iphone手机,每年的产品发布会都会…

第26天-回溯-第七章 ● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串

文章目录1. 组合总和 (结果集中可以有重复的元素)2.组合总和|| (去重)3.分割回文串 (第一次没懂)1. 组合总和 (结果集中可以有重复的元素) - LeetCode链接 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidat…

2023/4/13总结

最小生成树 一、Prim算法 1.prim算法也被称为“加点法”,因为该算法是先从任意一顶点出发不断的选择目前距离最近且未被选择的点加入到已选的集合中,直到所有的点都被选到。(和最短路径中的Dijkstra算法很像) 2.prim算法的实现…

如何使用Socks5代理IP提高网络安全性

随着网络的快速发展,网络安全问题变得越来越重要。为了保障网络安全,人们普遍使用代理IP,其中Socks5代理IP是一种常用的选择。本文将介绍什么是Socks5代理IP,以及如何使用它提高网络安全性。 一、什么是Socks5代理IP Socks5代…

Elasticsearch:使用 ingest pipeline 来管理索引名称

在我之前的文章 “Elasticsearch:使用 pipelines 路由文档到想要的 Elasticsearch 索引中去” 我详述了如何使用已有的 date_index_name 处理器来把文档归类到所需要的和文档日期相关的的索引中去。比如,我们想把 2023 年 4 月的所有文档写入到 my-index…