PyTorch 的 torch.unbind 函数详解与进阶应用:中英双语

中文版

PyTorch 的 torch.unbind 函数详解与进阶应用

在深度学习中,张量的维度操作是基础又重要的内容。PyTorch 提供了许多方便的工具来完成这些操作,其中之一便是 torch.unbind。与常见的堆叠函数(如 torch.stack)相辅相成,torch.unbind 是分解张量的重要函数。本文将从基础到进阶,详细介绍 torch.unbind 的功能及其与 torch.stack 的组合应用。


什么是 torch.unbind

torch.unbind 的作用是移除指定维度,并返回一个元组,其中包含移除该维度后的张量序列。换句话说,它将张量沿指定的维度“拆开”。

函数定义
torch.unbind(input, dim=0) → Tuple[Tensor]
参数说明
  • input: 要分解的输入张量。
  • dim: 指定需要移除的维度,默认是 0(第一个维度)。
返回值

返回一个元组,每个元素是一个张量,大小为原张量去掉 dim 维度后的形状。


基本用法

示例 1:沿第 0 维度分解
import torch# 创建一个 3x3 的张量
x = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 沿第 0 维度(行)分解
result = torch.unbind(x, dim=0)
print(result)  # 输出结果

输出

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

分解后得到的结果是一个包含 3 个张量的元组,每个张量是原张量的一行。


示例 2:沿第 1 维度分解
# 沿第 1 维度(列)分解
result = torch.unbind(x, dim=1)
print(result)

输出

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

此时每个张量是原张量的一列。


torch.unbind 的常见应用场景

  1. 将高维数据拆分为低维数据:例如,将一个批量数据(Batch)按样本分解,或将序列数据按时间步长分解。
  2. 与循环配合:分解后可以逐个张量操作,例如在处理时间序列、图像分块时非常有用。
  3. torch.stack 联合使用:可以将分解和重新组合操作结合起来,完成张量维度的灵活操作。

进阶:结合 torch.stack 使用

关于stack函数的具体用法,可参考笔者的另一篇博客:深入理解 PyTorch 中的torch.stack函数:中英双语

示例 3:分解后重新堆叠

我们可以使用 torch.unbind 将张量分解成多个子张量,然后通过 torch.stack 将这些子张量重新堆叠成新的张量。

# 创建一个 3x3 的张量
x = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 第一步:沿第 0 维分解
unbind_result = torch.unbind(x, dim=0)
print("分解结果:", unbind_result)# 第二步:沿新的维度重新堆叠
stack_result = torch.stack(unbind_result, dim=1)
print("重新堆叠结果:", stack_result)

输出

分解结果:
(tensor([1, 2, 3]), tensor([4, 5, 6]), tensor([7, 8, 9]))重新堆叠结果:
tensor([[1, 4, 7],[2, 5, 8],[3, 6, 9]])

在这里:

  • 第一步使用 torch.unbind 沿第 0 维分解,将张量拆分为 3 个张量(每个张量对应原来的行)。
  • 第二步使用 torch.stack 沿第 1 维重新堆叠,生成了一个新张量,其中每个原张量成为了列。

示例 4:动态调整维度顺序

通过结合 torch.unbindtorch.stack,我们可以动态调整张量的维度顺序。

# 创建一个 3x2x2 的三维张量
x = torch.tensor([[[1, 2], [3, 4]],[[5, 6], [7, 8]],[[9, 10], [11, 12]]])# 第一步:沿第 0 维分解为 3 个 2x2 张量
unbind_result = torch.unbind(x, dim=0)# 第二步:沿第 2 维重新堆叠
stack_result = torch.stack(unbind_result, dim=2)
print("最终结果:", stack_result)

输出

最终结果:
tensor([[[ 1,  5,  9],[ 3,  7, 11]],[[ 2,  6, 10],[ 4,  8, 12]]])

这里,我们通过两步实现了维度的重新排列:

  1. 使用 torch.unbind 沿第 0 维分解。
  2. 使用 torch.stack 沿第 2 维重新组合,从而完成了维度转换。

每一步变化解析

参考笔者的另一篇博客:PyTorch如何通过 torch.unbind 和torch.stack动态调整张量的维度顺序
以示例 4 为例,张量的形状在每一步的变化如下:

  1. 原始张量形状为 [3, 2, 2]
  2. 分解后,得到 3 个形状为 [2, 2] 的张量。
  3. 堆叠时,将这些张量沿新的维度 dim=2 组合,最终形状变为 [2, 2, 3]

通过这种分解和堆叠方式,我们可以灵活地操作张量的维度和数据布局。


torch.unbind 的使用注意事项

  1. 分解后返回的是元组

    • 返回值是一个不可变的元组,而不是列表。如果需要动态修改,可以将其转换为列表。
    result = list(torch.unbind(x, dim=0))
    
  2. 维度必须存在

    • 如果指定的 dim 超出了张量的维度范围,PyTorch 会报错。
  3. 结合其他函数使用

    • torch.stacktorch.cattorch.split 等函数搭配,可以完成更加灵活的张量操作。

总结

torch.unbind 是一个高效的张量分解工具,在处理高维数据、调整维度顺序时非常有用。结合 torch.stack,它可以实现从拆分到重组的完整操作链。掌握这些函数的灵活用法,可以大大提升张量操作的效率和代码的可读性。

英文版

A Detailed Guide to PyTorch torch.unbind with Advanced Applications Using torch.stack

In deep learning, manipulating tensor dimensions is both fundamental and essential. PyTorch provides powerful tools for this purpose, and one such tool is torch.unbind. It is particularly useful for breaking down tensors into smaller components, often complementing torch.stack in advanced scenarios. This blog post provides a detailed introduction to torch.unbind, its basic functionality, and how to combine it with torch.stack for advanced applications.


What is torch.unbind?

The torch.unbind function removes a specified dimension from a tensor and returns a tuple containing slices of the tensor along that dimension. Simply put, it splits a tensor along a specific axis.

Function Definition
torch.unbind(input, dim=0) → Tuple[Tensor]
Parameters:
  • input: The tensor to be split.
  • dim: The dimension to be removed (default: 0).
Return Value:

A tuple of tensors, where each tensor is a slice of the input tensor along the specified dimension.


Basic Usage

Example 1: Splitting Along Dimension 0
import torch# Create a 3x3 tensor
x = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# Split along dimension 0 (rows)
result = torch.unbind(x, dim=0)
print(result)

Output:

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

Here, the tensor is split into three tensors, each corresponding to a row of the original tensor.


Example 2: Splitting Along Dimension 1
# Split along dimension 1 (columns)
result = torch.unbind(x, dim=1)
print(result)

Output:

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

This time, the tensor is split into three tensors, each corresponding to a column.


Common Applications of torch.unbind

  1. Breaking Down Batch Data: For processing samples in a batch individually.
  2. Handling Sequential Data: For splitting time steps in sequence data.
  3. Dynamic Tensor Operations: Combining torch.unbind with other functions like torch.stack for flexible tensor manipulation.

Advanced Usage: Combining torch.unbind with torch.stack

The torch.unbind function pairs perfectly with torch.stack to achieve advanced tensor operations. Let’s explore this combination.

Example 3: Split and Restack

In this example, we will split a tensor into slices and then restack it along a new dimension.

# Create a 3x3 tensor
x = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# Step 1: Unbind along dimension 0
unbind_result = torch.unbind(x, dim=0)
print("Unbind result:", unbind_result)# Step 2: Restack along dimension 1
stack_result = torch.stack(unbind_result, dim=1)
print("Stack result:", stack_result)

Output:

Unbind result:
(tensor([1, 2, 3]), tensor([4, 5, 6]), tensor([7, 8, 9]))Stack result:
tensor([[1, 4, 7],[2, 5, 8],[3, 6, 9]])

Process:

  1. The tensor is split into rows using torch.unbind (along dimension 0).
  2. These rows are then stacked into columns using torch.stack (along dimension 1).

Example 4: Reordering Dimensions

Using torch.unbind and torch.stack, you can dynamically reorder tensor dimensions.

# Create a 3x2x2 tensor
x = torch.tensor([[[1, 2], [3, 4]],[[5, 6], [7, 8]],[[9, 10], [11, 12]]])# Step 1: Unbind along dimension 0
unbind_result = torch.unbind(x, dim=0)# Step 2: Stack along dimension 2
stack_result = torch.stack(unbind_result, dim=2)
print("Final result:", stack_result)

Output:

Final result:
tensor([[[ 1,  5,  9],[ 3,  7, 11]],[[ 2,  6, 10],[ 4,  8, 12]]])

Explanation:

  1. torch.unbind splits the tensor along the first dimension (size 3), resulting in three 2×2 tensors.
  2. torch.stack then combines these tensors along a new dimension (dim=2), effectively reordering the dimensions.

Step-by-Step Shape Transformation

Using Example 4, let’s track the shape transformations:

  1. Input Shape: [3, 2, 2].
  2. After torch.unbind(dim=0): A tuple of 3 tensors, each of shape [2, 2].
  3. After torch.stack(dim=2): A new tensor of shape [2, 2, 3].

Key Considerations

  1. Output is a Tuple:

    • The result of torch.unbind is a tuple, which is immutable. To modify the result, you can convert it to a list:
    result = list(torch.unbind(x, dim=0))
    
  2. Dimension Must Exist:

    • The specified dim must be within the tensor’s dimensions; otherwise, an error will occur.
  3. Paired with Other Functions:

    • torch.unbind works well with functions like torch.stack, torch.cat, and torch.split for advanced manipulation.

Conclusion

torch.unbind is a powerful tool for splitting tensors into smaller components, and its ability to work seamlessly with other PyTorch functions like torch.stack makes it indispensable for flexible tensor manipulation. Whether you’re working on sequence data, batch processing, or dynamic dimension reordering, mastering torch.unbind will significantly enhance your PyTorch skills.

Try out these examples in your projects to fully understand the potential of torch.unbind!

后记

2024年12月12日22点20分于上海,在GPT4o大模型辅助下完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLServer利用QQ邮箱做SMTP服务器发邮件

环境 Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) SQL Server Management Studio 15.0.18384.0 SQL Server 管理对象 (SMO) 16.100.46367.54 Microsoft .NET Framework 4.0.30319.42000 操作系统 Windows Server2019 ———————————————— 前言&#xf…

好用的网站-直接复制的文字图标不需要引入

分享一个前端不需要引入的,可以直接复制的图标网站 直接复制放在代码中 特殊符号大全,可直接复制黏贴 (shijianchuo.net)

修改uniapp下拉刷新圆圈颜色

直接看图 修改前就是常规的绿色 自定义更符合我们的软件 直接说方法 修改 在App.vue的style样式里添加一行 .uni-page-refresh--refreshing .uni-page-refresh__path{stroke:#FF2442; }我是通过 不执行 uni.stopPullDownRefresh(); 下拉刷新 之后通过F12看出来的 希望可以帮…

Maven插件打包发布远程Docker镜像

dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟,它集成了Maven和Docker,该插件的官方文档地址如下: 地址:https://github.com/spotify/dockerfile-maven 其他说明: dockerfile是用…

12.11数据结构-图

无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。 有向完全图:在有向图中,如果任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。 含有n个顶点的无向完全图有…

Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)

一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址:https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64,一直下一步,选择安装的路径位置,一直下一步就安装完成了。打开Anaconda PowerShell Promp…

git使用教程(超详细)-透彻理解git

一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉,我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录,你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…

简单的Java小项目

学生选课系统 在控制台输入输出信息&#xff1a; 在eclipse上面的超级简单文件结构&#xff1a; Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…

java全栈day16--Web后端实战(数据库)

一、数据库介绍 二、Mysql安装&#xff08;自行在网上找&#xff0c;教程简单&#xff09; 安装好了进行Mysql连接 连接语法&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroot -p密码 方法二&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroo…

CORDIC 算法实现 _FPGA

注&#xff1a;本文为 “CORDIC 算法” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 Cordic 算法的原理介绍 乐富道 2014-01-28 23:05 Cordic 算法知道正弦和余弦值&#xff0c;求反正切&#xff0c;即角度。 采用用不断的旋转求出对应的正弦余弦值&…

前端(vue组件)

1组件对象 1.1定义组件对象 defineComponent( {} ) 1.2注册组件 1.3使用组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

MySQL八股-MVCC入门

文章目录 当前读&#xff08;加锁&#xff09;快照读&#xff08;不加锁&#xff09;MVCC隐藏字段undo-log版本链A. 第一步B.第二步C. 第三步 readview MVCC原理分析RCA. 先来看第一次快照读具体的读取过程&#xff1a;B. 再来看第二次快照读具体的读取过程: RR隔离级别 当前读…

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …

从 CephFS 到 JuiceFS:同程旅游亿级文件存储平台构建之路

随着公司业务的快速发展&#xff0c;同程旅行的非结构化的数据突破 10 亿&#xff0c;在 2022 年&#xff0c;同程首先完成了对象存储服务的建设。当时&#xff0c;分布式文件系统方面&#xff0c;同程使用的是 CephFS&#xff0c;随着数据量的持续增长&#xff0c;CephFS 的高…

Jenkins参数化构建详解(This project is parameterized)

本文详细介绍了Jenkins中不同类型的参数化构建方法&#xff0c;包括字符串、选项、多行文本、布尔值和git分支参数的配置&#xff0c;以及如何使用ActiveChoiceParameter实现动态获取参数选项。通过示例展示了传统方法和声明式pipeline的语法 文章目录 1. Jenkins的参数化构建1…

【图像处理】利用numpy实现直方图均衡、自适应直方图均衡、对比度受限自适应直方图均衡

直方图均衡化是一种在图像处理技术&#xff0c;通过调整图像的直方图来增强图像的对比度。 本博客不利用opencv库&#xff0c;仅利用numpy、matplotlib来实现直方图均衡、自适应直方图均衡、对比度受限自适应直方图均衡 直方图均衡 包括四个流程 计算图像RGB三通道的归一化直…

组织空转数据(人类+小鼠)

空间转录组&#xff08;Spatial Transcriptomics&#xff09;是一种新兴的高通量基因组学技术&#xff0c;它允许我们在组织切片中同时获取基因表达信息和细胞的空间位置信息。其可以帮助我们更好地理解细胞在组织中的空间分布和相互作用&#xff0c;揭示组织发育、器官功能和疾…

[数据结构#1] 并查集 | FindRoot | Union | 优化 | 应用

目录 1. 并查集原理 问题背景 名称与编号映射 数据结构设计 2. 并查集基本操作 (1) 初始化 (2) 查询根节点 (FindRoot) (3) 合并集合 (Union) (4) 集合操作总结 并查集优化 (1) 路径压缩 (2) 按秩合并 3. 并查集的应用 (1) 统计省份数量 (2) 判断等式方程是否成…

JPA 基本查询(一)

JPA 查询简介示例 JPA教程 - JPA查询简介示例 最简单的JPQL查询选择单个实体类型的所有实例。 考虑下面的查询: SELECT e FROM Employee eJPQL尽可能使用SQL语法。 SQL查询从表中选择。JPQL从应用程序域模型的实体中选择。 语法 选择查询的整体形式如下: SELECT <sel…

【操作系统1】一篇文章便可入门操作系统

操作系统 (Operating System,OS)是一种系统软件&#xff0c;它负责管理计算机的硬件和软件资源。它的主要任务是组织和调度计算机的工作&#xff0c;并分配资源给用户和其他软件。操作系统为用户和软件提供了方便的接口和环境。它是计算机系统中最基本的软件之一。 一、操作系…