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

Python编写的Nets.LeNet模型用于图像分类任务

发布时间:2023-12-11 08:37:57

LeNet是一个经典的卷积神经网络模型,最初由Yann LeCun等人在1998年提出。它是一个用于手写数字识别的模型,具有两个卷积层和三个全连接层。

下面是一个使用Python编写的LeNet模型的示例:

import torch
import torch.nn as nn
import torch.nn.functional as F

class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        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 = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2)
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2)
        x = x.view(x.size(0), -1)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 创建LeNet模型实例
net = LeNet()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

# 加载训练数据集
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor())
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True, num_workers=2)

# 训练模型
for epoch in range(10):
    running_loss = 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()
        
        running_loss += loss.item()
        if i % 200 == 199:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 200))
            running_loss = 0.0

print('Finished Training')

# 保存模型
torch.save(net.state_dict(), 'lenet_model.pth')

在上面的例子中,首先定义了一个LeNet类,继承自torch.nn.Module。在构造函数中定义了LeNet模型的各个层,并在forward方法中描述了模型的前向传播逻辑。

然后,创建了一个LeNet实例net。定义了损失函数为交叉熵损失函数,优化器为随机梯度下降(SGD)。

接着,使用torchvision.datasets.MNIST加载了用于训练的MNIST数据集,并使用torch.utils.data.DataLoader创建了一个数据加载器。

然后,使用一个循环迭代数据加载器中的数据,并进行模型训练。在每个训练迭代中,先将梯度归零,然后计算模型输出并计算损失,然后计算梯度,最后使用优化器更新模型参数。

最后,模型训练完成后可以保存模型的参数,以便后续推断使用。

以上就是一个使用Python编写的LeNet模型的示例。你可以根据自己的需求进行修改和调整。