expand,None索引,permute【pytorch】

torch.expand

输入必须是一个向量或等价形式,扩展的最后一个维度与输入大小一致

当输入形状为(1,1,1,1,1,......,3)_4时。

expand的最后一位=输入向量的元素个数(长度)(3)

expand的倒数第二位≥输入向量的shape的元素个数(几维) (4)

推广:

当输入形状为(3,1,4)时,expand可以为(3,n,4)

当输入形状为(1,1,4)时,expand可以为(m,n,4)

形状的最后一位必须相等,前面的位数,要么相等,要么是输入1,输出任意k

pytorch中的None

在PyTorch(或NumPy)中,None索引是一种常用的方法来增加张量的维度。当你使用None作为索引时,它告诉Python你想要在那个位置增加一个新的维度。

具体来说,tensor[:, None, :]的用法如下:

  • ::这是一个切片操作符,表示选取当前维度的所有元素。
  • None:这是一个特殊的索引,用于在指定的位置增加一个大小为1的新维度。

让我们以一个具体的例子来解释:

假设你有一个形状为(N, M)的张量tensor,其中N是第一个维度的大小,M是第二个维度的大小。

  • tensor[:, None, :]将返回一个形状为(N, 1, M)的张量。

这里是如何工作的:

  1. [:, None, :]中的第一个:表示选取第一个维度(行)的所有元素。
  2. None告诉Python在第一个和第三个维度之间增加一个新的维度,并且这个维度的大小为1。
  3. 最后的:表示选取第三个维度(列)的所有元素。

这个操作通常用于改变张量的形状,以适应不同的操作,比如在矩阵乘法中增加一个批处理维度。

以下是一个简单的例子:

复制代码
import torch

# 创建一个形状为 (3, 4) 的张量
tensor = torch.tensor([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
])

# 使用 None 索引增加一个维度
new_tensor = tensor[:, None, :]

print("Original tensor shape:", tensor.shape)
print("New tensor shape:", new_tensor.shape)

输出将是:

复制代码
Original tensor shape: torch.Size([3, 4])
New tensor shape: torch.Size([3, 1, 4])

在这个例子中,我们从一个2维张量创建了一个3维张量,其中新增加的维度大小为1。

pytorch的permute

n个参数------正确的顺序

在PyTorch中,tensor.permute()方法用于重新排列张量的维度。当你调用tensor.permute()并输入多个参数时,这些参数定义了新的维度顺序。

假设你有一个张量tensor,其维度为(D0, D1, D2, ..., Dn)。当你调用tensor.permute(i0, i1, i2, ..., in)时,你需要提供一组整数索引,这些索引对应于张量的原始维度,并且按照你想要的顺序排列。

例如,如果你有一个四维张量tensor,其维度为(B, H, W, C)(即批处理大小、高度、宽度、通道数),并且你想将其重新排列为(B, C, H, W),你可以这样做:

复制代码
new_tensor = tensor.permute(0, 3, 1, 2)

在这个例子中:

  • 0对应于原始的第一个维度(批处理大小B),在新的排列中它仍然是第一个维度。
  • 3对应于原始的第四个维度(通道数C),在新的排列中它变成了第二个维度。
  • 1对应于原始的第二个维度(高度H),在新的排列中它变成了第三个维度。
  • 2对应于原始的第三个维度(宽度W),在新的排列中它变成了第四个维度。

如果你有一个更高维度的张量,并且想要重新排列它的多个维度,你可以按照相同的逻辑提供更多的参数。例如,对于一个五维张量tensor,其维度为(B0, T1, H2, W3, C4)(批处理大小、时间步长、高度、宽度、通道数),如果你想将其重新排列为(T, B, C, H, W),你可以这样做:

复制代码
new_tensor = tensor.permute(1, 0, 4, 2, 3)

在这个例子中:

  • 1对应于原始的第二个维度(时间步长T),在新的排列中它变成了第一个维度。
  • 0对应于原始的第一个维度(批处理大小B),在新的排列中它变成了第二个维度。
  • 4对应于原始的第五个维度(通道数C),在新的排列中它变成了第三个维度。
  • 2对应于原始的第三个维度(高度H),在新的排列中它变成了第四个维度。
  • 3对应于原始的第四个维度(宽度W),在新的排列中它变成了第五个维度。

确保你提供的参数数量与张量的维度数量相匹配,并且每个参数都在0到张量维度数量减1的范围内。

2个参数------交换

如果你对一个张量使用 tensor.permute() 方法并且只提供了两个参数,这意味着你正在重新排列一个至少二维张量的维度。这两个参数分别指定了新的第一个和第二个维度的原始索引位置。

例如,假设你有一个二维张量 tensor,其维度为 (D0, D1)。当你调用 tensor.permute(i0, i1) 时,你需要提供两个整数索引,这两个索引定义了新的维度顺序。

以下是一个具体的例子:

复制代码
import torch

# 假设有一个二维张量,形状为 (2, 3)
tensor = torch.tensor([[1, 2, 3],
                       [4, 5, 6]])

# 使用 permute 方法重新排列维度
new_tensor = tensor.permute(1, 0)

print("Original tensor shape:", tensor.shape)
print("New tensor shape:", new_tensor.shape)

在这个例子中:

  • 1 对应于原始张量的第二个维度(D1),在新的排列中它变成了第一个维度。

  • 0 对应于原始张量的第一个维度(D0),在新的排列中它变成了第二个维度。

    Original tensor shape: torch.Size([2, 3])
    New tensor shape: torch.Size([3, 2])

在这个例子中,原始的二维张量 (2, 3) 被重新排列成了 (3, 2)

同样地,如果你有一个更高维度的张量,但只想交换前两个维度的位置,你可以只提供两个参数。例如,对于一个三维张量 tensor,其维度为 (B, H, W),如果你想将其重新排列为 (H, B, W),你可以这样做:

复制代码
new_tensor = tensor.permute(1, 0, 2)

在这个例子中:

  • 1 对应于原始的第二个维度(H),在新的排列中它变成了第一个维度。
  • 0 对应于原始的第一个维度(B),在新的排列中它变成了第二个维度。
  • 第三个维度(W)保持不变,因为没有提供第三个参数来重新排列它。

只输入俩参数会报错的!!!

相关推荐
guoji77881 分钟前
安全与对齐的深层博弈:Gemini 3.1 Pro 安全护栏与对抗测试深度拆解
人工智能·安全
实在智能RPA9 分钟前
实在 Agent 和通用大模型有什么不一样?深度拆解 AI Agent 的感知、决策与执行逻辑
人工智能·ai
独隅13 分钟前
PyTorch 模型部署的 Docker 配置与性能调优深入指南
人工智能·pytorch·docker
lihuayong20 分钟前
OpenClaw 系统提示词
人工智能·prompt·提示词·openclaw
黑客说34 分钟前
AI驱动剧情,解锁无限可能——AI游戏发展解析
人工智能·游戏
踩着两条虫40 分钟前
AI驱动的Vue3应用开发平台深入探究(十):物料系统之内置组件库
android·前端·vue.js·人工智能·低代码·系统架构·rxjava
小仙女的小稀罕1 小时前
听不清重要会议录音急疯?这款常见AI工具听脑AI精准转译
开发语言·人工智能·python
reesn1 小时前
qwen3.5 0.8B纠正任务实践
人工智能·语言模型
实在智能RPA1 小时前
实在Agent 制造业落地案例:探寻工业大模型从实验室走向车间的实战路径
人工智能·ai