tensor属性

本文详细介绍了PyTorch中torch.Tensor的核心属性,包括数据类型dtype、设备device及内存布局layout。解析了不同数据类型及其对应的CPU和GPU版本,设备的指定方式,以及内存布局的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tensor attributes

每一个torch.Tensor 都有一个 torch.dtypetorch.devicetorch.layout

1、torch.dtype

torch.dtype 表示 torch.Tensor 的数据类型。PyTorch 共有9种数据类型,每种又分为CPU和GPU:

Data typedtypeCPU tensorGPU tensor
32-bit floating pointtorch.float32 or torch.floattorch.FloatTensortorch.cuda.FloatTensor
64-bit floating pointtorch.float64 or torch.doubletorch.DoubleTensortorch.cuda.DoubleTensor
16-bit floating pointtorch.float16 or torch.halftorch.HalfTensortorch.cuda.HalfTensor
8-bit integer (unsigned)torch.uint8torch.ByteTensortorch.cuda.ByteTensor
8-bit integer (signed)torch.int8torch.CharTensortorch.cuda.CharTensor
16-bit integer (signed)torch.int16 or torch.shorttorch.ShortTensortorch.cuda.ShortTensor
32-bit integer (signed)torch.int32 or torch.inttorch.IntTensortorch.cuda.IntTensor
64-bit integer (signed)torch.int64 or torch.longtorch.LongTensortorch.cuda.LongTensor
Booleantorch.booltorch.BoolTensortorch.cuda.BoolTensor

2、torch.decive

torch.device 表示分配torch.Tensor的设备。

torch.device 包含设备类型(cpu或 cuda)和可选的设备序号。若设备序号不存在,则表示该类型当前设备,即使在调用 torch.cuda.set_device() 后也是如此。例如,在‘cuda’上构建 torch.Tensor 等价于'cuda:X' ,X为 torch.cuda.current_device() 返回的结果。

torch.Tensor 的device可以通过 Tensor.device 属性访问。
torch.device 可通过字符串或字符串和序号构建。

#字符串构建

>>> torch.device('cuda:0')
device(type='cuda', index=0)

>>> torch.device('cpu')
device(type='cpu')

>>> torch.device('cuda')  # current cuda device
device(type='cuda')
#字符串和序号构建

>>> torch.device('cuda', 0)
device(type='cuda', index=0)

>>> torch.device('cpu', 0)
device(type='cpu', index=0)

注意

1.函数中的 torch.device 参数可以用字符串替换。

>> # Example of a function that takes in a torch.device
>> cuda1 = torch.device('cuda:1')
>> torch.randn((2,3), device=cuda1)
>> # You can substitute the torch.device with a string
>> torch.randn((2,3), device='cuda:1')

2.以 device 为参数的方法,通常接受一个字符串或是整型设备号作为参数。
下面三种表示方法等价:

>> torch.randn((2,3), device=torch.device('cuda:1'))
>> torch.randn((2,3), device='cuda:1')
>> torch.randn((2,3), device=1)  # legacy

3、torch.layout

torch.layout 表示 torch.Tensor 的内存布局。当前支持 torch.strided(稠密tensor)并且实验性的支持 torch.sparse__coo(稀疏COO tensor)。

torch.strided 表示稠密tensor,并且是最常用的内存布局。每个strided型的tensor都关联一个torch.Storage,后者保存数据。torch.Storage 是单个数据类型的连续一维数组。 stride是一个整数列表,第k个值表示在tensor的第k维上,从一个元素到达下一个元素在内存中所需的跳数。该概念使得可以有效地执行许多tensor操作。

示例:

>>> x = torch.Tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> x.stride()
(5, 1)

>>> x.t().stride()
(1, 5)
### 关于Tensor在高维情况下的处理方法或定义 #### 一、Tensor的高维表示 Tensor 是一个多维数组,在 PyTorch 中可以看作是一个通用的数据结构,用于存储和操作多维数据。当提到高维 Tensor 时,通常指的是超过两维的情况(即三维及以上)。例如: - **二维 Tensor** 表示矩阵。 - **三维 Tensor** 可能用来表示一批图像(批量大小 × 图像高度 × 图像宽度)。 - **四维 Tensor** 常见于卷积神经网络输入(批量大小 × 通道数 × 图像高度 × 图像宽度)。 对于更高维度的 Tensor,其形状可以通过 `shape` 属性获取,具体含义取决于应用场景[^1]。 --- #### 二、高维 Tensor 的创建与初始化 以下是几种常见的高维 Tensor 初始化方式: ```python import torch # 创建一个随机的五维 Tensor (batch_size=2, channels=3, depth=4, height=5, width=6) tensor_5d = torch.rand((2, 3, 4, 5, 6)) print(tensor_5d.shape) # 输出: torch.Size([2, 3, 4, 5, 6]) ``` 通过指定尺寸参数,可以直接生成任意维度的 Tensor。这使得 Tensor 成为了灵活表达复杂数据结构的基础工具[^4]。 --- #### 三、高维 Tensor 的切片与索引 针对高维 Tensor 的切片和索引操作非常直观,只需按照所需维度依次指定范围即可。例如: ```python # 继续使用上述 tensor_5d 进行演示 sub_tensor = tensor_5d[0, :, :2, :, :] # 获取第一个样本的所有通道前两个深度层 print(sub_tensor.shape) # 输出: torch.Size([3, 2, 5, 6]) ``` 此操作会提取出特定子集而不改变原始 Tensor 结构。 --- #### 四、高维 Tensor 的变形操作 PyTorch 提供了一系列函数来调整 Tensor 形状,这些函数适用于任何维度的 Tensor: 1. **reshape** 将 Tensor 转换为目标形状,保持总元素数量不变。 ```python reshaped_tensor = tensor_5d.reshape(-1, 6) # 所有其他维度展平成单列,最后一维保留为6 print(reshaped_tensor.shape) # 输出: torch.Size([120, 6]) ``` 2. **permute** 改变 Tensor 各个维度顺序,常用于 CNN 数据预处理阶段交换 channel 和 spatial dimensions。 ```python permuted_tensor = tensor_5d.permute(0, 2, 1, 4, 3) print(permuted_tensor.shape) # 输出: torch.Size([2, 4, 3, 6, 5]) ``` 3. **unsqueeze/squeeze** 动态增加或移除单一维度,便于广播机制应用。 ```python unsqueezed_tensor = tensor_5d.unsqueeze(1) # 在第1位置新增一个维度 squeezed_tensor = unsqueezed_tensor.squeeze(1) # 移除该新加入的维度 print(squeezed_tensor.shape) # 输出恢复原样: torch.Size([2, 3, 4, 5, 6]) ``` 以上变换均不涉及实际数值更改仅影响布局安排[^2]。 --- #### 五、剥离计算图依赖 如果需要对某个高维 Tensor 施加额外独立运算而又不想干扰原有反向传播路径,则可采用 `.detach()` 方法将其从当前计算图分离出来形成新的副本[^3]: ```python detached_tensor = tensor_5d.detach() assert not detached_tensor.requires_grad # 确认已无梯度追踪属性 ``` --- #### 六、总结 综上所述,PyTorch 的 Tensor 不论是在低维还是高维场景下都提供了强大且便捷的操作接口集合。理解并熟练掌握它们能够极大提升模型开发效率以及数据分析能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值