PyTorch教程:深入理解Tensor基础操作
tutorials PyTorch tutorials. 项目地址: https://gitcode.com/gh_mirrors/tuto/tutorials
什么是Tensor
Tensor(张量)是PyTorch中最基础的数据结构,类似于NumPy中的ndarray,但具有更强大的功能。Tensor可以看作是多维数组,能够表示标量(0维)、向量(1维)、矩阵(2维)以及更高维度的数据结构。
与NumPy数组相比,Tensor有两大核心优势:
- 可以在GPU或其他硬件上运行,大幅提升计算效率
- 支持自动微分(Autograd),这是深度学习模型训练的关键特性
Tensor的初始化方法
PyTorch提供了多种创建Tensor的方式,满足不同场景的需求:
1. 直接从Python列表创建
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
这种方式会自动推断数据类型,非常直观方便。
2. 从NumPy数组转换
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
PyTorch与NumPy之间的转换是零拷贝操作,内存共享,效率极高。
3. 基于已有Tensor创建
x_ones = torch.ones_like(x_data) # 保持x_data的形状和数据类型
x_rand = torch.rand_like(x_data, dtype=torch.float) # 可以覆盖数据类型
这种方法常用于创建与现有Tensor形状相同但内容不同的新Tensor。
4. 使用随机值或固定值初始化
shape = (2, 3) # 定义Tensor的形状
rand_tensor = torch.rand(shape) # 均匀分布随机值
ones_tensor = torch.ones(shape) # 全1
zeros_tensor = torch.zeros(shape) # 全0
这是深度学习中最常用的初始化方式之一。
Tensor的重要属性
了解Tensor的属性对于高效编程至关重要:
tensor = torch.rand(3, 4)
print(f"形状: {tensor.shape}") # 维度信息
print(f"数据类型: {tensor.dtype}") # 如torch.float32
print(f"存储设备: {tensor.device}") # CPU或GPU
特别要注意device
属性,它决定了Tensor是在CPU还是GPU上运算,这对性能影响巨大。
Tensor的常用操作
PyTorch提供了超过1200种Tensor操作,涵盖了各种数学运算和矩阵操作。
1. 索引和切片
tensor = torch.ones(4, 4)
print(tensor[0]) # 第一行
print(tensor[:, 0]) # 第一列
print(tensor[..., -1]) # 最后一列
tensor[:,1] = 0 # 修改第二列
语法与NumPy几乎一致,学习成本低。
2. 连接操作
t1 = torch.cat([tensor, tensor, tensor], dim=1) # 沿第1维度连接
torch.cat
是常用的拼接函数,注意与torch.stack
的区别。
3. 矩阵运算
# 矩阵乘法
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)
# 逐元素乘法
z1 = tensor * tensor
z2 = tensor.mul(tensor)
PyTorch提供了多种方式实现相同操作,灵活选择。
4. 单元素Tensor转换
agg = tensor.sum()
agg_item = agg.item() # 转换为Python标量
.item()
方法常用于获取损失值等单元素Tensor的值。
5. 原地操作(In-place)
tensor.add_(5) # 下划线后缀表示原地操作
原地操作可以节省内存,但在自动微分时可能引发问题,需谨慎使用。
Tensor与NumPy的互操作
PyTorch与NumPy可以无缝协作,内存共享:
# Tensor转NumPy
t = torch.ones(5)
n = t.numpy() # 共享内存
t.add_(1) # 修改会影响n
# NumPy转Tensor
n = np.ones(5)
t = torch.from_numpy(n) # 共享内存
np.add(n, 1, out=n) # 修改会影响t
这种零拷贝特性在数据预处理等场景非常有用。
最佳实践建议
-
设备选择:默认在CPU上创建Tensor,训练时应显式移动到GPU
if torch.cuda.is_available(): tensor = tensor.to('cuda')
-
避免原地操作:在需要自动微分时,尽量不使用原地操作
-
数据类型注意:深度学习通常使用float32,注意类型匹配
-
内存共享:NumPy与Tensor转换时注意内存共享特性,避免意外修改
Tensor是PyTorch的核心数据结构,掌握其各种操作和特性是深度学习开发的基础。建议通过实际练习加深理解,逐步熟悉各种API的使用场景和最佳实践。
tutorials PyTorch tutorials. 项目地址: https://gitcode.com/gh_mirrors/tuto/tutorials
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考