PyTorch --torch.cat张量拼接原理

[复制链接]
发表于 2025-10-2 09:52:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在 PyTorch 的 torch.cat 函数中,out 参数用于指定输出张量的存储位置。是否使用 out 参数直接影响效果的存储方式和张量的内存活动。以下是具体表明:

  • 不使用 out 参数(默认活动)
    寄义:不提供 out 参数时,torch.cat 会创建一个新的张量来存储拼接后的效果,并返回这个新张量。
    特点:
    内存分配:PyTorch 会为效果分配新的内存空间。
    原张量稳固:输入的原始张量(如 tensors 中的张量)不会被修改。
    返回新张量:返回的张量是独立的,与输入张量没有内存共享
  • 使用 out 参数
    寄义:通过 out 参数提供一个已存在的张量,torch.cat 将直接将效果写入该张量中,无需创建新张量。
    特点:
    内存复用:制止分配新内存,直接使用已有张量的内存空间。
    原张量被修改:out 指定的张量会被覆盖,其内容会被更换为拼接效果。
    外形匹配:out 张量的外形必须与拼接后的效果完全划一,否则会报错。
以下是关于 torch.cat 在差别 dim 下的拼接过程的公式化形貌及可视化示例,用分块矩阵的情势出现:

1. 数学公式化形貌

1.1 沿 dim=0(行方向)拼接

假设:

  • 张量 A  的外形为 m×nm\times nm×n
  • 张量  B 的外形为  p×np\times np×n
  • 全部张量在非拼接维度(列数  nnn)必须划一。
拼接后的张量 C 外形为 (m+p)×n (m + p) \times n (m+p)×n,公式表现为:C=[AB]C = \begin{bmatrix}A \\B\end{bmatrix}C=[AB​]
即:
Ci,j={Ai,j,若 1≤i≤m,Bi−m,j,若 m+1≤i≤m+p.C_{i,j} = \begin{cases}A_{i,j}, & \text{若 } 1 \leq i \leq m, \\B_{i-m,j}, & \text{若 } m+1 \leq i \leq m+p.\end{cases}Ci,j​={Ai,j​,Bi−m,j​,​若 1≤i≤m,若 m+1≤i≤m+p.​

1.2 沿 dim=1(程度/列方向)拼接

假设条件:

  • 张量 AAA 的外形为 m×nm \times nm×n
  • 张量 BBB 的外形为 m×pm \times pm×p
  • 两个张量在非拼接维度(行维度 mmm)上必须保持划一
拼接使用:
程度拼接后的张量 CCC 外形为 m×(n+p)m \times (n + p)m×(n+p),其数学表现为:
C=[AB]C = \begin{bmatrix} A & B \end{bmatrix}C=[A​B​]
元素级界说:
Ci,j={Ai,j当 1≤j≤nBi,j−n当 n+1≤j≤n+pC_{i,j} = \begin{cases} A_{i,j}       & \text{当 } 1 \leq j \leq n \\ B_{i,j-n} & \text{当 } n+1 \leq j \leq n+p \end{cases}Ci,j​={Ai,j​Bi,j−n​​当 1≤j≤n当 n+1≤j≤n+p​
维度分析:

  • 行维度:mmm(保持稳固)
  • 列维度:n+pn + pn+p(AAA 和 BBB 列数的总和)

2. 具体示例(使用数值矩阵)

张量拼接示例

示例 1:沿第 0 维度拼接 (dim=0)

输入张量:

  • A=[1234](外形 2×2)A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \quad (\text{外形 } 2 \times 2) A=[13​24​](外形 2×2)
  • B=[5678](外形 2×2) B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} \quad (\text{外形 } 2 \times 2) B=[57​68​](外形 2×2)
拼接使用:
C=concat⁡(A,B,dim=0) C = \operatorname{concat}(A, B, \text{dim}=0) C=concat(A,B,dim=0)
输出效果:
C=[12345678](外形 4×2)C = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ \hline5 & 6 \\ 7 & 8 \end{bmatrix} \quad (\text{外形 } 4 \times 2)C=​1357​2468​​​(外形 4×2)

示例 2:沿第 1 维度拼接 (dim=1)

输入张量:

  • A=[1234](外形 2×2) A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \quad (\text{外形 } 2 \times 2) A=[13​24​](外形 2×2)
  • B=[5678](外形 2×2) B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} \quad (\text{外形 } 2 \times 2) B=[57​68​](外形 2×2)
拼接使用:
C=concat⁡(A,B,dim=1) C = \operatorname{concat}(A, B, \text{dim}=1) C=concat(A,B,dim=1)
输出效果:
C=[12563478](外形 2×4)C = \begin{bmatrix} 1 & 2 & 5 & 6 \\ 3 & 4 & 7 & 8 \end{bmatrix} \quad (\text{外形 } 2 \times 4)C=[13​24​57​68​](外形 2×4)
关键分析


  • dim=0 表现垂直拼接(沿行方向堆叠)
  • dim=1 表现程度拼接(沿列方向毗连)
  • 拼接维度的巨细可以差别,但其他维度必须完全雷同(比方 dim=1 拼接时,两个张量的行数必须相称)

以下是用表格情势展示 dim=0 和 dim=1 的拼接效果:
沿 dim=0 拼接

初始张量 ( A )初始张量 ( B )拼接效果 ( C )(dim=0)[[1, 2],[[5, 6],[[1, 2], [3, 4]] [7, 8]] [3, 4],外形:2×2外形:2×2 [5, 6], [7, 8]]外形:4×2沿 dim=1 拼接

初始张量 ( A )初始张量 ( B )拼接效果 ( C )(dim=1)[[1, 2],[[5, 6],[[1, 2, 5, 6], [3, 4]] [7, 8]] [3, 4, 7, 8]]外形:2×2外形:2×2外形:2×4
3. 关键点总结


  • 维度划一性:

    • dim=0:全部张量的列数(n)必须雷同。
    • dim=1:全部张量的行数(m)必须雷同。

  • 拼接方向:

    • dim=0:垂直方向拼接(行数相加)。
    • dim=1:程度方向拼接(列数相加)。

  • 数学符号表现:

    • dim=0:C=[AB]C = \begin{bmatrix} A \\ B \end{bmatrix}C=[AB​]
    • dim=1:C=[AB]C = \begin{bmatrix} A & B \end{bmatrix}C=[A​B​]


5. 扩展示例(多维张量)

假设张量为三维(如图像的批处置惩罚):
A∈RB×C×H×W A \in \mathbb{R}^{B \times C \times H \times W} A∈RB×C×H×W
B∈RB′×C×H×WB \in \mathbb{R}^{B' \times C \times H \times W} B∈RB′×C×H×W

  • 拼接 dim=0(批处置惩罚方向):
    C∈R(B+B′)×C×H×WC \in \mathbb{R}^{(B+B') \times C \times H \times W}C∈R(B+B′)×C×H×W

以下是三维张量拼接的示例,使用分块矩阵的情势展示沿差别维度(dim=0, dim=1, dim=2)的拼接过程:

三维张量拼接示例

假设两个三维张量 ( A ) 和 ( B ),外形分别为:
-A∈R2×3×2(外形:2×3×2)A \in \mathbb{R}^{2 \times 3 \times 2}(外形:2×3×2)A∈R2×3×2(外形:2×3×2)
-B∈R1×3×2(外形:1×3×2)B \in \mathbb{R}^{1 \times 3 \times 2} (外形:1×3×2)B∈R1×3×2(外形:1×3×2)
1. 沿 dim=0 拼接(扩展第一个维度)


  • 拼接条件:除 dim=0 外,其他维度(3×2)必须划一。
  • 拼接效果外形:(2+1)×3×2=3×3×2(2 + 1) \times 3 \times 2 = 3 \times 3 \times 2 (2+1)×3×2=3×3×2
  • 数学表现:
    C=[A1A2B1]C = \begin{bmatrix}A_{1} \\ A_{2} \\ B_{1}\end{bmatrix}C=​A1​A2​B1​​​
    此中A1,A2A_1, A_2A1​,A2​ 是 AAA的两个“块”,B1B_1B1​是 BBB的唯一块。
数值示例:


  • 输入张量:

    • A=[[123456],[789101112]]A = \begin{bmatrix}\begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix}, & \begin{bmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{bmatrix}\end{bmatrix}A=​​135​246​​,​​7911​81012​​​​
    • B=[[131415161718]]B = \begin{bmatrix}\begin{bmatrix} 13 & 14 \\ 15 & 16 \\ 17 & 18 \end{bmatrix}\end{bmatrix}B=​​131517​141618​​​​

  • 拼接效果(dim=0):
    C=[[123456],[789101112],[131415161718]]C = \begin{bmatrix}\begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix}, & \begin{bmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{bmatrix}, & \begin{bmatrix} 13 & 14 \\ 15 & 16 \\ 17 & 18 \end{bmatrix}\end{bmatrix}C=​​135​246​​,​​7911​81012​​,​​131517​141618​​​​
    外形:3×3×23 \times 3 \times 23×3×2

2. 沿 dim=1 拼接(扩展第二个维度)


  • 拼接条件:除 dim=1 外,其他维度(2×2)必须划一。
  • 假设调解后的张量外形:

    • A∈R2×3×2 A \in \mathbb{R}^{2 \times 3 \times 2}A∈R2×3×2
      -B∈R2×2×2B \in \mathbb{R}^{2 \times 2 \times 2}B∈R2×2×2

  • 拼接效果外形:2×(3+2)×2=2×5×22 \times (3 + 2) \times 2 = 2 \times 5 \times 2 2×(3+2)×2=2×5×2
  • 数学表现:
    C=[A1B1A2B2]C = \begin{bmatrix}A_{1} & B_{1} \\A_{2} & B_{2}\end{bmatrix}C=[A1​A2​​B1​B2​​]
    此中 (A1,A2)( A_1, A_2 )(A1​,A2​) 是 (A)( A )(A) 的块,(B1,B2)( B_1, B_2 )(B1​,B2​) 是 BBB 的块。
数值示例:


  • 输入张量:
    -A=[[123456],[789101112]]A = \begin{bmatrix}  \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix}, &   \begin{bmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{bmatrix}\end{bmatrix}A=​​135​246​​,​​7911​81012​​​​

    • B=[[13141516],[17181920]]B = \begin{bmatrix}\begin{bmatrix} 13 & 14 \\ 15 & 16 \end{bmatrix}, & \begin{bmatrix} 17 & 18 \\ 19 & 20 \end{bmatrix}\end{bmatrix}B=[[1315​1416​],​[1719​1820​]​]

  • 拼接效果(dim=1):
    C=[[123456][13141516],[789101112][17181920]]C = \begin{bmatrix}\begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} \quad \begin{bmatrix} 13 & 14 \\ 15 & 16 \end{bmatrix}, & \begin{bmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{bmatrix} \quad \begin{bmatrix} 17 & 18 \\ 19 & 20 \end{bmatrix}\end{bmatrix}C=​​135​246​​[1315​1416​],​​7911​81012​​[1719​1820​]​​
    外形: 2×5×22 \times 5 \times 22×5×2

3. 沿 dim=2 拼接(扩展第三个维度)


  • 拼接条件:除 dim=2 外,其他维度(2×3)必须划一。
  • 假设调解后的张量外形:

    • A∈R2×3×2A \in \mathbb{R}^{2 \times 3 \times 2}A∈R2×3×2
    • B∈R2×3×3B \in \mathbb{R}^{2 \times 3 \times 3}B∈R2×3×3

  • 拼接效果外形:(2×3×(2+3)=2×3×5)( 2 \times 3 \times (2 + 3) = 2 \times 3 \times 5 )(2×3×(2+3)=2×3×5)
  • 数学表现:
    C=[A1B1A2B2]C = \begin{bmatrix}A_{1} & B_{1} \\A_{2} & B_{2}\end{bmatrix}C=[A1​A2​​B1​B2​​]
    此中每个块在第三个维度上拼接。
数值示例:


  • 输入张量:

    • A=[[123456],[789101112]]A = \begin{bmatrix}\begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix}, & \begin{bmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{bmatrix}\end{bmatrix}A=​​135​246​​,​​7911​81012​​​​
      -B=[[131415161718192021],[222324252627282930]] B = \begin{bmatrix}\begin{bmatrix} 13 & 14 & 15 \\ 16 & 17 & 18 \\ 19 & 20 & 21 \end{bmatrix}, & \begin{bmatrix} 22 & 23 & 24 \\ 25 & 26 & 27 \\ 28 & 29 & 30 \end{bmatrix}\end{bmatrix} B=​​131619​141720​151821​​,​​222528​232629​242730​​​​

  • 拼接效果(dim=2):
    C=[[121314153416171856192021],[782223249102526271112282930]]C = \begin{bmatrix}\begin{bmatrix} 1 & 2 & 13 & 14 & 15 \\ 3 & 4 & 16 & 17 & 18 \\ 5 & 6 & 19 & 20 & 21 \end{bmatrix}, & \begin{bmatrix} 7 & 8 & 22 & 23 & 24 \\ 9 & 10 & 25 & 26 & 27 \\ 11 & 12 & 28 & 29 & 30 \end{bmatrix}\end{bmatrix}C=​​135​246​131619​141720​151821​​,​​7911​81012​222528​232629​242730​​​​
    外形:$2 \times 3 \times 5 )

关键点总结


  • 维度扩展方向:

    • dim=0:增长第一个维度的巨细(如批处置惩罚巨细)。
    • dim=1:增长第二个维度的巨细(如通道数或行数)。
    • dim=2:增长第三个维度的巨细(如列数或深度)。

  • 外形划一性:

    • 全部输入张量在非拼接维度的外形必须完全划一。

  • 应用场景:

    • dim=0:归并差别批次的图像数据。
    • dim=1:在通道维度拼接特性图(如图像处置惩罚中的多模态数据)。
    • dim=2:扩展特性的维度(如时间序列中的时间步)。

通过上述示例和表格,可以直观明白三维张量在差别维度上的拼接逻辑。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表