理解张量拼接(torch.cat)

news2024/9/22 19:35:39

拼接

维度顺序:对于 3D 张量,通常可以理解为 (深度, 行, 列) 或 (批次, 行, 列)。 选择一个dim进行拼接的时候其他两个维度大小要相等
![[Pasted image 20240808214248.png]]

对于三维张量,理解 torch.catdim 参数确实变得更加抽象,但原理是相同的。让我们通过一个具体的例子来说明这一点。

import torch

# 创建两个 3D 张量
a = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b = torch.tensor([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])

print("Tensor a shape:", a.shape)
print(a)
print("\nTensor b shape:", b.shape)
print(b)

# dim=0 连接
c_dim0 = torch.cat([a, b], dim=0)
print("\nResult of torch.cat([a, b], dim=0):")
print("Shape:", c_dim0.shape)
print(c_dim0)

# dim=1 连接
c_dim1 = torch.cat([a, b], dim=1)
print("\nResult of torch.cat([a, b], dim=1):")
print("Shape:", c_dim1.shape)
print(c_dim1)

# dim=2 连接
c_dim2 = torch.cat([a, b], dim=2)
print("\nResult of torch.cat([a, b], dim=2):")
print("Shape:", c_dim2.shape)
print(c_dim2)

现在让我们详细解释这个三维张量的例子:

  1. 初始张量:

    • ab 都是形状为 (2, 2, 2) 的 3D 张量。
    • 可以将它们想象成两个 2x2 的矩阵堆叠在一起。
  2. dim=0 连接:

    • 结果形状:(4, 2, 2)
    • 这相当于在第一个维度上堆叠张量。
    • 可以理解为将 b 放在 a 的"下面",增加了第一个维度的大小。
  3. dim=1 连接:

    • 结果形状:(2, 4, 2)
    • 这相当于在第二个维度上堆叠张量。
    • 可以理解为在每个 2x2 矩阵的"行"方向上扩展,将 b 的行添加到 a 的每个对应部分的下方。
  4. dim=2 连接:

    • 结果形状:(2, 2, 4)
    • 这相当于在第三个维度(最内层)上堆叠张量。
    • 可以理解为在每个 2x2 矩阵的"列"方向上扩展,将 b 的列添加到 a 的每个对应部分的右侧。

理解三维张量 torch.cat 的关键点:

  1. 维度顺序:对于 3D 张量,通常可以理解为 (深度, 行, 列) 或 (批次, 行, 列)。

  2. dim=0:增加"深度"或"批次"的数量。

  3. dim=1:增加每个"深度"层或"批次"中的行数。

  4. dim=2:增加每行中的元素数量(列数)。

  5. 保持其他维度:除了被连接的维度,其他维度的大小保持不变。

  6. 形状变化:只有指定的 dim 对应的维度大小会改变(增加),其他维度大小保持不变。

  7. 一致性:要连接的张量在非连接维度上的大小必须相同。

3D Matrix Visualization

Let’s visualize the 3D matrices a and b, and their concatenation results.

Matrix a (2x2x2):
Depth 0:    Depth 1:
+---+---+   +---+---+
| 1 | 2 |   | 5 | 6 |
+---+---+   +---+---+
| 3 | 4 |   | 7 | 8 |
+---+---+   +---+---+
Matrix b (2x2x2):
Depth 0:    Depth 1:
+----+----+ +----+----+
| 9  | 10 | | 13 | 14 |
+----+----+ +----+----+
| 11 | 12 | | 15 | 16 |
+----+----+ +----+----+

Concatenation Results:

dim=0 (4x2x2):
Depth 0:    Depth 1:    Depth 2:    Depth 3:
+---+---+   +---+---+   +----+----+ +----+----+
| 1 | 2 |   | 5 | 6 |   | 9  | 10 | | 13 | 14 |
+---+---+   +---+---+   +----+----+ +----+----+
| 3 | 4 |   | 7 | 8 |   | 11 | 12 | | 15 | 16 |
+---+---+   +---+---+   +----+----+ +----+----+
dim=1 (2x4x2):
Depth 0:        Depth 1:
+---+---+       +---+---+
| 1 | 2 |       | 5 | 6 |
+---+---+       +---+---+
| 3 | 4 |       | 7 | 8 |
+---+---+       +---+---+
| 9 | 10 |      | 13| 14|
+---+---+       +---+---+
| 11| 12 |      | 15| 16|
+---+---+       +---+---+
dim=2 (2x2x4):
Depth 0:        Depth 1:
+---+---+---+---+   +---+---+---+---+
| 1 | 2 | 9 | 10|   | 5 | 6 | 13| 14|
+---+---+---+---+   +---+---+---+---+
| 3 | 4 | 11| 12|   | 7 | 8 | 15| 16|
+---+---+---+---+   +---+---+---+---+

当然可以!让我们通过具体的例子来形象地解释不同维度上的拼接。

定义张量

首先,定义三个张量 x, y, z,它们分别具有如下形状:

  • x 的形状是 [2, 1, 3]
  • y 的形状是 [2, 3, 3]
  • z 的形状是 [2, 2, 3]
import torch

x = torch.tensor([[[0, 0, 0]], [[0, 0, 0]]])
y = torch.tensor([
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
])
z = torch.tensor([
    [[0, 0, 0], [0, 0, 0]],
    [[0, 0, 0], [0, 0, 0]]
])

(1) 在 dim=0 上拼接

dim=0 上拼接,相当于增加“深度”或“批次”的数量。每个张量的“深度”都会堆叠起来。

w_dim0 = torch.cat([x, y, z], dim=0)
print(w_dim0.shape)

形象解释

x:
[
 [[0, 0, 0]],  # 第一层深度
 [[0, 0, 0]]   # 第二层深度
]

y:
[
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]],  # 第一层深度
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]]   # 第二层深度
]

z:
[
 [[0, 0, 0], [0, 0, 0]],  # 第一层深度
 [[0, 0, 0], [0, 0, 0]]   # 第二层深度
]

拼接结果 w_dim0:
[
 [[0, 0, 0]],  # x 第一层深度
 [[0, 0, 0]],  # x 第二层深度
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]],  # y 第一层深度
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]],  # y 第二层深度
 [[0, 0, 0], [0, 0, 0]],  # z 第一层深度
 [[0, 0, 0], [0, 0, 0]]   # z 第二层深度
]

形状:[6, 3, 3]

(2)dim=1 上拼接

dim=1 上拼接,相当于增加每个“深度”层中的行数。每个深度层的行数会拼接起来。

w_dim1 = torch.cat([x, y, z], dim=1)
print(w_dim1.shape)

形象解释

x:
[
 [[0, 0, 0]],  # 第一层深度的第一行
 [[0, 0, 0]]   # 第二层深度的第一行
]

y:
[
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]],  # 第一层深度的三行
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]]   # 第二层深度的三行
]

z:
[
 [[0, 0, 0], [0, 0, 0]],  # 第一层深度的两行
 [[0, 0, 0], [0, 0, 0]]   # 第二层深度的两行
]

拼接结果 w_dim1:
[
 [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],  # 第一层深度的六行
 [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]   # 第二层深度的六行
]

形状:[2, 6, 3]

当然可以!为了展示如何在 dim=2(第三个维度)上拼接张量,我们需要确保这些张量在前两个维度上的大小是相同的,而在第三个维度上的大小可以不同。

假设我们定义三个张量 a, b, c,它们分别具有如下形状:

  • a 的形状是 [2, 2, 2]
  • b 的形状是 [2, 2, 3]
  • c 的形状是 [2, 2, 1]
import torch

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

b = torch.tensor([
    [[9, 10, 11], [12, 13, 14]],
    [[15, 16, 17], [18, 19, 20]]
])

c = torch.tensor([
    [[21], [22]],
    [[23], [24]]
])

(3)在 dim=2 上拼接

dim=2 上拼接,相当于增加每行中的元素数量(列数)。每个深度层中的列数会拼接起来:

w_dim2 = torch.cat([a, b, c], dim=2)
print(w_dim2)
print(w_dim2.shape)

形象解释

a:
[
 [[1, 2],      [3, 4]],     # 第一层深度的两行两列
 [[5, 6],      [7, 8]]      # 第二层深度的两行两列
]

b:
[
 [[9, 10, 11], [12, 13, 14]], # 第一层深度的两行三列
 [[15, 16, 17], [18, 19, 20]] # 第二层深度的两行三列
]

c:
[
 [[21],        [22]],       # 第一层深度的两行一列
 [[23],        [24]]        # 第二层深度的两行一列
]

拼接结果 w_dim2:
[
 [[1, 2, 9, 10, 11, 21], [3, 4, 12, 13, 14, 22]],       # 第一层深度的两行六列
 [[5, 6, 15, 16, 17, 23], [7, 8, 18, 19, 20, 24]]       # 第二层深度的两行六列
]

w_dim2 的形状为:[2, 2, 6]

通过在 dim=2 上拼接,结果张量 w_dim2 的第三个维度是各个张量第三个维度的和:2 + 3 + 1 = 6

# 代码输出:
# tensor([[[ 1,  2,  9, 10, 11, 21],
#          [ 3,  4, 12, 13, 14, 22]],
# 
#         [[ 5,  6, 15, 16, 17, 23],
#          [ 7,  8, 18, 19, 20, 24]]])
# 
# 形状: torch.Size([2, 2, 6])

希望这个例子能帮助你更好地理解如何在 dim=2 上拼接张量。
非常好的问题!让我们用书架的比喻来解释这个例子,这将有助于更直观地理解张量的维度。

在这个比喻中:

  • dim=0(第一个维度)代表书架的数量
  • dim=1(第二个维度)代表每个书架的层板数
  • dim=2(第三个维度)代表每个层板可以放置的书本数量(即层板的宽度)

让我们用这个比喻来解释 a, b, 和 c 这三个张量:

  1. 张量 a [2, 2, 2]:

    • 2个书架
    • 每个书架有2层层板
    • 每个层板可以放2本书
  2. 张量 b [2, 2, 3]:

    • 2个书架
    • 每个书架有2层层板
    • 每个层板可以放3本书
  3. 张量 c [2, 2, 1]:

    • 2个书架
    • 每个书架有2层层板
    • 每个层板可以放1本书

当我们在 dim=2 上拼接这些张量时,相当于我们在不改变书架数量和层板数量的情况下,将每个层板变宽,使其可以容纳更多的书。

拼接后的结果 w_dim2 [2, 2, 6]:

  • 仍然是2个书架(dim=0 没变)
  • 每个书架仍然有2层层板(dim=1 没变)
  • 但是现在每个层板可以放6本书了(dim=2 变成了 2+3+1=6)

形象地说:

原来的书架 a:    原来的书架 b:    原来的书架 c:
[□□]            [□□□]           [□]
[□□]            [□□□]           [□]

[□□]            [□□□]           [□]
[□□]            [□□□]           [□]

拼接后的新书架 w_dim2:
[□□□□□□]  (2+3+1 = 6本书)
[□□□□□□]

[□□□□□□]
[□□□□□□]

每个 □ 代表一本书(或者说张量中的一个元素)。

这个比喻展示了我们如何在不增加书架数量(dim=0)或层板数量(dim=1)的情况下,通过拼接来增加每个层板可以放置的书本数量(dim=2)。这就是在 dim=2 上进行张量拼接的直观理解。

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

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

相关文章

【ow365】java对接使用第三方ow365预览pdf,word等office文档

ow365官网 文档在线预览 OfficeWeb365 速度更快的Office在线预览服务提供office在线预览及PDF在线预览服务,支持Word文档在线预览、Excel在线预览、PowerPoint在线预览、WPS等Office文件在线预览,支持所有浏览器及移动设备Mobile预览,无需安…

一款免费开源快速启动工具,提高工作效率!

这是一款可以帮助我们快速启动windows电脑上的程序的工具,可以添加分组,设置网站,程序,系统工具快速一键打开,让桌面变的更简洁,打开程序更方便。小编提醒,直接拖动程序快捷方式到程序框内&…

游戏直播、教学录制两不误:2024年Win适用录屏软件推荐

回顾一下你是去线下看活动的次数多还是在线上参与活动的次数多。线下活动的时候我们一般是举着相机或者手机进行录制,那线上呢?只要找到适合win10录屏的工具你线上活动记录起来就更方便了。 1.FOXIT录屏大师 链接直达:https://www.foxitsof…

隐藏WindTerm左边的时间戳

文章目录 1、快捷键操作隐藏时间戳2、鼠标方式操作隐藏 1、快捷键操作隐藏时间戳 按住 alt 键不动,连续按 t 两下 即可隐藏时间戳 2、鼠标方式操作隐藏 取消勾选时间戳即可隐藏时间戳

NRBO-XGBoost分类 基于牛顿-拉夫逊优化算法[24年最新算法]-XGBoost多特征分类预测+交叉验证

NRBO-XGBoost分类 基于牛顿-拉夫逊优化算法[24年最新算法]-XGBoost多特征分类预测交叉验证 多输入单输出) matlab代码 程序已调试好,无需更改代码替换数据直接使用!!!数据格式为excel格式!需要定制可私&a…

CTF — 图像隐写三板斧

这几天做CTF比赛相关的题目,每天总结一篇与大家分享,本人对CTF也算是个初学者,通过一些学习感觉收获还是很多的。学会了一些工具软件的使用和相关知识的原理。今天继续分享图片隐写,图像隐写类题目的特点:考法多样,思路清奇,工具众多。先分享“第一板斧”的解题套路。 …

Spark轨迹大数据高效处理_计算两经纬度点间的距离_使用Haversine formula公式

开发背景 接上文我求的两经纬度点之间的方位角,我的需求里还提到了要计算距离,当然这个距离也是为后面的需求做铺垫的,因此需要求两个经纬度电之间的距离。 不要妄想用勾股定理求出来,实际上距离的计算还是稍微复杂些。这里使用的…

关于Libarary loader转化成16.6的使用方法

关于Libarary loader转化成16.6的使用方法 直接去贸泽下载程序,免费使用的 2.开始安装 出现图标 3.桌面新建文件夹作为文件生成路径 4.下载ECAD模型的文件 5.打开Library loader 6.这玩意需要搞个邮箱注册,可以用QQ邮箱随便注册一个 7.将下载的文件放…

VBA 指定快捷键在Excel中粘贴指定缩放图片

1. 应用背景 做测试的时候需要在Excel文件中贴图,但是直接粘贴的话图片又太大,需要手动调整,这时就可以利用这个宏来实现一次性粘贴并调整好图片的大小。 2. 宏的制作 可以是.xlsm文件,将该文件放到[C:\Program Files\Microsof…

YOLO:使用labelme进行图片数据标签制作,并转换为YOLO格式

作者:CSDN _养乐多_ 本文将介绍如何使用 labelme 进行图片数据标签制作的方法,并将标签的格式从 JSON 格式转换为 YOLO 格式。 文章目录 一、安装labelme二、使用流程三、json格式转为YOLO格式四、按比例划分数据集(训练、验证、测试&#…

Black Hat USA 2024:微软AI助手Copilot安全隐患曝光

在Black Hat USA 2024,一位研究人员披露了微软AI助手Copilot存在的多个安全隐患,攻击者能够借此漏洞窃取敏感数据和企业凭证。 微软声称,通过将任务委派给AI助手Copilot,每天可以节省数百小时的工作时间。Copilot是微软在2023年2月…

MindSearch:用于增强网络搜索效率的开源人工智能

Web 信息查找与集成是搜索、检索、提取或集成 Web 资源以满足特定需求的活动,是实际生活中几乎所有领域中每个决策和解决问题的实体都必须执行的操作。 大型语言模型 (LLM) 与搜索引擎的集成重新定义了我们在网络上查找和使用信息的方式。因此,LLM 能够…

开放式耳机好用吗?开放式耳机推荐

开放式耳机好用吗? 开放式耳机确实在特定场景下表现出色,它们有着独特的优点,使得不少用户对其青睐有加。 首先,从舒适度来看,开放式耳机避免了入耳式耳机可能带来的耳道压迫感,长时间佩戴也能保持相对舒适…

开源力量,智领云KDP为大数据处理领域注入云原生活力

在数字化转型的浪潮中,大数据处理已成为企业挖掘价值、驱动决策的核心引擎。随着云原生技术的兴起,如何高效、灵活地管理和分析海量数据成为行业面临的新挑战。在此背景下,开源技术以其强大的社区支持、灵活性和可扩展性,正逐步成…

深入理解Java设计模式:23种模式的全面解析

深入理解Java设计模式:23种模式的全面解析 一、创建型模式1. 单例(Singleton)模式2. 原型(Prototype)模式3. 工厂方法(Factory Method)模式4. 抽象工厂(Abstract Factory&#xff09…

JavaWeb中的Servlet

本笔记基于【尚硅谷全新JavaWeb教程,企业主流javaweb技术栈】https://www.bilibili.com/video/BV1UN411x7xe?vd_sourcea91dafe0f846ad7bd19625e392cf76d8总结 Servlet Servlet简介 动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运…

Chapter 30 多态

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、基本概念二、抽象类 前言 多态(Polymorphism)是面向对象编程中的核心概念,本章将详细讲解 Python 中多态的实现方式以及如何应用…

SQL Zoo 8.Using Null

以下数据均来自SQL Zoo 1.List the teachers who have NULL for their department.(列出所属部门为NULL的教师) select name from teacher where dept is null 2.Note the INNER JOIN misses the teachers with no department and the departments wit…

【Git】Git安装_配置

一、Git的安装 1. 下载Git 官方下载:访问Git的官方网站https://git-scm.com/,在首页找到下载链接。但需要注意的是,由于Git的服务器位于国外,直接下载可能会比较慢。镜像下载:推荐使用国内的镜像网站进行下载&#x…

【Canvas与艺术】蓝波纹白底黄星徽章

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>蓝波纹白底黄星徽章</title><style type"text/css&qu…