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日

相关文章

  • win10 pytorch1.4.0 安装

    win10 pytorch1.4.0 安装   首先感谢各位前人的经验,我是在参考了很多经验后才装好的呢~ 下面是简化步骤:   1.安装anaconda 或者 miniconda   2.利用conda 创建虚拟环境   3.如果要装GPU版本的需要查看自己适合的版本   4.利用conda 或者 pip 命令进行 install 需要的一系列东西0 0 …

    PyTorch 2023年4月8日
    00
  • Pytorch Tensor基本数学运算详解

    PyTorch Tensor是PyTorch中最基本的数据结构,支持各种数学运算。本文将详细讲解PyTorch Tensor的基本数学运算,包括加减乘除、矩阵乘法、广播、取整、取模等操作,并提供两个示例说明。 1. 加减乘除 PyTorch Tensor支持加减乘除等基本数学运算。以下是一个示例代码,展示了如何使用PyTorch Tensor进行加减乘除运算…

    PyTorch 2023年5月15日
    00
  • PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

    PyTorch之强大的hub模块和搭建神经网络进行气温预测 在PyTorch中,我们可以使用hub模块来加载预训练的模型,也可以使用它来分享和重用模型组件。在本文中,我们将介绍如何使用hub模块来加载预训练的模型,并使用它来搭建神经网络进行气温预测,并提供两个示例说明。 示例1:使用hub模块加载预训练的模型 以下是一个使用hub模块加载预训练的模型的示例代…

    PyTorch 2023年5月16日
    00
  • 【深度学习 论文篇 03-2】Pytorch搭建SSD模型踩坑集锦

    论文地址:https://arxiv.org/abs/1512.02325 源码地址:http://github.com/amdegroot/ssd.pytorch 环境1:torch1.9.0+CPU 环境2:torch1.8.1+cu102、torchvision0.9.1+cu102   1. StopIteration。Batch_size设置32,…

    2023年4月8日
    00
  • 基于pytorch的保存和加载模型参数的方法

    在PyTorch中,我们可以使用state_dict()方法将模型的参数保存到字典中,也可以使用load_state_dict()方法从字典中加载模型的参数。本文将详细讲解基于PyTorch的保存和加载模型参数的方法,并提供两个示例说明。 1. 保存模型参数 在PyTorch中,我们可以使用state_dict()方法将模型的参数保存到字典中。以下是保存模型…

    PyTorch 2023年5月15日
    00
  • LSTM 的使用(Pytorch)

    LSTM 参数 input_size:输入维数 hidden_size:输出维数 num_layers:LSTM层数,默认是1 bias:True 或者 False,决定是否使用bias, False则b_h=0. 默认为True batch_first:True 或者 False,因为nn.lstm()接受的数据输入是(序列长度,batch,输入维数),这…

    2023年4月8日
    00
  • Pytorch 扩展Tensor维度、压缩Tensor维度

        相信刚接触Pytorch的宝宝们,会遇到这样一个问题,输入的数据维度和实验需要维度不一致,输入的可能是2维数据或3维数据,实验需要用到3维或4维数据,那么我们需要扩展这个维度。其实特别简单,只要对数据加一个扩展维度方法就可以了。 1.1 torch.unsqueeze(self: Tensor, dim: _int)   torch.unsqueez…

    2023年4月8日
    00
  • pytorch多GPU并行运算的实现

    PyTorch多GPU并行运算的实现 在深度学习中,使用多个GPU可以加速模型的训练过程。PyTorch提供了多种方式实现多GPU并行运算,本文将详细介绍其中的两种方法,并提供示例说明。 1. 使用nn.DataParallel实现多GPU并行运算 nn.DataParallel是PyTorch提供的一种简单易用的多GPU并行运算方式。使用nn.DataPa…

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