Python LeNet网络详解及pytorch实现

yizhihongxing

Python LeNet网络详解及PyTorch实现

本文将介绍LeNet网络的结构和实现,并使用PyTorch实现一个LeNet网络进行手写数字识别。

1. LeNet网络结构

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

LeNet网络的结构如下所示:

输入层 -> 卷积层1 -> 池化层1 -> 卷积层2 -> 池化层2 -> 全连接层1 -> 全连接层2 -> 输出层

其中,卷积层1和卷积层2都使用5x5的卷积核,池化层1和池化层2都使用2x2的最大池化。全连接层1包含120个神经元,全连接层2包含84个神经元。输出层包含10个神经元,每个神经元对应一个数字。

2. LeNet网络实现

我们将使用PyTorch实现一个LeNet网络进行手写数字识别。我们将使用MNIST数据集进行训练和测试。

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 加载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)

# 定义LeNet网络
class LeNet(nn.Module):
    def __init__(self):
        super().__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

# 定义模型、损失函数和优化器
model = LeNet()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(10):
    train_loss = 0.0
    train_correct = 0
    train_total = 0
    for inputs, labels in train_dataset:
        optimizer.zero_grad()
        outputs = model(inputs.unsqueeze(0))
        loss = criterion(outputs, labels.unsqueeze(0))
        loss.backward()
        optimizer.step()
        train_loss += loss.item()
        predicted = torch.argmax(outputs)
        train_total += 1
        train_correct += (predicted == labels).sum().item()
    print(f'Epoch {epoch+1}, Train Loss: {train_loss/train_total}, Train Accuracy: {train_correct/train_total}')

# 测试模型
test_correct = 0
test_total = 0
with torch.no_grad():
    for inputs, labels in test_dataset:
        outputs = model(inputs.unsqueeze(0))
        predicted = torch.argmax(outputs)
        test_total += 1
        test_correct += (predicted == labels).sum().item()
print(f'Test Accuracy: {test_correct/test_total}')

示例2:使用GPU加速的LeNet网络

如果你的机器上有GPU,你可以使用PyTorch的GPU加速功能来加速模型训练和预测。以下是使用GPU加速的LeNet网络的示例代码。

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 加载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)

# 定义LeNet网络
class LeNet(nn.Module):
    def __init__(self):
        super().__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

# 定义模型、损失函数和优化器
model = LeNet().cuda()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(10):
    train_loss = 0.0
    train_correct = 0
    train_total = 0
    for inputs, labels in train_dataset:
        optimizer.zero_grad()
        inputs = inputs.cuda()
        labels = labels.cuda()
        outputs = model(inputs.unsqueeze(0))
        loss = criterion(outputs, labels.unsqueeze(0))
        loss.backward()
        optimizer.step()
        train_loss += loss.item()
        predicted = torch.argmax(outputs)
        train_total += 1
        train_correct += (predicted == labels).sum().item()
    print(f'Epoch {epoch+1}, Train Loss: {train_loss/train_total}, Train Accuracy: {train_correct/train_total}')

# 测试模型
test_correct = 0
test_total = 0
with torch.no_grad():
    for inputs, labels in test_dataset:
        inputs = inputs.cuda()
        labels = labels.cuda()
        outputs = model(inputs.unsqueeze(0))
        predicted = torch.argmax(outputs)
        test_total += 1
        test_correct += (predicted == labels).sum().item()
print(f'Test Accuracy: {test_correct/test_total}')

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python LeNet网络详解及pytorch实现 - Python技术站

(2)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Pytorch实现GoogLeNet的方法

    PyTorch实现GoogLeNet的方法 GoogLeNet是一种经典的卷积神经网络模型,它在2014年的ImageNet比赛中获得了第一名。本文将介绍如何使用PyTorch实现GoogLeNet模型,并提供两个示例说明。 1. 导入必要的库 在开始实现GoogLeNet之前,我们需要导入必要的库。以下是一个示例代码: import torch impor…

    PyTorch 2023年5月15日
    00
  • 超简单!pytorch入门教程(二):Autograd

    一、autograd自动微分 autograd是专门为了BP算法设计的,所以这autograd只对输出值为标量的有用,因为损失函数的输出是一个标量。如果y是一个向量,那么backward()函数就会失效。不知道BP算法是什么的同学,估计也不知道什么是深度学习,建议先看Zen君提供的教材。 二、autograd的内部机理 variable是tensor的外包装…

    PyTorch 2023年4月6日
    00
  • 关于tf.matmul() 和tf.multiply() 的区别说明

    tf.matmul()和tf.multiply()是TensorFlow中的两个重要函数,它们分别用于矩阵乘法和元素级别的乘法。本文将详细讲解tf.matmul()和tf.multiply()的区别,并提供两个示例说明。 tf.matmul()和tf.multiply()的区别 tf.matmul()和tf.multiply()的区别在于它们执行的操作不同。…

    PyTorch 2023年5月15日
    00
  • Pytorch怎样保存训练好的模型

    在PyTorch中,我们可以使用torch.save()函数来保存训练好的模型。该函数接受两个参数:要保存的模型和保存模型的文件路径。我们还可以使用torch.load()函数来加载已保存的模型。 以下是详细的攻略: 保存模型 我们可以使用torch.save()函数来保存训练好的模型。该函数接受两个参数:要保存的模型和保存模型的文件路径。我们可以使用.pt…

    PyTorch 2023年5月15日
    00
  • 安装pytorch-gpu的经验与教训

    首先说明 本文并不是安装教程,网上有很多,这里只是自己遇到的一些问题 我是以前安装的tensorflow-gpu的,但是发现现在的学术论文大部分都是用pytorch复现的,因此才去安装的pytorch-gpu 查看自己安装的CUDA nvcc -V 这里我提供一个安装tensorflow时所用的CUDA对应表      安装完CUDA时要改一下环境变量   …

    2023年4月6日
    00
  • 安装pytorch后import torch显示no module named ‘torch’

    问题描述:在pycharm终端里通过pip指令安装pytorch,显示成功安装但是python程序和终端都无法使用pytorch,显示no module named ‘torch’。 起因:电脑里有多处安装了python。 在pycharm里,每个project都可以指定python解释器。我是在pycharm终端里通过pip指令安装的pytorch,但是当…

    2023年4月8日
    00
  • 神经网络学习–PyTorch学习06 迁移VGG16

        因为我们从头训练一个网络模型花费的时间太长,所以使用迁移学习,也就是将已经训练好的模型进行微调和二次训练,来更快的得到更好的结果。 import torch import torchvision from torchvision import datasets, models, transforms import os from torch.auto…

    PyTorch 2023年4月8日
    00
  • 安装anaconda及pytorch

    安装anaconda,下载64位版本安装https://www.anaconda.com/download/    官网比较慢,可到清华开源镜像站上下载 环境变量: D:\Anaconda3;D:\Anaconda3\Library\mingw-w64\bin;D:\Anaconda3\Library\usr\bin;D:\Anaconda3\Library…

    2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部