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(

在这个基础上增加训练模型代码、加载MNIST数据集和分别绘制训练和测试的损失函数曲线和分类正确率曲线代码:class LeNet_ReLUnnModule def __init__self superLeNet_ReLU self__init__ selfconv1 = nnConv2d1 6 5 selfpool1 = nnMaxPool2d2 2

原文地址: https://www.cveoy.top/t/topic/fic1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录