跳到主要内容

PyTorch 张量操作

PyTorch 是一个广泛使用的深度学习框架,而张量(Tensor)是 PyTorch 中最基本的数据结构。张量类似于 NumPy 中的多维数组,但它可以在 GPU 上运行,从而加速计算。本文将带你了解 PyTorch 中的张量操作,包括创建、索引、切片、数学运算等。

什么是张量?

张量是一个多维数组,可以表示标量、向量、矩阵以及更高维度的数据。在 PyTorch 中,张量是 torch.Tensor 类的实例。张量的维度(也称为轴)决定了它的形状(shape),例如,一个 2x3 的矩阵是一个二维张量。

备注

张量与 NumPy 数组非常相似,但 PyTorch 张量支持 GPU 加速计算。

创建张量

在 PyTorch 中,你可以通过多种方式创建张量。以下是一些常见的创建张量的方法:

python
import torch

# 创建一个未初始化的 2x3 矩阵
x = torch.empty(2, 3)
print(x)

# 创建一个随机初始化的 2x3 矩阵
x = torch.rand(2, 3)
print(x)

# 创建一个全零的 2x3 矩阵
x = torch.zeros(2, 3)
print(x)

# 创建一个全一的 2x3 矩阵
x = torch.ones(2, 3)
print(x)

# 从 Python 列表创建张量
x = torch.tensor([1.0, 2.0, 3.0])
print(x)

输出:

tensor([[0., 0., 0.],
[0., 0., 0.]])
tensor([[0.1234, 0.5678, 0.9101],
[0.1122, 0.3344, 0.5566]])
tensor([[0., 0., 0.],
[0., 0., 0.]])
tensor([[1., 1., 1.],
[1., 1., 1.]])
tensor([1., 2., 3.])

张量的基本操作

索引和切片

张量的索引和切片操作与 Python 列表和 NumPy 数组非常相似。你可以使用索引来访问张量中的元素,或者使用切片来获取子张量。

python
x = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 获取第一行
print(x[0])

# 获取第二列
print(x[:, 1])

# 获取子张量
print(x[0:2, 1:3])

输出:

tensor([1, 2, 3])
tensor([2, 5])
tensor([[2, 3],
[5, 6]])

张量的数学运算

PyTorch 提供了丰富的数学运算函数,可以对张量进行加减乘除、矩阵乘法、转置等操作。

python
x = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([[5, 6], [7, 8]])

# 加法
print(x + y)

# 矩阵乘法
print(torch.matmul(x, y))

# 转置
print(x.t())

输出:

tensor([[ 6,  8],
[10, 12]])
tensor([[19, 22],
[43, 50]])
tensor([[1, 3],
[2, 4]])

张量的形状操作

你可以使用 viewreshape 方法来改变张量的形状。这两个方法的功能类似,但 view 要求张量在内存中是连续的。

python
x = torch.arange(6)
print(x)

# 改变形状为 2x3
print(x.view(2, 3))

# 改变形状为 3x2
print(x.reshape(3, 2))

输出:

tensor([0, 1, 2, 3, 4, 5])
tensor([[0, 1, 2],
[3, 4, 5]])
tensor([[0, 1],
[2, 3],
[4, 5]])

实际应用案例

线性回归

线性回归是机器学习中最简单的模型之一。我们可以使用 PyTorch 张量来实现线性回归。

python
import torch
import torch.nn as nn
import torch.optim as optim

# 生成一些随机数据
x = torch.randn(100, 1)
y = 3 * x + 2 + 0.1 * torch.randn(100, 1)

# 定义模型
model = nn.Linear(1, 1)

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(100):
# 前向传播
y_pred = model(x)

# 计算损失
loss = criterion(y_pred, y)

# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()

# 输出训练后的参数
print(f"权重: {model.weight.item()}, 偏置: {model.bias.item()}")

输出:

权重: 2.999, 偏置: 1.998

在这个例子中,我们使用 PyTorch 张量来表示输入数据和模型参数,并通过张量操作实现了线性回归的训练过程。

总结

本文介绍了 PyTorch 中的张量操作,包括张量的创建、索引、切片、数学运算以及形状操作。我们还通过一个简单的线性回归案例展示了张量在实际应用中的使用。

提示

如果你想进一步学习 PyTorch 张量操作,可以参考 PyTorch 官方文档中的 Tensor 教程

附加资源

练习

  1. 创建一个 3x3 的张量,并尝试对其进行索引和切片操作。
  2. 使用 PyTorch 张量实现矩阵乘法,并验证结果是否正确。
  3. 修改线性回归案例中的学习率,观察训练结果的变化。