从零实现LeNet5卷积神经网络:MNIST手写数字识别实战

使用LeNet-5识别手写数字MNIST 阅读详情

在深度学习领域,卷积神经网络(CNN)已成为图像处理的核心技术。本文将带您实现经典的LeNet5网络架构,并在MNIST手写数字数据集上进行训练与评估。我们将深入探讨数据预处理、网络设计、模型训练和性能分析等关键环节,帮助您全面理解卷积神经网络的工作原理。

1. MNIST数据集简介

MNIST是机器学习领域最著名的基准数据集之一,包含60,000张训练图像和10,000张测试图像,每张图像是28×28像素的灰度手写数字(0-9)。

让我们首先加载数据集并进行探索:

import torch

import torchvision

import torchvision.transforms as transforms

import matplotlib.pyplot as plt

import numpy as np

# 加载MNIST数据集

def load_data():

    # 数据预处理

    transform = transforms.Compose([

        transforms.ToTensor(),

        transforms.Normalize((0.1307,), (0.3081,))  # MNIST均值和标准差

    ])

    

    # 加载训练集

    train_dataset = torchvision.datasets.MNIST(

        root='./data', 

        train=True, 

        download=True, 

        transform=transform

    )

    train_loader = torch.utils.data.DataLoader(

        train_dataset, 

        batch_size=128, 

        shuffle=True

    )

    

    # 加载测试集

    test_dataset = torchvision.datasets.MNIST(

        root='./data', 

        train=False, 

        download=True, 

        transform=transform

    )

    test_loader = torch.utils.data.DataLoader(

        test_dataset, 

        batch_size=1000, 

        shuffle=False

    )

    

    return train_loader, test_loader

2. 数据预处理的重要性

深度学习模型对输入数据的分布非常敏感。通过适当的预处理,我们可以加速模型收敛并提高性能。对于MNIST数据集,我们进行两步预处理:

  1. 将像素值从[0, 255]归一化到[0, 1]范围
  1. 使用MNIST数据集的均值(0.1307)和标准差(0.3081)进行标准化

让我们可视化预处理的效果:

def show_preprocessing_comparison():

    # 准备两种不同的transform

    transform_original = transforms.ToTensor()  # 仅转换为tensor,归一化到[0,1]

    

    transform_processed = transforms.Compose([

        transforms.ToTensor(),

        transforms.Normalize((0.1307,), (0.3081,))  # 标准化处理

    ])

    

    # 加载一张图像

    mnist_data = torchvision.datasets.MNIST(

        root='./data', train=True, download=True, transform=transform_original

    )

    dataloader = torch.utils.data.DataLoader(mnist_data, batch_size=1, shuffle=True)

    images, labels = next(iter(dataloader))

    

    # 显示对比

    plt.figure(figsize=(10, 5))

    

    # 原始图像

    img = images[0].squeeze().numpy()

    plt.subplot(1, 2, 1)

    plt.imshow(img, cmap='gray')

    plt.title('原始图像')

    plt.axis('off')

    

    # 预处理后的图像

    processed_img = transforms.Normalize((0.1307,), (0.3081,))(images[0])

    processed_img = processed_img.squeeze().numpy()

    plt.subplot(1, 2, 2)

    plt.imshow(processed_img, cmap='gray')

    plt.title('预处理后图像')

    plt.axis('off')

    

    plt.suptitle(f'MNIST数字: {labels[0].item()}')

    plt.savefig('mnist_preprocessing_comparison.png')

    plt.show()

    

    print(f"原始图像像素值范围: [{img.min():.4f}, {img.max():.4f}]")

    print(f"预处理后图像像素值范围: [{processed_img.min():.4f}, {processed_img.max():.4f}]")

预处理后的图像对比度更高,背景更加纯净,突出了数字特征,有助于模型更好地学习和识别。

3. LeNet5网络架构设计

LeNet5是由Yann LeCun在1998年提出的经典CNN模型,虽然简单,但包含了现代卷积神经网络的核心组件。让我们用PyTorch实现它:

import torch.nn as nn

class LeNet5(nn.Module):

    def __init__(self):

        super(LeNet5, self).__init__()

        # 第一个卷积块

        self.conv1 = nn.Sequential(

            nn.Conv2d(1, 6, kernel_size=5, stride=1, padding=0),  # 输入1通道,输出6通道

            nn.ReLU(),

            nn.MaxPool2d(kernel_size=2, stride=2)  # 最大池化层

        )

        # 第二个卷积块

        self.conv2 = nn.Sequential(

            nn.Conv2d(6, 16, kernel_size=5, stride=1, padding=0),  # 输入6通道,输出16通道

            nn.ReLU(),

            nn.MaxPool2d(kernel_size=2, stride=2)

        )

        # 全连接层

        self.fc = nn.Sequential(

            nn.Linear(16 * 4 * 4, 120),  # 第一个全连接层

            nn.ReLU(),

            nn.Linear(120, 84),  # 第二个全连接层

            nn.ReLU(),

            nn.Linear(84, 10)  # 输出层,10个类别

        )

    def forward(self, x):

        x = self.conv1(x)  # 第一个卷积块

        x = self.conv2(x)  # 第二个卷积块

        x = x.view(x.size(0), -1)  # 扁平化

        x = self.fc(x)  # 全连接层

        return x

LeNet5的设计精妙之处在于:

  1. 层次化特征提取:从低级特征(边缘、纹理)到高级特征(形状、部件)
  1. 局部感受野:每个神经元只关注输入的局部区域,减少参数量
  1. 权值共享:卷积核在整个图像上共享,进一步减少参数
  1. 下采样:通过池化操作减少特征图尺寸,降低计算复杂度
  1. 非线性激活:ReLU函数引入非线性变换,增强网络表达能力

4. 模型训练与评估

现在让我们训练模型并评估性能:

import time

def train_model(train_loader, test_loader, device='cpu'):

    # 创建模型

    model = LeNet5().to(device)

    criterion = nn.CrossEntropyLoss()

    optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)

    

    # 训练参数

    epochs = 10

    train_losses = []

    train_accs = []

    val_losses = []

    val_accs = []

    

    # 记录开始训练时间

    start = time.time()

    

    # 训练循环

    for epoch in range(epochs):

        model.train()  # 设置为训练模式

        running_loss = 0.0

        correct = 0

        total = 0

        

        for inputs, labels in train_loader:

            inputs, labels = inputs.to(device), labels.to(device)

            

            # 梯度清零

            optimizer.zero_grad()

            

            # 前向传播

            outputs = model(inputs)

            loss = criterion(outputs, labels)

            

            # 反向传播和优化

            loss.backward()

            optimizer.step()

            

            # 统计

            running_loss += loss.item()

            _, predicted = outputs.max(1)

            total += labels.size(0)

            correct += predicted.eq(labels).sum().item()

        

        # 计算训练集准确率和损失

        train_loss = running_loss / len(train_loader)

        train_acc = 100. * correct / total

        train_losses.append(train_loss)

        train_accs.append(train_acc)

        

        # 验证集评估

        model.eval()  # 设置为评估模式

        val_loss = 0

        val_correct = 0

        val_total = 0

        with torch.no_grad():  # 不计算梯度

            for inputs, labels in test_loader:

                inputs, labels = inputs.to(device), labels.to(device)

                outputs = model(inputs)

                loss = criterion(outputs, labels)

                

                val_loss += loss.item()

                _, predicted = outputs.max(1)

                val_total += labels.size(0)

                val_correct += predicted.eq(labels).sum().item()

        

        # 计算验证集准确率和损失

import torch.optim as optim

        val_loss = val_loss / len(test_loader)

        val_acc = 100. * val_correct / val_total

        val_losses.append(val_loss)

        val_accs.append(val_acc)

        

        print(f'Epoch {epoch+1}/{epochs}: Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.2f}%, '

              f'Val Loss: {val_loss:.4f}, Val Acc: {val_acc:.2f}%')

    

    # 记录结束训练时间

    end = time.time()

    print(f"总训练时间: {end - start:.2f} 秒")

    

    return model, train_losses, train_accs, val_losses, val_accs

训练过程中的关键环节包括:

  1. 优化器选择:使用带动量的SGD(随机梯度下降)
  1. 损失函数:多分类问题使用交叉熵损失
  1. 批处理:每批128个样本,平衡计算效率和内存使用
  1. 模式切换:训练时启用model.train(),评估时启用model.eval()
  1. 梯度清零:每批次前调用optimizer.zero_grad()避免梯度累积

5. 结果可视化与分析

训练完成后,让我们可视化训练过程并分析结果:

def plot_results(train_losses, train_accs, val_losses, val_accs):

    plt.figure(figsize=(12, 5))

    

    # 绘制损失曲线

    plt.subplot(1, 2, 1)

    plt.plot(train_losses, label='训练损失', color='blue')

    plt.plot(val_losses, label='验证损失', color='red')

    plt.xlabel('训练轮次')

    plt.ylabel('损失值')

    plt.legend()

    plt.title('训练和验证损失曲线')

    plt.grid(True)

    

    # 绘制准确率曲线

    plt.subplot(1, 2, 2)

    plt.plot(train_accs, label='训练准确率', color='blue')

    plt.plot(val_accs, label='验证准确率', color='red')

    plt.xlabel('训练轮次')

    plt.ylabel('准确率 (%)')

    plt.legend()

    plt.title('训练和验证准确率曲线')

    plt.grid(True)

    

    plt.tight_layout()

    plt.savefig('lenet5_results.png')

    plt.show()

经过10轮训练,我们的LeNet5模型在MNIST测试集上达到了约99%的准确率。从损失和准确率曲线可以观察到:

  1. 训练损失持续下降,验证损失在前几轮快速下降后趋于平稳
  1. 训练准确率和验证准确率都呈上升趋势,并在后期趋于稳定
  1. 训练集和验证集性能接近,说明模型没有明显过拟合

6. 模型优化与实际应用思考

尽管LeNet5在MNIST上已经取得了出色的性能,但在实际应用中,我们还可以进一步优化:

  1. 数据增强:通过旋转、缩放、平移等变换增加训练样本多样性
  1. 正则化:添加Dropout或BatchNorm层减少过拟合
  1. 学习率调度:实现学习率衰减,帮助模型收敛到更优解
  1. 更深的网络:尝试ResNet等更现代的架构进一步提高性能
  1. 迁移学习:利用在大数据集上预训练的模型进行微调

7. 完整代码整合

将上述所有组件整合,我们可以得到一个完整的LeNet5实现与训练流程:

import torch

import torch.nn as nn

import torch.optim as optim

import torchvision

import torchvision.transforms as transforms

import matplotlib.pyplot as plt

import numpy as np

import time

# 模型定义

class LeNet5(nn.Module):

    def __init__(self):

        super(LeNet5, self).__init__()

        self.conv1 = nn.Sequential(

            nn.Conv2d(1, 6, 5, 1, 0),

            nn.ReLU(),

            nn.MaxPool2d(2, 2)

        )

        self.conv2 = nn.Sequential(

            nn.Conv2d(6, 16, 5, 1, 0),

            nn.ReLU(),

            nn.MaxPool2d(2, 2)

        )

        self.fc = nn.Sequential(

            nn.Linear(16 * 4 * 4, 120),

            nn.ReLU(),

            nn.Linear(120, 84),

            nn.ReLU(),

            nn.Linear(84, 10)

        )

    def forward(self, x):

        x = self.conv1(x)

        x = self.conv2(x)

        x = x.view(x.size(0), -1)

        x = self.fc(x)

        return x

# 主函数

def main():

    # 检查是否有GPU可用

    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

    print(f"使用设备: {device}")

    

    # 加载数据

    train_loader, test_loader = load_data()

    

    # 训练模型

    model, train_losses, train_accs, val_losses, val_accs = train_model(

        train_loader, test_loader, device

    )

    

    # 可视化结果

    plot_results(train_losses, train_accs, val_losses, val_accs)

    

    # 保存模型

    torch.save(model.state_dict(), 'lenet5_mnist.pth')

    print("模型已保存为: lenet5_mnist.pth")

if __name__ == "__main__":

    main()

8. 总结与展望

本文从零开始实现了LeNet5卷积神经网络,并在MNIST数据集上进行了训练和评估。通过这个过程,我们深入理解了卷积神经网络的基本原理、数据预处理的重要性、模型训练的核心步骤以及结果分析的方法。

尽管LeNet5是一个相对简单的网络,但它包含了现代CNN的核心组件,是深入学习更复杂模型的理想起点。在实际应用中,我们可以基于这一基础,探索更深层次的网络架构和更先进的训练技术,进一步提升模型性能。

深度学习是一个不断发展的领域,希望这篇文章能为您的学习之旅提供有益的见解和实践经验。


这个简单而完整的实现展示了卷积神经网络的魅力 - 短短几百行代码,就能构建一个在手写数字识别任务上表现优异的模型。我希望这篇博客能帮助您更好地理解深度学习的基础知识,并鼓励您在此基础上探索更多可能性!

CNN实现MNIST手写数字识别 关键词:CNN、TensorFlow、卷积、池化、特征图 一. 前言本文用TensorFlow实现了CNN(卷积神经网络)的经典结构LeNet-5, 具体CNN的LeNet-5模型原理见《深度学习(四)卷积神经网络入门学习(1)》,讲得还是比较清楚的。数据来源自MNIST, 为了方便起见,已经准备了一个脚本来自动下载和导入MNIST数据集。它会自动创建一个’MNIST_data’的目录来存储数据。 阅读详情

相关推荐

CNN01:Pytorch实现LeNet的Mnist手写数字识别

CNN01:Pytorch实现LeNet的Mnist手写数字识别 1、LeNet的网络结构和原理

xiaoheizi_du的博客 1万+

基于 LeNet5 的 MNIST 数据集识别

LeNet与LeNet5 基于MNIST实现 1 数据集概况 1.1 数据组成 MINIST 数据集总共包含 7 万张手写数字图片,按照 6:1 的比例划分为训练集与测试集。 图片的大小为 28x28,通道数为1,每张图片都是黑底白字,黑底在张量中用 0 表示,白字用0-1 之间的浮点数表示。 具体的数据集及对应标签如表 1 所示。 1.2 数据可视化 使用 showdata.py 查看每一批 batch 中的图片及标签,如图 1。 showdata.py代码: import torch from

日拱一卒,功不唐捐 5361

基于MATLAB 自带手写数字集的CNN(LeNet5)手写数字识别

网络训练及保存: %CNN 手写数字识别程序 %$2021/8/6 Zhigang Zhou$% %查阅MATLAB trainNetwork()帮助文档 %参阅网址: %https://blog.youkuaiyun.com/weixin_43935696/article/details/109372278 %https://blog.youkuaiyun.com/qq_40166660/article/details/111992192 %%读取MATLAB自带数字图像数据集,数据集有10000幅0-9图像,各数字有1

武成汉都 7067

LeNet-5完成MNIST数字识别(Pytorch + Tensorflow)

LeNet-5简介 LeNet-5模型是Yann LeCun教授于1998年在论文 Gradient-based learning applied to document recognition 中提出的,是第一个用于数字识别的卷积神经网络。 在MNIST数据集上,LeNet-5模型可以达到大约99.2%的正确率。LeNet-5模型总共有7层,模型结构如下图所示(网络解析(一):LeNet-5...

chao_shine的博客 2085

PyTorch 中使用 LeNet5 模型进行手写数字识别

这篇文章分为五个部分;MNIST 手写数字识别问题在 PyTorch 中加载 MNIST 数据集具有多层感知器的基线模型MNIST 的简单卷积神经网络MNIST 的 LeNet5。

共同学习、强我国家 1115

卷积神经网络与LeNet的应用——MNIST手写数字识别

神经网络模型结构 模型结构。 测试数据。 误差调整(损失函数)。

weixin_43836818的博客 2141

LeNet-5实现MNIST分类

LeNet-5实现MNIST分类 本人水平有限,如有错误,欢迎指出! 1. LeNet-5 1.1 简介 ​ LeNet-5是由“深度学习三巨头”之一、图灵奖得主Yann LeCun在一篇名为"Gradient-Based Learning Applied to Document Recognition"的paper(paper下载地址:https://www.researchgate.net/publication/2985446_Gradient-Based_Learning_Applied_to

NickHan_cs的博客 2020

CNN与LeNet的应用-数字手写体识别

一、基本介绍 (一)卷积神经网络 卷积神经网络(CNN)是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一 。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络” 。 卷积层是卷积神经网络的核心基石。在图像识别里我们提到的卷积是二维卷积,即离散二维滤波器(也称作卷积核)与二维图像做卷积操作,简单的讲是二维滤波器滑动到...

scan 2408

利用 LeNet-5 实现 MNIST 手写数字识别(Pytorch)

西电-计算机视觉-实验三 一、实验要求 二、实验分析 三、代码实现 #!/usr/bin/env python # @Date: 2021/12/10 # @Desc: 手写字体识别 import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torch.utils.data import DataLoader from torchvision import dat

yyyyypppppzzzzz的博客 6156

基于tensorflow搭建LeNet5网络实现手写数字MNIST识别任务

基于tensorflow搭建LeNet5网络实现手写数字MNIST识别任务 任务准备利用深度学习解决的任务无外乎以下几个关键步骤: 1、明确任务需求,准备训练数据 2、搭建网络模型 3、计算损失函数 4、定义优化器 5、迭代训练 6、测试 1、明确任务,准备数据 由于手写数字识别的任务需求是构建算法模型使其具有对手写的从0到9一共10个数字进行识别的功能。所以训练样本就是一定数量的0到9的...

LxDamon的博客 1461

CNN卷积神经网络—LeNet原理以及tensorflow实现mnist手写体训练

CNN卷积神经网络—LeNet原理以及实现minst手写体训练1. LeNet原理 1. LeNet原理 LeNet是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,该神经网络充分考虑图像的相关性。 LeNet-5神经网络共有7层(不包括输入层)其中有2个卷积层,2个池化层,3个全连接层,每一层都包括不同数量的训练参数。 (LeCun 原论文中 LeNet-5 的经典结构...

CAnCErWu的博客 1839

【TensorFlow】使用LeNet-5模型实现mnist手写数字识别

使用python语言编写,在tensorflow环境下使用LeNet-5模型实现mnist手写数字的识别。

See_Star的博客 6427

幸狐RV1106开发板运行Yolo8示例

rknn_model_zoo 是瑞芯微官方提供的 RKNPU 支持的各种主流算法的部署示例,目前对 Luckfox Pico 所使用的 RV1103/RV1106 有限支持,最新的示例支持 mobilenet 模型部署和 yolo 模型部署,本章以部署 yolov8修改版本为例介绍 rknn_model_zoo 示例的使用。:可选项,用于指定 RKNN 模型的保存路径,默认保存在 ONNX 模型同一目录下,名称为 ‘yolov8.rknn’例如“rv1106”。

qq_42730522的博客 3223

基于LeNet-5的MNIST手写数字识别

基于LeNet-5的MNIST手写数字识别 项目实验环境 系统 显卡 处理器 Cuda版本 Tensorflow版本 Windows10 Pro Nvidia RTX2070Super Intel core i5 9600KF 10.1 Tensorflow-GPU 2.3 1990 年代,Yann LeCun 等人提出了用于手写数字和机器打印字符图片识别的神经网 络,被命名为 LeNet-5 [4]。LeNet-5 的提出,使得卷积神经网络在当时能够成功被商用, 广泛应用在邮政编码、支

sxdcfb的博客 6004

土壤水动力学_前 言

Van Genuchten (V-G) 模型是土壤水分特征曲线中最常用的模型之一。它通过数学方程描述了土壤基质吸力与体积含水量之间的关系,被广泛应用于土壤水分运移、土壤盐渍化、边坡稳定性等研究领域。V-G模型是描述土壤水分特征曲线的重要工具,但它并不是完美的。在实际应用中,需要根据土壤类型、试验条件等因素选择合适的模型。土壤基质吸力是土壤水分学中的一个重要概念,它对土壤水分的保持、植物的生长以及土壤的工程性质都有重要影响。

weixin_44259522的博客 5324

Windows系统监控实战:Grafana+Prometheus+node_exporter配置全攻略

本文提供了一套完整的Windows系统监控解决方案,详细介绍了如何使用Grafana、Prometheus和node_exporter(Windows版为windows_exporter)构建可视化监控平台。从环境准备、组件安装配置,到数据可视化与常见问题排查,手把手指导您实现从数据采集到仪表盘展示的全过程,帮助您从被动救火转向主动预警,有效保障Windows服务器稳定运行。

assembly8low的博客 247

手写体数字识别———LeNet模型

一,Minist数据集特点 MNIST 数据集来自美国国家标准与技术研究所,National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test...

weixin_37592611的博客 9765

相机标定-张正友棋盘格标定法

(X,Y,Z)为在世界坐标系下一点的物理坐标 ( u , v ) 为该点对应的在像素坐标系下的像素坐标 引入齐次坐标的原因:引入齐次坐标的目的是为了升维,将坐标从二维坐标变为三维坐标。 2.相机成像过程 相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。 (1)世界坐标系(,,) 描述目标在真实世界中的位置引入的参考坐标系。 (2)相机坐标系(,,) ...

qq_41275123的博客 1万+

keras CNN lenet-5和LSTM实现MNIST手写数字识别(代码注释详解)

MNIST手写数字识别数据集(图像识别) 数据集包含10个数字的60,000个28x28灰度图像,以及10,000个图像的测试集。 如果MNIST数据集无法下载,详见本篇博客提供下载和使用: https://blog.youkuaiyun.com/sinat_41144773/article/details/89843688 代码实现(CNN卷积、循环神经网络RNN 注释切换) from ...

摸金校尉的博客 3236

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号-串联端接

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑并且进行串联端接,以下图为例,准备好发送接收端的IBIS模型, (se_example.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(W1_welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 338

基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案

最小 MVP:本地知识库 + Doubao Embedding + 简单检索。工具化:把检索/写入/系统功能通过 MCP 封装。Agent 编排:RAG 流程 + 自检 + 引用输出。这样你就可以快速落地一个基于豆包 + 本机知识库的 MCP Agent。

lpfasd123的博客 1095

深度学习实战 | 卷积神经网络LeNet手写数字识别(带手写板GUI界面)

本文将介绍如何使用LeNet卷积神经网络实现手写数字识别,并使用Pytorch实现LeNet手写数字识别,使用PyQt5实现手写板GUI界面,使用户能够通过手写板输入数字并进行识别。通过本文的实践,你可以学到如何使用LeNet卷积神经网络实现手写数字识别,以及如何结合GUI开发一个手写板界面,更直观地进行数字识别交互。这个例子中,用户可以在手写板上写数字,点击识别按钮后,程序将手写板上的数字送入LeNet模型进行识别,并在界面上显示识别结果。

摘星阁 3535

【NodeRed】node-red-contrib-opcua实现PLC读写

在之前的博文【Node-RED】node-red-contrib-opcua-server模块使用(1)中,我们介绍了用node-red-contrib-opcua-server模块实现OPCUA服务端的,以及二次开发的内容。本节博文中我们采用官方社区自带的node-red-contrib-opcua组件开展对OPCUA客户端的介绍,详细阐述用该组件中OpcUa-Client节点实现客户端对PLC的读写,以及实现过程中遇到的问题。由于官方社区中并没有找到该组件的介绍实例,这也是本博文编写的第1个原因。

weixin_48618536的博客 957

基于LeNet实现拍摄手写数字识别

文章目录1 实验内容2 实验原理LeNet:3 具体实现基于PaddlePaddle实现LeNet加载数据:建立模型:模型训练:模型测试:基于Pytorch实现LeNet5加载数据:建立模型:模型训练:拍摄手写数字识别拍照采集手写数字图片处理送入网络测试图片平移、旋转和伸缩处理后4 小组分工4 小组分工 1 实验内容 实现MNIST 数据加载和可视化 阅读LeNet-5 的相关资料和论文,在Keras,Tensorfolow 或Pytorch 任意框架下逐层实现网 络模型的构建 在MNIST 数

Yuetian_w的博客 3379

基于C++和Basler SDK的相机开发详解

Basler相机是德国Basler公司生产的高性能工业相机,具有高分辨率、高帧率和低噪声的特点。Basler相机广泛应用于机器视觉、工业自动化、医疗影像和安防监控等领域。高分辨率和高帧率:能够捕捉清晰、细腻的图像。多种接口:支持USB、GigE、Camera Link等多种接口,方便不同应用场景的需求。丰富的配置选项:支持多种图像格式、分辨率和帧率的配置,适应不同的应用需求。本文详细介绍了如何基于C++和Basler SDK进行相机开发,涵盖了从环境搭建、相机连接、图像采集到图像处理的完整过程。

qq_38334677的博客 2095

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

基于LeNet-5卷积神经网络的手绘数字即时识别项目

本项目开发了GUI应用程序,通过自建训练的LeNet-5卷积神经网络模型,允许用户利用鼠标在画布上自由绘制数字。 绘制完成后,应用程序将实时处理图像,利用LeNet-5模型进行识别,并立即向用户展示识别结果。

Finxs的博客 1865

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: L1-8 静静的推荐
下一篇: L1-5 这是字符串题
loopdeloop
博客等级 码龄4年 219粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值