邱锡鹏版
《动手学深度学习》
Deep Learning Book
pyTorch 英文官网
pyTorch 教程中文
pyTorch w3cschool
深度学习数据集汇总
深度学习模拟网站,可观察参数变化对训练的影响
使用PyTorch进行深度学习的一般步骤可以概括为以下几个主要阶段:
1. 准备数据集
- 加载数据:使用PyTorch的
torch.utils.data.Dataset
和torch.utils.data.DataLoader
来加载和准备数据集,可能包括数据的预处理、增强等操作。
2. 构建模型
- 定义模型结构:继承
torch.nn.Module
类来定义自己的模型,实现__init__
方法来定义模型的层,实现forward
方法来指定数据的前向传递路径。
3. 定义损失函数和优化器
- 选择损失函数:根据任务(如分类、回归等)选择合适的损失函数,如
torch.nn.CrossEntropyLoss
用于分类任务。 - 选择优化器:选择一个优化算法来更新模型的参数,如
torch.optim.Adam
、torch.optim.SGD
等。
4. 训练模型
- 训练循环:编写训练循环,其中包括前向传播、损失计算、反向传播和参数更新。
- 模型评估:定期在验证集上评估模型,监控指标如准确率、损失等,以防止过拟合。
5. 测试模型
- 评估模式:将模型设置为评估模式(
model.eval()
),以禁用特定于训练的操作,如Dropout。 - 性能评估:在测试集上评估模型性能,通常使用指标如准确率、精确率、召回率等。
6. 保存和加载模型
- 保存模型:使用
torch.save
保存模型的参数或整个模型。 - 加载模型:使用
torch.load
加载模型参数或整个模型,用于推理或继续训练。
示例代码
以下是一个简化的示例,展示了这些步骤的基本结构:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 1. 准备数据集
transform = transforms.Compose([transforms.ToTensor()])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
# 2. 构建模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(28*28, 500)
self.fc2 = nn.Linear(500, 10)
def forward(self, x):
x = x.view(-1, 28*28)
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
model = Net()
# 3. 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())
# 4. 训练模型
for epoch in range(10): # loop over the dataset multiple times
for data, target in train_loader:
optimizer.zero_grad() # zero the parameter gradients
output = model(data) # forward pass
loss = criterion(output, target) # compute loss
loss.backward() # backward pass
optimizer.step() # update parameters
print('Finished Training')
# 5. 保存模型
torch.save(model.state_dict(), 'model.pth')
这个例子展示了使用PyTorch进行深度学习项目的基本框架,包括数据准备、模型定义、训练和保存模型等步骤。实际项目中可能需要添加额外的步骤,如更复杂的数据预处理、更细致的训练过程控制、模型评估和调参等。
在使用像PyTorch这样的深度学习框架时,反向传播(计算梯度并更新模型参数的过程)通常是写在训练循环中,而不是直接写在模型类中。这是因为反向传播和参数更新是训练过程的一部分,而模型类主要负责定义前向传播的逻辑。