PyTorch张量操作指南(cat、stack、split与chunk)
本文深入探讨PyTorch中用于调整张量结构的四个核心函数——torch.cat、torch.stack、torch.split和torch.chunk,通过实际应用场景分析和代码演示,帮助读者掌握它们的功能差异及适用条件,提升模型开发的灵活性与效率,需要的朋友可以参考下
目录
- 一、torch.cat: 沿指定维度拼接张量
- 功能描述
- 示例代码
- 二、torch.stack: 创建新维度堆叠张量
- 功能描述
- 示例代码
- 三、torch.split: 按尺寸分割张量
- 功能描述
- 示例代码
- 四、torch.chunk: 按数量均分张量
- 功能描述
- 示例代码
- 综合示例:图像数据的分割与合并处理
- 场景设定
- 代码实现
- 关键操作解析
- 扩展应用建议
- 总结与对比
在深度学习实践中,张量的维度变换是数据处理和模型构建的基础技能。无论是多模态数据的融合(如图像与文本),还是批处理数据的拆分重组,合理运用张量操作函数可显著优化计算流程。PyTorch提供的cat、stack、split和chunk正是解决此类问题的利器。以下将逐一解析其原理与应用。
一、torch.cat: 沿指定维度拼接张量
功能描述
torch.cat(concatenate)沿已有的某一维度连接多个形状兼容的张量,生成更高维度的单一张量。要求除拼接维度外,其余维度的大小必须完全一致。
示例代码
import torch a = torch.tensor([[1, 2], [3, 4]]) # 形状 (2, 2) b = torch.tensor([[5, 6], [7, 8]]) # 在第0维拼接(垂直方向) c = torch.cat([a, b], dim=0) print(c) # 输出: # tensor([[1, 2], # [3, 4], # [5, 6], # [7, 8]]) # 在第1维拼接(水平方向) d = torch.cat([a, b], dim=1) print(d) # 输出: # tensor([[1, 2, 5, 6], # [3, 4, 7, 8]])
二、torch.stack: 创建新维度堆叠张量
功能描述
torch.stack会将输入张量沿新创建的维度进行堆叠,所有参与堆叠的张量必须具有完全相同的形状。输出张量的维度比原张量多一维。
示例代码
a = torch.tensor([1, 2, 3]) b = torch.tensor([4, 5, 6]) # 沿第0维堆叠,生成二维张量 c = torch.stack([a, b], dim=0) print(c.shape) # torch.Size([2, 3]) print(c) # 输出: # tensor([[1, 2, 3], # [4, 5, 6]]) # 沿第1维堆叠,生成二维张量 d = torch.stack([a, b], dim=1) print(d.shape) # torch.Size([3, 2]) print(d) # 输出: # tensor([[1, 4], # [2, 5], # [3, 6]])
三、torch.split: 按尺寸分割张量
功能描述
torch.split根据指定的尺寸将输入张量分割为多个子张量。支持两种参数形式:
- 整数列表:每个元素表示对应分片的长度
- 整数N:等分为N个子张量(需总长度可被整除)
示例代码
a = torch.arange(9) # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8])
# 按列表尺寸分割 [2,3,4]
parts = torch.split(a, [2, 3, 4], dim=0)
for part in parts:
print(part)
'''
输出:
tensor([0, 1])
tensor([2, 3, 4])
tensor([5, 6, 7, 8])
'''
# 平均分割为3份
chunks = torch.split(a, 3, dim=0)
print([c.shape for c in chunks]) # [torch.Size([3]), torch.Size([3]), torch.Size([3])]
四、torch.chunk: 按数量均分张量
功能描述
torch.chunk将输入张量沿指定维度均匀划分为N份。若无法整除,剩余元素分配到前面的分片中。
示例代码
a = torch.arange(10) # tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 分成3份,默认在第0维操作
chunks = torch.chunk(a, chunks=3, dim=0)
for i, chunk in enumerate(chunks):
print(f"Chunk {i}: {chunk}")
'''
输出:
Chunk 0: tensor([0, 1, 2, 3])
Chunk 1: tensor([4, 5, 6])
Chunk 2: tensor([7, 8, 9])
'''
# 在第1维分割二维张量
b = a.reshape(2,5)
chunks = torch.chunk(b, chunks=2, dim=1)
print(chunks[0].shape) # torch.Size([2, 2])
print(chunks[1].shape) # torch.Size([2, 3])
综合示例:图像数据的分割与合并处理
以下是结合图像数据的完整操作示例,模拟图像预处理流程中的张量操作场景:
场景设定
假设我们有一批RGB图像数据(尺寸为 3×256×256),需要完成以下操作:
- 将图像拆分为RGB三个通道
- 对每个通道进行独立归一化
- 合并处理后的通道
- 将多张图像堆叠成批次
- 分割批次为训练/验证集
代码实现
import torch
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt
# 1. 加载示例图像 (H, W, C) -> 转换为 (C, H, W)
image = Image.open('cat.jpg').convert('RGB')
image = transforms.ToTensor()(image) # shape: torch.Size([3, 256, 256])
# 2. 使用split分离RGB通道
r_channel, g_channel, b_channel = torch.split(image, split_size_or_sections=1, dim=0)
''' 可视化原始通道
plt.figure(figsize=(12,4))
plt.subplot(131), plt.imshow(r_channel.squeeze().numpy(), cmap='Reds'), plt.title('Red')
plt.subplot(132), plt.imshow(g_channel.squeeze().numpy(), cmap='Greens'), plt.title('Green')
plt.subplot(133), plt.imshow(b_channel.squeeze().numpy(), cmap='Blues'), plt.title('Blue')
plt.show()
'''
# 3. 对每个通道进行归一化(示例操作)
def normalize(tensor):
return (tensor - tensor.mean()) / tensor.std()
r_norm = normalize(r_channel)
g_norm = normalize(g_channel)
b_norm = normalize(b_channel)
# 4. 使用cat合并处理后的通道
normalized_img = torch.cat([r_norm, g_norm, b_norm], dim=0)
'''观察归一化效果
plt.imshow(normalized_img.permute(1,2,0))
plt.title('Normalized Image')
plt.show()
'''
# 5. 创建模拟图像批次 (假设有4张相同图像)
batch_images = torch.stack([image]*4, dim=0) # shape: (4, 3, 256, 256)
# 6. 使用chunk分割批次为训练集/验证集
train_set, val_set = torch.chunk(batch_images, chunks=2, dim=0)
print(f"Train set size: {train_set.shape}") # torch.Size([2, 3, 256, 256])
print(f"Val set size: {val_set.shape}") # torch.Size([2, 3, 256, 256])
关键操作解析
| 步骤 | 函数 | 作用 | 维度变化 |
|---|---|---|---|
| 通道分离 | torch.split |
提取单独颜色通道 | (3,256,256)→3个(1,256,256) |
| 数据合并 | torch.cat |
合并处理后的通道数据 | 3个(1,256,256)→(3,256,256) |
| 批次构建 | torch.stack |
将单张图像复制为4张图像的批次 | (3,256,256)→(4,3,256,256) |
| 批次划分 | torch.chunk |
将批次按比例划分为训练/验证集 | (4,3,256,256)→2×(2,3,256,256) |
扩展应用建议
- 数据增强:对split后的通道进行不同变换(如仅对R通道做对比度调整)
- 模型输入:stack后的批次可直接输入CNN网络
- 分布式训练:利用chunk将数据分布到多个GPU处理
- 特征可视化:通过split提取中间层特征图的单个通道进行分析
通过这个完整的图像处理流程示例,可以清晰看到:
split+cat组合常用于特征处理管道stack+chunk组合是构建批处理系统的关键工具- 这些操作在保持计算效率的同时提供了灵活的数据控制能力
总结与对比
| 函数 | 核心作用 | 维度变化 | 输入要求 |
|---|---|---|---|
torch.cat |
沿现有维度拼接 | 不变 | 各张量形状需匹配 |
torch.stack |
新建维度堆叠 | +1维 | 所有张量形状完全相同 |
torch.split |
按尺寸分割 | 不变 | 需指定分割尺寸或份数 |
torch.chunk |
按数量均分 | 不变 | 总长度需可分配 |
应用建议:
- 当需要合并同类数据且保留原始维度时用
cat; - 若需扩展维度以表示批次或通道时用
stack; - 对序列数据分段处理优先考虑
split; - 均匀划分特征图或张量时选择
chunk。
掌握这些工具后,您将能更灵活地操控张量维度,适应复杂模型的构建需求!
到此这篇关于PyTorch张量操作指南(cat、stack、split与chunk)的文章就介绍到这了,更多相关PyTorch张量操作内容请搜索数字提纲【www.sztg.com.cn】以前的文章或继续浏览下面的相关文章希望大家以后多多支持数字提纲【www.sztg.com.cn】!
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
孤勇无双战斗界面操作指南
2026-07-09孤勇无双战斗界面如何操作,下面为大家带来这款游戏的战斗界面的相关操作介绍,比如暴击时伤害数字左侧有爆炸图标,伤害翻倍,受暴击率和暴击精通影响,普攻伤害受连击数(行云流水)影响。 孤勇无双战斗界面操作指南: 战斗画面 1、普攻: 伤害数字颜色为白字: (以1级的新号为例,攻击力为200) 伤害数字为60、100、200、220、240。5个数字随机(也可能是按动作,懒得看了) 普攻伤害受普攻加成影响...
一梦九霄主界面战斗系统操作指南
2026-07-07一梦九霄主界面如何操作战斗,游戏采用次世代画质的全视角国风仙侠MMORPG手游。玩家可从各具特色的多种职业中择一开启征程,与仙友并肩斩妖除魔,下面为大家带来游戏的战斗操作指南。 一梦九霄主界面战斗系统操作指南: 一、战斗界面 1、左上角是角色信息,显示角色血量等。 2、左侧是任务信息栏,展示了任务目标和提示等。 3、左下角是移动控制器:可通过拖动控制角色移动。 4、右侧的开始挂机:点击可以自动战斗...
闪耀吧!噜咪家园界面操作指南
2026-06-11闪耀吧!噜咪家园界面图标用处解析,家园界面中有许多图标入口,每个都代表着不一样的玩法,不清楚没关系,下文将为大家解析这些图标代表的玩法,帮助大家更快理解游戏玩法。 闪耀吧!噜咪家园界面操作指南: 一、码头: 点击右侧一列中的“码头”可快速跳转,放置好鲸咚咚所需要的货物,鲸咚咚会在一定时间后带回贸易奖励,随着贸易次数增多,鲸咚咚的体力会下降,贸易时间也会逐渐变长。不过鲸咚咚的体力每天都会恢复。 二、...
三国杀许攸操作指南
2026-06-11三国杀许攸怎么玩,这次给大家带来的是那位在官渡之战中献计火烧乌巢、最终却因狂傲而死的谋士—许攸。这位武将的操作感和强度都相当出色,想要玩好他可不是简单地“摸牌弃牌”就能上手的哦。 三国杀许攸操作指南: 一、技能机制深度解析 许攸的三个技能环环相扣,构成了一个独特的“控顶+爆发”体系。 首先看核心【成略】。这是一个转换技,意味着它的效果会在“阳”和“阴”之间循环。阳状态摸1弃2,阴状态摸2弃1。关键...
二狗PPT能导出Keynote格式吗?全格式兼容操作指南【教程】
2026-06-04二狗PPT无法直接导出为.key格式,需通过四种路径实现转换:一、导出PPTX后用Keynote打开另存;二、通过iCloud网页版Keynote上传下载;三、macOS快捷操作自动转换;四、离线第三方工具(如LibreOffice+脚本)结构化转换。 ☞☞☞AI智能聊天,问答助手,AI智能搜索,多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您使用二狗PPT制作完成演示文稿,但需交付给使用...
麒麟OS如何安装京东卖家助手_麒麟系统电商操作指南【图文】
2026-05-29银河麒麟系统无法直接安装京东卖家助手,因该软件无原生Linux版;可采用Wine兼容层运行Windows版、使用Web版京麦工作台替代,或通过VirtualBox虚拟机部署Windows环境运行。 如果您在银河麒麟操作系统上需要安装京东卖家助手,但该软件未预装且不在官方应用商店上架,则可能是由于其属于京东官方专供Windows/macOS平台的闭源客户端,原生不提供Linux版本。以下是针对麒麟O...
GitHub Copilot快捷键大全:提升编码效率的必备操作指南
2026-05-29必须将Copilot快捷键刻进肌肉记忆:Tab接受、Esc关闭、Alt+[/]切换建议、Ctrl/Cmd+Enter唤面板;Ctrl/Cmd+Shift+I开内联Chat;VSCode用Ctrl/Cmd+Space主动触发;JetBrains用Alt+↓唤建议、Ctrl+Alt+Enter开Chat;Xcode需手动绑定Tab和Cmd+Shift+C。 ☞☞☞AI智能聊天,问答助手,AI智能搜索,...
飞书文档怎么合并转PPT?二狗PPT多格式兼容操作指南【教程】
2026-05-29飞书文档无法直接“合并转PPT”,但可通过四种路径实现:一、人工整合多文档内容逐页粘贴至新建幻灯片;二、导出文档为PDF后导入生成幻灯片;三、用AIPPT模式上传多文档自动生成;四、先导出为Word并合并标题样式,再导入生成结构化幻灯片。 ☞☞☞AI智能聊天,问答助手,AI智能搜索,多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您在飞书文档中已完成内容撰写,希望将其快速转化为结构清晰、可编...
全国发票查验服务唯一入口 官方发布2026最新操作指南
2026-05-28全国发票查验服务唯一入口是https://inv-veri.chinatax.gov.cn,支持纸质票、数电票查验,直连税务总局核心库,结果权威可溯,界面纯净无广告,符合国密加密与等保三级要求。 全国发票查验服务唯一入口官方发布2026最新操作指南在哪里?这是不少纳税人、企业财务人员及个体经营者近期高频咨询的问题,接下来由PHP小编为大家带来全国发票查验服务唯一入口2026最新官方地址及配套操作指...
知乎怎么修改个人简介 知乎主页资料编辑操作指南
2026-05-28知乎修改个人简介需先通过“我的→头像→编辑资料”进入,再在“一句话介绍”框中输入≤30字的新内容,最后点击右上角“保存”并刷新主页确认生效。 如果您希望在知乎主页上更新自我介绍,但找不到编辑入口或修改后未生效,则可能是由于未进入正确的资料编辑路径或未完成保存操作。以下是修改个人简介的具体步骤: 一、进入个人主页并打开编辑界面 该步骤旨在定位到可编辑的个人信息区域,是所有资料修改操作的前提。只有正确...
