在这个基础上增加训练模型代码、加载MNIST数据集和分别绘制训练和测试的损失函数曲线和分类正确率曲线代码:class LeNet_ReLUnnModule def __init__self superLeNet_ReLU self__init__ selfconv1 = nnConv2d1 6 5 selfpool1 = nnMaxPool2d2 2
import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms import torchvision.datasets as datasets import matplotlib.pyplot as plt
class LeNet_ReLU(nn.Module): def init(self): super(LeNet_ReLU, self).init() self.conv1 = nn.Conv2d(1, 6, 5) self.pool1 = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.pool2 = nn.MaxPool2d(2, 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(nn.ReLU()(self.conv1(x)))
x = self.pool2(nn.ReLU()(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = nn.ReLU()(self.fc1(x))
x = nn.ReLU()(self.fc2(x))
x = self.fc3(x)
return x
transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])
trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
net = LeNet_ReLU()
criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
train_loss_list = [] train_accuracy_list = [] test_loss_list = [] test_accuracy_list = []
for epoch in range(20): train_loss = 0.0 train_accuracy = 0.0 test_loss = 0.0 test_accuracy = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
train_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
train_accuracy += (predicted == labels).sum().item()
train_loss_list.append(train_loss / len(trainloader))
train_accuracy_list.append(train_accuracy / len(trainset))
with torch.no_grad():
for data in testloader:
inputs, labels = data
outputs = net(inputs)
loss = criterion(outputs, labels)
test_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
test_accuracy += (predicted == labels).sum().item()
test_loss_list.append(test_loss / len(testloader))
test_accuracy_list.append(test_accuracy / len(testset))
print('Epoch %d, train loss: %.3f, train accuracy: %.3f, test loss: %.3f, test accuracy: %.3f' %
(epoch + 1, train_loss / len(trainloader), train_accuracy / len(trainset),
test_loss / len(testloader), test_accuracy / len(testset)))
plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.plot(train_loss_list, label='train') plt.plot(test_loss_list, label='test') plt.title('Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend()
plt.subplot(1, 2, 2) plt.plot(train_accuracy_list, label='train') plt.plot(test_accuracy_list, label='test') plt.title('Accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend()
plt.show(
原文地址: https://www.cveoy.top/t/topic/fic1 著作权归作者所有。请勿转载和采集!