PyTorch入门到进阶 实战计算机视觉与自然语言处理项目

PyTorch入门到进阶 实战计算机视觉与自然语言处理项目

PyTorch 是一个广泛使用的深度学习框架,它提供了灵活的张量操作、自动求导和模型定义机制。以下是 PyTorch 的基础语法详解,包括张量操作、自动求导和模型定义的内容。

PyTorch入门到进阶 实战计算机视觉与自然语言处理项目

1. 张量操作(Tensor Operations)

张量(Tensor)是 PyTorch 中最基本的数据结构,类似于 NumPy 数组,但可以在 GPU 上进行高效的计算。下面是 PyTorch 中张量的常见操作。

创建张量

ini 复制代码
pythonimport torch

# 创建一个未初始化的张量,形状为 (2, 3)
x = torch.empty(2, 3)

# 创建一个全为零的张量
y = torch.zeros(2, 3)

# 创建一个全为1的张量
z = torch.ones(2, 3)

# 从数据创建张量
data = [1, 2, 3, 4]
t = torch.tensor(data)

# 使用随机数生成张量
r = torch.rand(2, 3)

# 创建一个单位矩阵
identity_matrix = torch.eye(3)

# 获取张量的形状
shape = r.shape

张量运算

ini 复制代码
python# 张量加法
a = torch.tensor([1, 2])
b = torch.tensor([3, 4])
c = a + b

# 张量减法
d = a - b

# 张量乘法(逐元素相乘)
e = a * b

# 矩阵乘法
f = torch.matmul(a.view(1, -1), b.view(-1, 1))

# 张量的求和、均值等
sum_val = a.sum()        # 求和
mean_val = a.mean()      # 求均值

张量的索引和切片

ini 复制代码
python# 张量的索引
x = torch.rand(4, 4)
x[0, 0]  # 访问第 0 行,第 0 列元素
x[:, 1]  # 访问第 1 列的所有元素

张量转换

ini 复制代码
python# 转换形状
y = x.view(2, 8)  # 修改形状为 (2, 8)

# 转换为 NumPy 数组
numpy_array = x.numpy()

# 转换为 GPU 张量
if torch.cuda.is_available():
    x_cuda = x.cuda()

2. 自动求导(Autograd)

PyTorch 的核心之一是 autograd,它允许我们自动计算张量的梯度,方便反向传播和模型训练。

启用梯度计算

ini 复制代码
python# 创建一个张量并启用梯度计算
x = torch.randn(3, 3, requires_grad=True)

# 计算张量的某些操作
y = x * 2
z = y.mean()

# 反向传播计算梯度
z.backward()

# 查看梯度
print(x.grad)

防止梯度计算

ini 复制代码
python# 使用 `torch.no_grad()` 来停止梯度计算
with torch.no_grad():
    y = x * 2

创建计算图

ini 复制代码
pythona = torch.tensor([2.0], requires_grad=True)
b = a ** 2 + 3 * a
c = b.mean()
c.backward()

print(a.grad)  # 打印梯度

3. 模型定义(Model Definition)

PyTorch 提供了一个灵活的方式来定义神经网络模型,通常通过继承 torch.nn.Module 来构建自定义模型。

定义一个简单的神经网络

python 复制代码
pythonimport torch.nn as nn
import torch.optim as optim

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(2, 3)  # 第一层:2个输入,3个输出
        self.fc2 = nn.Linear(3, 1)  # 第二层:3个输入,1个输出

    def forward(self, x):
        x = torch.relu(self.fc1(x))  # ReLU 激活
        x = self.fc2(x)
        return x

# 创建模型实例
model = SimpleNN()

# 查看模型结构
print(model)

训练模型

在训练模型时,我们需要定义损失函数(Loss Function)和优化器(Optimizer),然后使用反向传播来更新模型的参数。

ini 复制代码
python# 创建损失函数和优化器
criterion = nn.MSELoss()  # 均方误差损失函数
optimizer = optim.SGD(model.parameters(), lr=0.01)  # 随机梯度下降优化器

# 输入数据
inputs = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
targets = torch.tensor([[1.0], [2.0]])

# 训练步骤
for epoch in range(100):
    # 前向传播
    outputs = model(inputs)
    loss = criterion(outputs, targets)
    
    # 反向传播
    optimizer.zero_grad()  # 清空之前的梯度
    loss.backward()        # 计算梯度
    optimizer.step()       # 更新模型参数
    
    if (epoch + 1) % 10 == 0:
        print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')

4. 其他常用功能

迁移到 GPU

ini 复制代码
python# 将模型和张量迁移到 GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
inputs = inputs.to(device)
targets = targets.to(device)

保存和加载模型

php 复制代码
				         
				       # 保存模型
torch.save(model.state_dict(), 'model.pth')

# 加载模型
model = SimpleNN()
model.load_state_dict(torch.load('model.pth'))
model.eval()  # 设为评估模式

总结

PyTorch 提供了非常丰富的功能,帮助我们高效地进行深度学习研究与开发。我们可以通过张量操作、自动求导和灵活的模型定义来构建、训练和优化神经网络。使用 torch.nn.Module 类构建模型非常简洁,而自动求导系统则简化了梯度计算,使得反向传播更加方便。

相关推荐
山居秋暝LS1 小时前
目标跟踪之DeepSort算法(4)
pytorch·python
Terrence Shen2 小时前
跟着AI复习一下pytorch原理和操作
人工智能·pytorch·python·深度学习·算法·机器学习
平凡而伟大(心之所向)3 小时前
一文讲清楚CUDA与PyTorch、GPU之间的关系
人工智能·pytorch·python
bksheng5 小时前
【Pytorch】torch.logical_or 和 or 的区别
人工智能·pytorch·python
时光旅人01号8 小时前
主流开源大模型能力对比矩阵
人工智能·pytorch·python·深度学习·开源
轻口味11 小时前
【每日学点HarmonyOS Next知识】状态栏字体、生命周期、自定义对话框屏幕中间、透明度、tab居中
pytorch·华为·harmonyos·harmonyosnext
无码不欢的我12 小时前
在windows10系统上安装docker,然后在容器中运行GPU版本的Pytorch,并使用vscode连接该容器
pytorch·vscode·docker
梦想画家12 小时前
PyTorch 系列教程:探索自然语言处理应用
人工智能·pytorch·自然语言处理
凤凰AI13 小时前
Pytorch的入门
人工智能·pytorch·python