PyTorch Tensor 的创建与操作入门
目录
1. 了解Tensor
1.1 概念
1.2 特点
1.3 数据类型
2. PyTorch Tensor 的创建
2.1 使用 torch.tensor()
2.2 使用 torch.Tensor()
2.3 使用 torch.arange() 和 torch.linspace()
2.4 使用 torch.randn()
3. Tensor 的设备切换
3.1 在创建 Tensor 时指定设备
3.2 使用 to() 方法切换设备
2.3 使用 cuda() 和 cpu() 方法
4. 数据类型转换
5. 完整代码示例
6. 总结
在深度学习中,Tensor(张量)是核心数据结构,所谓张量就是元素为相同类型的多维矩阵,类似于 NumPy 中的数组,但可以在 GPU 上高效运行。PyTorch 提供了丰富的 API 来创建和操作 Tensor。今天,我们就来通过一个简单的代码示例,学习 PyTorch 中 Tensor 的创建、设备切换、数据类型转换等基本操作。
1. 了解Tensor
1.1 概念
1.2 特点
1.多维数组的推广
张量是标量(0 维张量)、向量(1 维张量)、矩阵(2 维张量)的高维扩展,维度(阶数)可灵活定义(如 3 维、4 维等),能自然表示高维数据(如图像的 [batch, 高,宽,通道])。
2.形状与元素组织
每个张量有明确的 “形状”(shape),即各维度的元素数量(如 (2,3,4) 表示 3 维张量,共 2×3×4=24 个元素),元素按规则的网格结构排列,便于高效存储和计算。
3.数值类型统一性
张量内所有元素通常为同一数据类型(如 float32、int64),保证计算时的一致性和效率,这是与 Python 列表(可混合类型)的关键区别。
4.支持高效运算
张量可通过 GPU 等硬件加速并行计算,配合 PyTorch、TensorFlow 等框架的算子(如加减、卷积、矩阵乘法),能高效处理大规模数据。
5.关联数学意义
在物理和数学中,张量具有 “坐标变换不变性”,可描述向量、线性变换等在不同坐标系下的统一规律(如应力张量、电磁张量)。
简言之,张量是兼具灵活性(高维表示)、结构性(固定形状)和高效性(并行计算)的数据载体,是处理复杂多维信息的核心工具。
1.3 数据类型
2. PyTorch Tensor 的创建
2.1 使用 torch.tensor()
torch.tensor()
是一个非常灵活的函数,可以用来创建 Tensor。你可以指定数据类型(dtype
)和设备(device
)。
t1 = torch.tensor([1, 2, 3, 4], dtype=torch.int32, device='cuda')
print(t1)
-
dtype=torch.int32
:指定数据类型为 32 位整数。 -
device='cuda'
:指定 Tensor 存储在 GPU 上。
2.2 使用 torch.Tensor()
torch.Tensor()
是一个构造函数,用于创建一个随机初始化的 Tensor。如果你不指定数据,它会自动填充随机值。
t2 = torch.Tensor(3, 2)
print(t2)
-
3, 2
:表示创建一个 3 行 2 列的 Tensor。
2.3 使用 torch.arange()
和 torch.linspace()
torch.arange()
和 torch.linspace()
是两个非常有用的函数,用于创建具有特定范围和步长的 Tensor。
t4 = torch.arange(0, 10, 2)
print(t4)t5 = torch.linspace(0, 10, steps=5)
print(t5)
-
torch.arange(start, end, step)
:从start
开始,到end
结束,步长为step
。 -
torch.linspace(start, end, steps)
:从start
开始,到end
结束,生成指定步数的 Tensor。
2.4 使用 torch.randn()
torch.randn()
用于生成正态分布的随机 Tensor,均值为 0,方差为 1。
torch.manual_seed(0) # 设置随机数种子
t6 = torch.randn(3, 2)
print(t6)
-
3, 2
:表示生成一个 3 行 2 列的 Tensor。 -
torch.manual_seed(0)
:设置随机数种子,确保每次运行程序时生成的随机数相同。
3. Tensor 的设备切换
在 PyTorch 中,Tensor 可以在 CPU 和 GPU 之间切换。这在深度学习中非常重要,因为 GPU 可以加速计算。
3.1 在创建 Tensor 时指定设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
t7 = torch.tensor([1, 2, 3, 4, 5], device=device)
print(t7.device)
3.2 使用 to()
方法切换设备
t8 = torch.tensor([1, 2, 3, 4, 5, 6]
device = "cuda" if torch.cuda.is_available() else "cpu"
t8 = t8.to(device)
print(t8.device)
2.3 使用 cuda()
和 cpu()
方法
# 切换GPU
t9 = t8.cuda()
print(t9.device)
# 切换cpu
t9 = t8.cpu()
print(t9.device)
4. 数据类型转换
PyTorch 支持多种数据类型,如 torch.float32
、torch.int32
等。可以通过 to()
方法进行转换。
t10 = t8.to(torch.float32)
print(t10.dtype)
-
t8.to(torch.float32)
:将 Tensor 的数据类型转换为 32 位浮点数。
5. 完整代码示例
import torch# print(torch.__version__)
# print(torch.cuda.is_available())'''
tensor():可以指定数据的的type、device等属性
Tensor():构造函数,按照默认的方式创建tensor
'''def test01():t1 = torch.tensor([1, 2, 3, 4], dtype=torch.int32, device='cpu')print(t1)t2 = torch.Tensor(3,2)print(t2)t3 = torch.Tensor([1, 2, 3, 4])print(t3)print(t3.dtype)t4 = torch.arange(0, 10, 2)print(t4)t5 = torch.linspace(0, 10, steps=5)print(t5)# randn:随机创建正态分布的数值,均值为0,方差为1# 参数:创建3个样本,每个样本有2个特征,或者创建3行2列的矩阵# torch.manual_seed(0):设置随机数种子,保证每次运行程序时,生成的随机数相同torch.manual_seed(0)t6 = torch.randn(3, 2)print(t6)# tensor切换设备的三种方式# 1.直接指定,在创建tensor时指定device参数# 2.使用to()方法,将tensor切换到指定设备# 3.使用cuda()方法,将tensor切换到GPU设备,如果要切换到CPU,可以使用cpu()方法device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')t7 = torch.tensor([1, 2, 3, 4, 5], device=device)print(t7.dtype, t7.shape, t7.device)t8 = torch.tensor([1, 2, 3, 4, 5, 6])t8.to(device)print(t8.device)t9 = t8.cpu()print(t9.device)# 数据类型转换t10 = t8.to(torch.float32)print(t10.dtype)if __name__ == '__main__':test01()
6. 总结
通过这篇文章,我们学习了 PyTorch 中 Tensor 的基本操作,包括:
-
Tensor的概念。
-
如何创建 Tensor。
-
如何在 CPU 和 GPU 之间切换 Tensor。
-
如何转换 Tensor 的数据类型。
这些操作是深度学习的基础,希望这篇文章能帮助你更好地理解和使用 PyTorch!