Python训练神经网络 释放显存
作为一名经验丰富的开发者,我将教你如何在Python中训练神经网络并释放显存。下面是整个流程的步骤表格:
步骤 | 描述 |
---|---|
1 | 导入相关的库 |
2 | 创建神经网络模型 |
3 | 定义损失函数和优化器 |
4 | 加载数据集 |
5 | 训练模型 |
6 | 释放显存 |
现在让我们一步一步来实现这些步骤。
步骤1:导入相关的库
首先,我们需要导入以下库:
import torch
import torchvision
torch
是PyTorch的核心库,提供了神经网络的构建和训练功能。torchvision
是PyTorch的图像处理库,其中包含了一些常用的数据集和图像处理函数。
步骤2:创建神经网络模型
接下来,我们需要创建一个神经网络模型。这里我们以一个简单的卷积神经网络为例:
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = torch.nn.Conv2d(1, 20, 5)
self.conv2 = torch.nn.Conv2d(20, 50, 5)
self.fc1 = torch.nn.Linear(4 * 4 * 50, 500)
self.fc2 = torch.nn.Linear(500, 10)
def forward(self, x):
x = torch.nn.functional.relu(self.conv1(x))
x = torch.nn.functional.max_pool2d(x, 2, 2)
x = torch.nn.functional.relu(self.conv2(x))
x = torch.nn.functional.max_pool2d(x, 2, 2)
x = x.view(-1, 4 * 4 * 50)
x = torch.nn.functional.relu(self.fc1(x))
x = self.fc2(x)
return x
model = Net()
这个模型包含了两个卷积层和两个全连接层。
步骤3:定义损失函数和优化器
然后,我们需要定义损失函数和优化器。这里我们使用交叉熵损失函数和随机梯度下降优化器:
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
torch.nn.CrossEntropyLoss()
是交叉熵损失函数,用于多分类问题。torch.optim.SGD()
是随机梯度下降优化器,用于更新模型的参数。
步骤4:加载数据集
接下来,我们需要加载数据集。这里我们以MNIST手写数字数据集为例:
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=torchvision.transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)
这里我们使用torchvision.datasets.MNIST
加载MNIST数据集,并使用torchvision.transforms.ToTensor()
将数据转换为张量形式。然后,我们使用torch.utils.data.DataLoader
创建数据加载器,用于批量加载数据。
步骤5:训练模型
现在我们可以开始训练模型了。这里我们训练5个epoch:
total_epochs = 5
for epoch in range(total_epochs):
for i, (images, labels) in enumerate(train_loader):
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i+1) % 100 == 0:
print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, total_epochs, i+1, len(train_loader), loss.item()))
在每个epoch中,我们遍历训练数据集,并计算模型的输出和损失。然后,我们使用优化器进行参数更新,并打印训练进度。