Python LeNet网络详解及pytorch实现

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环境配置及安装教程(Windows10)

    关于 PyTorch 环境配置及安装教程(Windows10) PyTorch 是一个基于 Python 的科学计算库,它主要用于深度学习研究。在 Windows10 系统下,我们可以通过 Anaconda 或 pip 来安装 PyTorch 环境。本文将详细讲解 PyTorch 环境配置及安装教程,并提供两个示例说明。 1. 使用 Anaconda 安装 …

    PyTorch 2023年5月16日
    00
  • pytorch自定义不可导激活函数的操作

    在PyTorch中,我们可以使用自定义函数来实现不可导的激活函数。以下是实现自定义不可导激活函数的完整攻略: 步骤1:定义自定义函数 首先,我们需要定义自定义函数。在这个例子中,我们将使用ReLU函数的变体,称为LeakyReLU函数。LeakyReLU函数在输入小于0时不是完全不可导的,而是有一个小的斜率。以下是LeakyReLU函数的定义: import…

    PyTorch 2023年5月15日
    00
  • Python Pytorch学习之图像检索实践

    Python PyTorch学习之图像检索实践 本文将介绍如何使用Python和PyTorch实现图像检索。我们将使用一个预训练的卷积神经网络模型来提取图像特征,并使用余弦相似度来计算图像之间的相似度。本文将分为以下几个部分: 数据集准备 模型准备 图像特征提取 图像检索 示例说明 数据集准备 我们将使用CIFAR-10数据集作为我们的图像数据集。CIFAR…

    PyTorch 2023年5月16日
    00
  • PyTorch 常用代码段整理

    基础配置 检查 PyTorch 版本 torch.__version__               # PyTorch versiontorch.version.cuda              # Corresponding CUDA versiontorch.backends.cudnn.version()  # Corresponding cuDN…

    PyTorch 2023年4月6日
    00
  • pytorch安装失败

    使用pip install torch安装失败, 在官网https://pytorch.org/ ,选择合适的版本   之后再安装,      现在清华的镜像好像没了,选择正确的版本下载还是很快的。

    2023年4月8日
    00
  • pytorch 中tensor的加减和mul、matmul、bmm

    如下是tensor乘法与加减法,对应位相乘或相加减,可以一对多 import torch def add_and_mul(): x = torch.Tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) y = torch.Tensor([1, 2, 3]) y = y – x print(y)…

    PyTorch 2023年4月7日
    00
  • 深度之眼PyTorch训练营第二期 —5、Dataloader与Dataset 以及 transforms与normalize

    一、人民币二分类 描述:输入人民币,通过模型判定类别并输出。   数据:四个子模块     数据收集 -> img,label 原始数据和标签     数据划分 -> train训练集 valid验证集 test测试集     数据读取 -> DataLoader ->(1)Sampler(生成index) (2)Dataset(读取…

    PyTorch 2023年4月8日
    00
  • Pytorch中expand()的使用(扩展某个维度)

    PyTorch中expand()的使用(扩展某个维度) 在PyTorch中,expand()函数可以用来扩展张量的某个维度,从而实现张量的形状变换。expand()函数会自动复制张量的数据,以填充新的维度。下面是expand()函数的详细使用方法: torch.Tensor.expand(*sizes) -> Tensor 其中,*sizes是一个可变…

    PyTorch 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部