【pytorch】reshape的使用

torch.reshape 是 PyTorch 中用于改变张量形状的函数。它的作用是重新安排张量的维度,使其符合指定的形状,但不会改变数据的顺序。

Returns a tensor with the same data and number of elements as input, but with the specified shape.

基本语法

python 复制代码
input_reshape = torch.reshape(input, shape)

或者:

python 复制代码
input_reshape = input.reshape(shape)
  • input(tensor):输入张量。
  • shape(tuple of int):目标形状,可以是一个整数或一个整数元组,表示张量的新维度。

例子

python 复制代码
import torch

# 创建一个形状为 (4, 3) 的张量
x = torch.arange(12).reshape(4, 3)
print(x)

输出:

复制代码
tensor([[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]])

你可以将这个张量重新调整成其他形状,比如将它变成一个 (2, 6) 的张量:

python 复制代码
y = x.reshape(2, 6)
print(y)

输出:

复制代码
tensor([[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]])

特别的用法

使用 1 自动推算维度:

如果你不确定某个维度应该是多少,可以使用 -1 来自动推算。例如,如果你只知道张量的总元素数和某些维度,可以让 PyTorch 自动计算某个维度。

A single dimension may be -1, in which case it's inferred from the remaining dimensions and the number of elements in input.

python 复制代码
z = x.reshape(2, -1)  # PyTorch 会自动推算第二维度的大小
print(z)

输出:

复制代码
tensor([[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]])

torch.reshape(x, (-1,)) 将张量 展平成一维 (即向量)等效于 x.flatten()

  • 此时 PyTorch 会自动计算该维度的大小,计算公式为:

    新维度大小 = 原始张量的总元素数

  • 因为要展成向量,所以只有一个维度(表示有多少个数),所以只需要一个-1,后面空着就行

    • 所以其实也可以写成 (-1),即torch.reshape(x, (-1)) 但推荐保留逗号

注意:这跟 (1,-1)有区别 ,(-1,)是展平成一维向量,

而(1,-1)是1*n,这被视作二维的(一个维度是1个数,另一个维度是n个数)

例子:

python 复制代码
x = torch.tensor([[0, 1],
                  [2, 3]])

x_vec = x.reshape(-1,)
print(x_vec)

x_matrix = x.reshape(1,-1)
print(x_matrix)

输出:

python 复制代码
tensor([0, 1, 2, 3])
tensor([[0, 1, 2, 3]])
  • 总元素数 :2 × 2 = 4

  • 执行 torch.reshape(x, (-1,)) 后:

    → 新形状为 (4,)

    → 结果:tensor([0, 1, 2, 3])

  • 执行 torch.reshape(x, (1,-1)) 后:

    → 新形状为 (1,4)

    → 结果:tensor([[0, 1, 2, 3]])

注意事项

保持元素数量一致:

使用 reshape 时,新形状的元素数量必须和原形状一致。例如,原来是 (4, 3),总共有 12 个元素,不能reshape成 (3, 5) 因为会丢失元素。

python 复制代码
# 错误的 reshape
# x.reshape(3, 5)  # 会抛出错误,无法reshape

总之,要接收返回的tensor

  • reshape 不会修改原始张量,它会返回一个新的张量,除非原张量已经在内存中是以连续的方式存储。

When possible, the returned tensor will be a view of input. Otherwise, it will be a copy. Contiguous inputs and inputs with compatible strides can be reshaped without copying, but you should not depend on the copying vs. viewing behavior.

  • 如果原张量的内存布局不连续,reshape 会返回一个新的内存副本。
  • torch.view 和 torch.reshape 在功能上相似,但 torch.view 要求张量是连续的,而 torch.reshape 会自动处理不连续的张量。
相关推荐
小白今天也很酷3 分钟前
MCXN947更新板载DAP_Link固件的方法
c语言·python·单片机·ubuntu·excel·1024程序员节
小羊没烦恼!6 分钟前
.NET无侵入自动化探针原理和主流实现
运维·开发语言·javascript·python·自动化·.net·1024程序员节
立康科普11 分钟前
含多肽钙的补钙产品是什么?和普通钙片有什么区别?
python·1024程序员节
“AI国潮设计-小江”9 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
Linux_cy9 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12039 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami9 小时前
【无标题】
开发语言·python
CodeGL9 小时前
10、Python基础之进程和线程
开发语言·python
TechWayfarer10 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
2601_9679801111 小时前
Python列表操作方法详解
python·数据类型·修改·列表操作·功能汇总