当前位置:首页 > 技术 > 正文内容

PyTorch中常用的张量维度操作方法解析

访客 技术 2026年7月8日 1

flatten:展平张量

在 PyTorch 中,flatten() 方法用于将多维张量压缩为一维形式。该方法会按行优先顺序将所有元素展开成单一维度的张量。这对于全连接层前的数据准备非常常见。

import torch

x = torch.tensor([[10, 20, 30], 
                  [40, 50, 60]])
flattened = x.flatten()
print(flattened)  # 输出: tensor([10, 20, 30, 40, 50, 60])

unsqueeze:扩展维度

unsqueeze(dim) 可在指定位置插入大小为 1 的新维度,常用于匹配模型输入形状或广播运算需求。维度索引从 0 开始计数。

# 原始二维张量
t = torch.rand(2, 5)
expanded = t.unsqueeze(2)  # 在第3个维度增加一个轴
print(expanded.shape)  # 输出: torch.Size([2, 5, 1])

squeeze:压缩单例维度

squeeze() 移除张量中所有尺寸为 1 的维度。若指定 dim 参数,则仅对该维度执行压缩(前提是该维度大小为 1)。

z = torch.zeros(1, 4, 1, 8)
squeezed_all = z.squeeze()      # 移除所有 size=1 维度 → (4, 8)
squeezed_dim = z.squeeze(0)     # 仅移除第0维 → (4, 1, 8)

print(squeezed_all.shape)       # 输出: torch.Size([4, 8])
print(squeezed_dim.shape)       # 输出: torch.Size([4, 1, 8])

view:重塑张量结构

view() 允许重新组织张量的形状,只要总元素数量保持不变。它不复制数据,而是返回原始数据的新"视图",因此效率较高。

data = torch.arange(12)
reshaped = data.view(3, 4)
print(reshaped)
# 输出:
# tensor([[ 0,  1,  2,  3],
#         [ 4,  5,  6,  7],
#         [ 8,  9, 10, 11]])

在 Transformer 架构中,常使用星号解包进行动态 reshape:

# head_shape = (batch_size, seq_len)
output = x.view(*head_shape, num_heads, head_dim)

flip:沿指定维度翻转元素

torch.flip(input, dims) 沿给定的一个或多个维度反转元素顺序。参数 dims 接受整数或整数列表。

mat = torch.tensor([[1, 2, 3],
                    [4, 5, 6],
                    [7, 8, 9]])

rev_rows = torch.flip(mat, dims=[0])    # 上下翻转
rev_both = torch.flip(mat, dims=[0,1]) # 同时上下左右翻转

print(rev_rows)
# tensor([[7, 8, 9],
#         [4, 5, 6],
#         [1, 2, 3]])

print(rev_both)
# tensor([[9, 8, 7],
#         [6, 5, 4],
#         [3, 2, 1]])

stack:沿新轴堆叠张量

torch.stack() 将多个相同形状的张量沿新增的维度拼接起来。结果张量的秩比原张量高一阶。

a = torch.tensor([1, 2])
b = torch.tensor([3, 4])
c = torch.tensor([5, 6])

stacked = torch.stack((a, b, c), dim=0)
print(stacked.shape)  # 输出: torch.Size([3, 2])
print(stacked)
# tensor([[1, 2],
#         [3, 4],
#         [5, 6]])

chunk:分块切分张量

torch.chunk(tensor, chunks, dim) 将张量沿指定维度均分为若干块。若不能整除,则最后一块可能略小。

tensor_2d = torch.arange(18).reshape(3, 6)

# 按列分为两部分
parts = torch.chunk(tensor_2d, chunks=2, dim=1)
for idx, part in enumerate(parts):
    print(f"子张量 {idx+1}:")
    print(part)

# 子张量 1:
# tensor([[ 0,  1,  2],
#         [ 6,  7,  8],
#         [12, 13, 14]])
#
# 子张量 2:
# tensor([[ 3,  4,  5],
#         [ 9, 10, 11],
#         [15, 16, 17]])

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。