python中张量 PyTorch张量操作指南 python张量转换为矩阵目录一、torch.cat: 沿指定维度拼接张量功能描述示例代码二、torch.stack: 创建新维度堆叠张量功能描述示例代码三、torch.split: 按尺寸分割张量功能描述示例代码四、torch.chunk: 按数量均分张量功能描述示例代码综合示例:图像数据的分割与合并处理场景设定代码实现关键操作解析扩展应用建议拓展资料与对比在深度进修操作中,张量的维度变换是数据处理和模型构建的基础技能。无论是多模态数据的融合(如图像与文本),还是批处理数据的拆分重组,合理运用张量操作函数可显著优化计算流程。PyTorch提供的cat、stack、split和chunk正是解决此类难题的利器。下面内容将逐一解析其原理与应用。一、torch.cat: 沿指定维度拼接张量功能描述torch.cat(concatenate)沿已有的某一维度连接多个形状兼容的张量,生成更高维度的单一张量。要求除拼接维度外,其余维度的大致必须完全一致。示例代码import torcha = 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 torchfrom torchvision import transformsfrom PIL import Imageimport 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张量操作内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 无论兄弟们可能感兴趣的文章:Pytorch数据类型Tensor张量操作的实现支持PyTorch的einops张量操作神器用法示例详解PyTorch中改变张量形状的几种技巧Pytorch:torch.diag()创建对角线张量方式PyTorch张量拼接、切分、索引的实现 2025 年 5 月 7 日 18:05 阅读(0)