欢迎访问宙启技术站
智能推送

LeNet卷积神经网络的Python实现

发布时间:2023-12-11 06:24:41

LeNet是由Yann LeCun等人在1998年提出的卷积神经网络模型,被广泛应用于手写数字识别任务。它是深度学习历史上的里程碑,为后续的深度学习网络奠定了基础。

下面是LeNet的Python实现。首先,需要导入一些必要的库:

import torch
from torch import nn, optim
from torch.autograd import Variable

然后,我们定义LeNet模型的结构:

class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        
        self.conv1 = nn.Conv2d(1, 6, kernel_size=5, padding=2)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
        self.fc1 = nn.Linear(16*5*5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
    
    def forward(self, x):
        x = nn.functional.relu(self.conv1(x))
        x = nn.functional.max_pool2d(x, 2)
        
        x = nn.functional.relu(self.conv2(x))
        x = nn.functional.max_pool2d(x, 2)
        
        x = x.view(x.size(0), -1)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        
        return x

在此代码中,我们定义了LeNet类,它继承了nn.Module,并在__init__方法中定义了LeNet的层。LeNet的结构包括两个卷积层、两个全连接层和一个输出层。在forward方法中,我们定义了前向传播的流程,其中使用了卷积、池化和线性变换等操作。

接下来,我们可以使用LeNet模型进行手写数字的识别任务。首先,我们加载MNIST数据集,代码如下:

from torchvision import datasets, transforms

transform = transforms.Compose([transforms.ToTensor(),
                                transforms.Normalize((0.5,), (0.5,))])

trainset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)

valset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=False, transform=transform)
valloader = torch.utils.data.DataLoader(valset, batch_size=64, shuffle=True)

然后,我们可以定义训练函数和测试函数来训练和测试LeNet模型:

def train(model, trainloader, epochs, criterion, optimizer):
    for e in range(epochs):
        running_loss = 0.0
        for images, labels in trainloader:
            images = Variable(images)
            labels = Variable(labels)

            optimizer.zero_grad()

            output = model(images)
            loss = criterion(output, labels)

            loss.backward()
            optimizer.step()

            running_loss += loss.item()
        print("Epoch {}/{} Training loss: {:.4f}".format(e+1, epochs, running_loss/len(trainloader)))


def test(model, valloader):
    correct = 0
    total = 0
    with torch.no_grad():
        for images, labels in valloader:
            images = Variable(images)
            labels = Variable(labels)

            output = model(images)
            _, predicted = torch.max(output.data, 1)

            total += labels.size(0)
            correct += (predicted == labels).sum().item()

    print('Accuracy on test images: {:.2f}%'.format(100 * correct / total))

最后,我们可以调用以上函数来训练和测试LeNet模型:

model = LeNet()

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

train(model, trainloader, epochs=10, criterion=criterion, optimizer=optimizer)
test(model, valloader)

上述代码中,我们首先实例化了LeNet模型,然后定义了损失函数和优化器。接下来,调用train函数进行模型训练,并调用test函数进行模型测试。

通过以上LeNet的Python实现,我们可以使用它来训练和测试手写数字识别任务,并获得模型在测试集上的准确率。希望这个实例可以帮助你理解和应用LeNet卷积神经网络模型。