PyTorch教程:深入理解Tensor基础操作

PyTorch教程:深入理解Tensor基础操作

tutorials PyTorch tutorials. tutorials 项目地址: https://gitcode.com/gh_mirrors/tuto/tutorials

什么是Tensor

Tensor(张量)是PyTorch中最基础的数据结构,类似于NumPy中的ndarray,但具有更强大的功能。Tensor可以看作是多维数组,能够表示标量(0维)、向量(1维)、矩阵(2维)以及更高维度的数据结构。

与NumPy数组相比,Tensor有两大核心优势:

  1. 可以在GPU或其他硬件上运行,大幅提升计算效率
  2. 支持自动微分(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

这种零拷贝特性在数据预处理等场景非常有用。

最佳实践建议

  1. 设备选择:默认在CPU上创建Tensor,训练时应显式移动到GPU

    if torch.cuda.is_available():
        tensor = tensor.to('cuda')
    
  2. 避免原地操作:在需要自动微分时,尽量不使用原地操作

  3. 数据类型注意:深度学习通常使用float32,注意类型匹配

  4. 内存共享:NumPy与Tensor转换时注意内存共享特性,避免意外修改

Tensor是PyTorch的核心数据结构,掌握其各种操作和特性是深度学习开发的基础。建议通过实际练习加深理解,逐步熟悉各种API的使用场景和最佳实践。

tutorials PyTorch tutorials. tutorials 项目地址: https://gitcode.com/gh_mirrors/tuto/tutorials

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张俊领Tilda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值