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)保持不变,因为没有提供第三个参数来重新排列它。

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

相关推荐
AI机器学习算法2 小时前
深度学习模型演进:6个里程碑式CNN架构
人工智能·深度学习·cnn·大模型·ai学习路线
Ztopcloud极拓云视角2 小时前
从 OpenRouter 数据看中美 AI 调用量反转:统计口径、模型路由与多云应对方案
人工智能·阿里云·大模型·token·中美ai
AI医影跨模态组学2 小时前
如何将深度学习MTSR与膀胱癌ITGB8/TGF-β/WNT机制建立关联,并进一步解释其与患者预后及肿瘤侵袭、免疫抑制的生物学联系
人工智能·深度学习·论文·医学影像
搬砖的前端2 小时前
AI编辑器开源主模型搭配本地模型辅助对标GPT5.2/GPT5.4/Claude4.6(前端开发专属)
人工智能·开源·claude·mcp·trae·qwen3.6·ops4.6
Python私教3 小时前
Hermes Agent 安全加固与生态扩展:2026-04-23 更新解析
人工智能
饼干哥哥3 小时前
Kimi K2.6 干成了Claude Design国产版,一句话生成电影级的动态品牌网站
人工智能
肖有米XTKF86463 小时前
带货者精品优选模式系统的平台解析
人工智能·信息可视化·团队开发·csdn开发云
天天进步20153 小时前
打破沙盒限制:OpenWork 如何通过权限模型实现安全的系统级调用?
人工智能·安全
xcbrand3 小时前
政府事业机构品牌策划公司找哪家
大数据·人工智能·python
骥龙3 小时前
第十篇:合规与未来展望——构建AI智能体安全标准
人工智能·安全