Pytorch基础:Tensor的reshape方法

相关阅读

Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm=1001.2014.3001.5482


在Pytorch中,reshape是Tensor的一个重要方法,它与Numpy中的reshape类似,用于返回一个改变了形状但数据和数据顺序和原来一致的新Tensor对象。注意:此时返回的数据对象并不一定是新的,这取决于应用此方法的Tensor是否是连续的。

reshape方法的语法如下所示:

复制代码
Tensor.reshape(*shape) → Tensor
shape (tuple of ints or int...) - the desired shape

reshape的用法如下所示:

复制代码
import torch
# 创建一个张量
x = torch.randn(3, 4)
tensor([[ 0.1961, -0.9038,  0.9196, -1.1851],
        [ 1.1321,  0.3153,  0.3485,  0.7977],
        [-0.5279,  0.2062, -0.4224, -0.3993]])

# 使用reshape方法将其重新塑造为2行6列的形状
y = x.reshape(2, 6) 
y = x.reshape((2,6)) #两种形式均可,y = x.reshape([2,6])也可
tensor([[ 0.1961, -0.9038,  0.9196, -1.1851,  1.1321,  0.3153],
        [ 0.3485,  0.7977, -0.5279,  0.2062, -0.4224, -0.3993]])

可以看到,给出的参数既可以是多个整数(其中每个整数代表一个维度的大小,而整数的数量代表维度的数量),也可以是一个元组或是列表(其中每个元素代表一个维度的大小,而元素数量代表维度的数量)。而且reshape不改变Tensor中数据的排列顺序(指的是从上到下从左到右遍历的顺序),只改变形状,这也就对reshape各维度大小的乘积有要求,要与原Tensor一致。在上例中即3*4=2*6。

另外reshape还有一个trick,即某一维的实参可以是-1,此时会自动根据原Tensor大小和给出的其他维度参数的大小,推断出这一维度的大小,举例如下:

复制代码
import torch
# 创建一个张量
x = torch.randn(3, 4)
tensor([[ 0.1961, -0.9038,  0.9196, -1.1851],
        [ 1.1321,  0.3153,  0.3485,  0.7977],
        [-0.5279,  0.2062, -0.4224, -0.3993]])

# 使用reshape方法将其重新塑造为6行n列的形状,n为自动推断出的值
y = x.reshape(6, -1)
tensor([[ 0.1961, -0.9038],
        [ 0.9196, -1.1851],
        [ 1.1321,  0.3153],
        [ 0.3485,  0.7977],
        [-0.5279,  0.2062],
        [-0.4224, -0.3993]])

# 使用reshape方法将其重新塑造为(2,2,n)的形状,n为自动推断出的值
y = x.reshape(2, 2, -1)
tensor([[[ 0.1961, -0.9038,  0.9196],
         [-1.1851,  1.1321,  0.3153]],

        [[ 0.3485,  0.7977, -0.5279],
         [ 0.2062, -0.4224, -0.3993]]])

# 不能在两个维度都指定-1,这时无法推断出唯一结果
y = x.reshape(2, -1, -1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: only one dimension can be inferred

除此之外,还可以使用torch.reshape()函数,这与使用reshape方式效果一致,torch.reshape()的语法如下所示。

复制代码
torch.reshape(input, shape) → Tensor
input (Tensor) -- the tensor to be reshaped
shape (tuple of python:int) -- the new shape


import torch
# 创建一个张量
x = torch.randn(3, 4)
tensor([[ 0.1961, -0.9038,  0.9196, -1.1851],
        [ 1.1321,  0.3153,  0.3485,  0.7977],
        [-0.5279,  0.2062, -0.4224, -0.3993]])

# 使用reshape函数将其重新塑造为6行n列的形状,n为自动推断出的值
y = torch.reshape(x, (6, -1))
tensor([[ 0.1961, -0.9038],
        [ 0.9196, -1.1851],
        [ 1.1321,  0.3153],
        [ 0.3485,  0.7977],
        [-0.5279,  0.2062],
        [-0.4224, -0.3993]])
相关推荐
hef2884 小时前
如何生成特定SQL的AWR报告_@awrsqrpt.sql深度剖析单条语句性能
jvm·数据库·python
小程故事多_804 小时前
Agent+Milvus,告别静态知识库,打造具备动态记忆的智能AI助手
人工智能·深度学习·ai编程·milvus
code_pgf4 小时前
Llama 3详解
人工智能·llama
ComputerInBook4 小时前
数字图像处理(4版)——第 3 章——(图像的)强度变换和空间滤波(Rafael C.Gonzalez&Richard E. Woods)
图像处理·人工智能·计算机视觉·强度变换和空间滤波
爱写代码的小朋友4 小时前
生成式人工智能(AIGC)在开放式教育问答系统中的知识表征与推理机制研究
人工智能·aigc
Jinkxs4 小时前
从语法纠错到项目重构:Python+Copilot 的全流程开发效率提升指南
python·重构·copilot
技术专家4 小时前
Stable Diffusion系列的详细讨论 / Detailed Discussion of the Stable Diffusion Series
人工智能·python·算法·推荐算法·1024程序员节
m0_488913014 小时前
万字长文带你梳理Llama开源家族:从Llama-1到Llama-3,看这一篇就够了!
人工智能·学习·机器学习·大模型·产品经理·llama·uml
helpme流水4 小时前
LLaMA Factory 从入门到精通,一篇讲完
人工智能·ai·语言模型·llama
段一凡-华北理工大学4 小时前
【大模型+知识图谱+工业智能体技术架构】~系列文章01:快速了解与初学入门!!!
人工智能·python·架构·知识图谱·工业智能体