以下是CNN的Pytorch实现(LeNet)的完整攻略,包括两个示例:
CNN的Pytorch实现(LeNet)
步骤1:导入必要的库
首先,需要导入必要的库,包括torch、torchvision和numpy。可以使用以下代码导入这些库:
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
import numpy as np
步骤2:定义LeNet模型
接下来,需要定义LeNet模型。可以使用以下代码定义LeNet模型:
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
self.conv1 = nn.Conv2d(1, 6, kernel_size=5)
self.pool1 = nn.MaxPool2d(kernel_size=2)
self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
self.pool2 = nn.MaxPool2d(kernel_size=2)
self.fc1 = nn.Linear(16 * 4 * 4, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool1(torch.relu(self.conv1(x)))
x = self.pool2(torch.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
在这个示例中,我们定义了一个名为LeNet的模型。我们使用nn.Conv2d创建两个卷积层和nn.MaxPool2d创建两个池化层。我们使用nn.Linear创建三个全连接层。在forward()方法中,我们首先使用卷积层和池化层提取特征。然后,我们使用view()方法将特征展平。接下来,我们使用全连接层进行分类。
步骤3:加载数据集
需要加载MNIST数据集。可以使用以下代码加载MNIST数据集:
train_dataset = datasets.MNIST(root='data/', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='data/', train=False, transform=transforms.ToTensor(), download=True)
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)
在这个示例中,我们使用datasets.MNIST创建训练和测试数据集。我们使用transforms.ToTensor()将图像转换为张量。我们使用torch.utils.data.DataLoader创建训练和测试数据加载器。
步骤4:定义损失函数和优化器
需要定义损失函数和优化器。可以使用以下代码定义损失函数和优化器:
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
在这个示例中,我们使用nn.CrossEntropyLoss()创建交叉熵损失函数。我们使用optim.SGD()创建随机梯度下降优化器。
步骤5:训练模型
需要训练模型。可以使用以下代码训练模型:
num_epochs = 10
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
if (i + 1) % 100 == 0:
print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, i + 1, len(train_loader), loss.item()))
在这个示例中,我们使用for循环迭代训练数据集。我们首先使用optimizer.zero_grad()清除梯度。然后,我们使用model()方法计算模型输出。接下来,我们使用损失函数计算损失,并调用backward()方法计算梯度。最后,我们使用optimizer.step()更新模型参数。
示例1:使用模型进行预测
以下是使用模型进行预测的示例:
with torch.no_grad():
correct = 0
total = 0
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: {} %'.format(100 * correct / total))
在这个示例中,我们使用with torch.no_grad()上下文管理器禁用梯度计算。我们使用model()方法计算模型输出。然后,我们使用torch.max()方法获取每个图像的预测标签。最后,我们计算模型在测试数据集上的准确率。
示例2:保存和加载模型
以下是保存和加载模型的示例:
# 保存模型
torch.save(model.state_dict(), 'model.ckpt')
# 加载模型
model.load_state_dict(torch.load('model.ckpt'))
在这个示例中,我们使用torch.save()方法保存模型参数。我们使用torch.load()方法加载模型参数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CNN的Pytorch实现(LeNet) - Python技术站