Pytorch-Tensor操作-tensor.cat和tensor.stack的区别

Pytorch中tensor.cat和tensor.stack的区别
部署运行你感兴趣的模型镜像

背景

我在看pytorch的 torch.cat官方文档的时候,发现了torch.stack函数,这个函数我愿意称之为最难理解的operator之一,我看文档还有让GPT解释半天都没能理解这是什么意思,因此我判断这并不是一个语言可以很好表示的意思。所以我直接花了一个图来辅助我理解他们的区别。
在这里插入图片描述

理解方法

之前在背景里也说了,这个torch.stack函数有点只可意会不可言传,但是我可以一个比较神奇的说法来试图传递我的意思:

  • 把原本的tensor像翻牌一样翻向一个特定的方向,然后在这个方向上进行自身的n次的堆叠
  • 其中堆叠的方向在图中已经用蓝色的箭头表示。

注意,理解过程中,不要太在意维度的 “绝对位置”, 而是要注意每个维度具体的语义。虽然我也不知道你能不能get到我的意思,但是希望这个说法能在某种程度上帮助到你。

再一次感叹我的语文水平,如果我高中语言更认真学一点,是不是就能直接把它说明白了呢?

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>我们有一个包含两个3x2张量的列表,需要将其转换为一个形状为(2,3,2)的张量。 在PyTorch中,我们可以使用`torch.stack()`函数来实现。这个函数会将一个张量序列沿着新的维度进行拼接。 由于列表中有两个张量,我们希望在0维(即第一个维度)上堆叠,从而形成一个新的维度,使得最终张量的形状为(2,3,2)。 步骤: 1. 假设我们有一个列表`tensor_list`,其中包含两个形状均为(3,2)的张量。 2. 使用`torch.stack(tensor_list, dim=0)`,这样就可以在0维上堆叠,得到形状为(2,3,2)的张量。 注意:也可以使用`torch.cat``unsqueeze`的组合,但`torch.stack`更为直接。 示例代码: 假设有两个3x2的张量: tensor1 = torch.tensor([[1, 2], [3, 4], [5, 6]]) tensor2 = torch.tensor([[7, 8], [9, 10], [11, 12]]) 将它们放入一个列表:tensor_list = [tensor1, tensor2] 然后使用torch.stack: result = torch.stack(tensor_list, dim=0) 这样result的形状就是(2,3,2)。 验证: result[0] 应该等于 tensor1 result[1] 应该等于 tensor2 另外,如果列表中的张量不在同一个设备上,需要先确保它们在同一个设备上。但一般情况下,我们假设它们都在同一个设备(如CPU)上。 因此,我们可以这样写: </think>要将包含两个 $3 \times 2$ 张量的列表转换为 $2 \times 3 \times 2$ 的张量向量,可以使用 PyTorch 的 `torch.stack()` 函数。以下是详细步骤代码实现: ### 解决方案 1. **创建示例张量列表** 假设有两个形状为 $(3,2)$ 的张量: ```python import torch # 创建两个 3x2 张量 tensor1 = torch.tensor([[1, 2], [3, 4], [5, 6]]) tensor2 = torch.tensor([[7, 8], [9, 10], [11, 12]]) # 组成列表 tensor_list = [tensor1, tensor2] ``` 2. **使用 torch.stack() 转换维度** 在维度 `dim=0` 上堆叠张量,形成新维度: ```python # 沿第0维度堆叠(创建批次维度) result_tensor = torch.stack(tensor_list, dim=0) print(result_tensor.shape) # 输出: torch.Size([2, 3, 2]) ``` ### 完整代码示例 ```python import torch # 步骤1: 创建两个 3x2 张量组成的列表 tensor1 = torch.tensor([[1, 2], [3, 4], [5, 6]]) tensor2 = torch.tensor([[7, 8], [9, 10], [11, 12]]) tensor_list = [tensor1, tensor2] # 步骤2: 堆叠为 2x3x2 张量 result = torch.stack(tensor_list, dim=0) # 验证结果 print("输入列表长度:", len(tensor_list)) # 输出: 2 print("转换后张量形状:", result.shape) # 输出: torch.Size([2, 3, 2]) print("张量内容:\n", result) """ 输出: tensor([[[ 1, 2], [ 3, 4], [ 5, 6]], [[ 7, 8], [ 9, 10], [11, 12]]]) """ ``` ### 关键说明 1. **`torch.stack()` 工作机制** - 在指定维度(`dim=0`)上添加新维度 - 数学表达:若输入张量 $A \in \mathbb{R}^{3 \times 2}$, $B \in \mathbb{R}^{3 \times 2}$,则输出为: $$ \text{result} = \begin{bmatrix} A \\ B \end{bmatrix} \in \mathbb{R}^{2 \times 3 \times 2} $$ - 与 `torch.cat()` 的区别:`cat` 拼接现有维度,`stack` 创建新维度[^2] 2. **维度选择** - `dim=0`:创建批次维度(最常用) - `dim=1`:在行维度堆叠(形状变为 $3 \times 2 \times 2$) - `dim=2`:在列维度堆叠(形状变为 $3 \times 2 \times 2$) ### 错误处理建议 若遇到维度不匹配错误,需检查: ```python # 验证列表中所有张量形状一致 assert all(t.shape == tensor_list[0].shape for t in tensor_list), "张量形状不一致" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值