卷积神经网络(LeNet)识别Fashion-MNIST数据集(Pytorch版)

ResNet18识别MNIST数据集(Pytorch实战) 文章目录1.导库2.获取数据集3.创建Resnet18模型简单查看一下网络结构4.开启训练训练结果训练损失和测试损失关系图训练精度和测试精度关系图5.测试阶段6.查看效果图 1.导库 import time import os import numpy as np import torch import torch.nn.functional as F import torch.nn as nn from torch.utils.data import Dataset from torch.util 阅读详情

1. 前言

1.1 案例介绍

本案例使用Pytorch搭建一个类似LeNet-5的网络结构,用于Fashion-MNIST数据集的图像分类。针对该问题的分析可以分为数据准备、模型建立以及使用训练集进行训练和使用测试集测试模型的效果。

1.2 环境配置

⑴ 操作系统: Windows10
⑵ 编译器环境: PyCharm Community Edition 2021.2
⑶ 配置环境: Pytorch1.8 + torchvision9.0 + CUDA11.3

1.3 模块导入

本案例需要导入如下的库文件和相关模块:

import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import matplotlib.pyplot as plt
import seaborn as sns
import copy
import time
import torch
import torch.nn as nn
from torch.optim import Adam
import torch.utils.data as Data
from torchvision import transforms
from torchvision.datasets import FashionMNIST

2. 图像数据准备

在模型建立与训练之前,首先准备FashionMNIST数据集,该数据集可以直接使用torchvision库中datasets模块的FashionMNIST()函数读取,如果指定的工作文件夹中没有当前数据,可以从网络上自动下载该数据。

2.1 训练验证集的准备

训练验证集的加载处理程序被包装成如下的train_data_process()函数 ,它的作用是导入训练数据集,然后使用Data.DataLoader()函数将其定义为数据加载器,每个batch中会包含64个样本,通过len()函数可以计算数据加载器中包含的batch数量,输出显示train_loader中包含938个batch。需要注意的是参数shuffle = False,表示加载器中每个batch使用的样本都是固定的,这样有利于在训练模型时根据迭代的次数将其分为训练集和验证集。同时为了观察数据集中每个图像的内容,可以获取一个batch的图像,然后将其可视化,以观察数据。

# 处理训练集数据
def train_data_process():
    # 加载FashionMNIST数据集
    train_data = FashionMNIST(root="./data/FashionMNIST",  # 数据路径
                              train=True,  # 只使用训练数据集
                              transform=transforms.ToTensor(),  # 把PIL.Image或者numpy.array数据类型转变为torch.FloatTensor类型
                                                                # 尺寸为Channel * Height * Width,数值范围缩小为[0.0, 1.0]
                              download=False,  # 若本身没有下载相应的数据集,则选择True
                              )
    train_loader = Data.DataLoader(dataset=train_data,  # 传入的数据集
                                   batch_size=64,  # 每个Batch中含有的样本数量
                                   shuffle=False,  # 不对数据集重新排序
                                   num_workers=2,  # 加载数据所开启的进程数量
                                   )
    print("The number of batch in train_loader:", len(train_loader))  # 一共有938个batch,每个batch含有64个训练样本

    # 获得一个Batch的数据
    for step, (b_x, b_y) in enumerate(train_loader):
        if step > 0:
            break
    batch_x = b_x.squeeze().numpy()  # 将四维张量移除第1维,并转换成Numpy数组
    batch_y = b_y.numpy()  # 将张量转换成Numpy数组
    class_label = train_data.classes  # 训练集的标签
    class_label[0] = "T-shirt"

    # 可视化一个Batch的图像
    plt.figure(figsize=(12, 5))
    for ii in np.arange(len(batch_y)):
        plt.subplot(4, 16, ii+1)
        plt.imshow(batch_x[ii, :, :], cmap=plt.cm.gray)
        plt.title(class_label[batch_y[ii]], size=9)
        plt.axis("off")
        plt.subplots_adjust(wspace=0.05)
    plt.show()

    return train_loader, class_label

得到的可视化图像如下:
在这里插入图片描述

2.2 测试集的准备

测试集的加载处理程序被包装成如下的test_data_process()函数 ,它的作用是导入测试数据集,将所有的样本处理为一个整体,看作一个batch用于测试。

# 处理测试集数据
def test_data_process():
    test_data = FashionMNIST(root="./data/FashionMNIST",  # 数据路径
                             train=False,  # 不使用训练数据集
                             download=False,  # 如果前面数据已经下载,这里不再需要重复下载
                             )
    test_data_x = test_data.data.type(torch.FloatTensor) / 255.0  # 将数值范围缩小为[0.0, 1.0]
    test_data_x = torch.unsqueeze(test_data_x, dim=1)  # 为测试数据test_data_x添加一个维度,即通道数
    test_data_y = test_data.targets  # 测试集的标签
    print("test_data_x.shape:", test_data_x.shape)
    print("test_data_y.shape:", test_data_y.shape)

    return test_data_x, test_data_y

得到的输出结果如下,即测试集有10000张28×28的图像。
在这里插入图片描述

3. 卷积神经网络的搭建

在数据准备完毕后,可以搭建一个卷积神经网络,并且使用训练数据对网络进行训练,使用测试集验证所搭建网络的识别精度。
搭建的卷积神经网络(如下图)有2个卷积层,分别包含16个和32个3×3的卷积核,并且卷积后使用ReLU激活函数进行激活,两个池化层均为平均池化,而两个全连接层分别有256和128个神经单元,最后的分类器则包含了10个神经元。
在这里插入图片描述

下面的程序代码定义了一个类ConvNet,在继承了nn.Module类的基础上对其结构和功能进行了定义。通过nn.Sequential()函数分别定义了一个由两个卷积层和三个全连接层组成的网络结构,并且在forward()函数中定义了数据在网络中的前向传播过程。

# 定义一个卷积神经网络
class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()  # 对继承自父类Module的属性进行初始化

        # 定义第一个卷积层,16个3*3的卷积核,池化层为平均池化
        self.conv1 = nn.Sequential(nn.Conv2d(in_channels=1,  # 输入图像的通道数
                                             out_channels=16,  # 卷积核的数量
                                             kernel_size=3,  # 卷积核的大小
                                             stride=1,  # 步长
                                             padding=1,  # 填充的数量
                                             ),  # 经过卷积后的尺寸变化:(1*28*28) -> (16*28*28)
                                   nn.ReLU(),  # ReLU激活函数
                                   nn.AvgPool2d(kernel_size=2,  # 池化窗口的大小
                                                stride=2,  # 步长
                                                ),  # 经过池化后的尺寸变化:(16*28*28) -> (16*14*14)
                                   )
        # 定义第二个卷积层,32个3*3的卷积核,池化层为平均池化
        self.conv2 = nn.Sequential(nn.Conv2d(in_channels=16,  # 输入图像的通道数
                                             out_channels=32,  # 卷积核的数量
                                             kernel_size=3,  # 卷积核的大小
                                             stride=1,  # 步长
                                             padding=0,  # 填充的数量
                                             ),  # 经过卷积后的尺寸变化:(16*14*14) -> (32*12*12)
                                   nn.ReLU(),  # ReLU激活函数
                                   nn.AvgPool2d(kernel_size=2,  # 池化窗口的大小
                                                stride=2,  # 步长
                                                ),  # 经过池化后的尺寸变化:(32*12*12) -> (32*6*6)
                                   )
        # 定义全连接层
        self.classifier = nn.Sequential(nn.Linear(32*6*6, 256),  # 全连接层的输入为32*6*6=1152,输出为256
                                        nn.ReLU(),
                                        nn.Linear(256, 128),  # 全连接层的输入为256,输出为128
                                        nn.ReLU(),
                                        nn.Linear(128, 10)  # 全连接层的输入为128,输出为10
                                        )

    # 定义网络结构的前向传播路径
    def forward(self, x):
        x = self.conv1(x)  # 将数据集x输入给第一个卷积层
        x = self.conv2(x)  # 将第一个卷积层的输出给到第二个卷积层
        x = x.view(x.size(0), -1)  # 将第二个卷积层的输出展开成一维张量x
                                   # 四维张量x对应的维度为(batch_size,channels,x,y),其中x.size(0)对应batch_size
        output = self.classifier(x)  # 将展开的一维张量x给到全连接层和分类器

        return output

将所定义的网络结构打印出来如下:
在这里插入图片描述

4. 卷积神经网络训练与预测

为了训练网络结构ConvNet,定义了一个train_model()函数,该函数的作用是使用训练数据集来训练ConvNet。训练数据集包含了60000张图像,划分成938个batch,其中80%的batch用于模型的训练,20%的batch用于模型的验证,因此在train_model()函数中,包含了模型的训练和验证两个过程。

# 定义网络的训练过程
def train_model(model, traindataloader, train_rate, criterion, optimizer, num_epochs=25):
    '''
    :param model: 网络模型
    :param traindataloader: 训练数据集,会切分为训练集和验证集
    :param train_rate: 训练集batch_size的百分比
    :param criterion: 损失函数
    :param optimizer: 优化方法
    :param num_epochs: 训练的轮数
    '''

    batch_num = len(traindataloader)  # batch数量
    train_batch_num = round(batch_num * train_rate)  # 将80%的batch用于训练,round()函数四舍五入
    best_model_wts = copy.deepcopy(model.state_dict())  # 复制当前模型的参数
    # 初始化参数
    best_acc = 0.0  # 最高准确度
    train_loss_all = []  # 训练集损失函数列表
    train_acc_all = []  # 训练集准确度列表
    val_loss_all = []  # 验证集损失函数列表
    val_acc_all = []  # 验证集准确度列表
    since = time.time()  # 当前时间
    # 进行迭代训练模型
    for epoch in range(num_epochs):
        print('Epoch {}/{}'.format(epoch, num_epochs - 1))
        print('-' * 10)

        # 初始化参数
        train_loss = 0.0  # 训练集损失函数
        train_corrects = 0  # 训练集准确度
        train_num = 0  # 训练集样本数量
        val_loss = 0.0  # 验证集损失函数
        val_corrects = 0  # 验证集准确度
        val_num = 0  # 验证集样本数量
        # 对每一个mini-batch进行训练和计算
        for step, (b_x, b_y) in enumerate(traindataloader):
            if step < train_batch_num:  # 使用数据集的80%用于训练
                model.train()  # 设置模型为训练模式,启用Batch Normalization和Dropout
                output = model(b_x)  # 前向传播过程,输入为一个batch,输出为一个batch中对应的预测
                pre_lab = torch.argmax(output, 1)  # 查找每一行中最大值对应的行标
                loss = criterion(output, b_y)  # 计算每一个batch的损失函数
                optimizer.zero_grad()  # 将梯度初始化为0
                loss.backward()  # 反向传播计算
                optimizer.step()  # 根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用
                train_loss += loss.item() * b_x.size(0)  # 对损失函数进行累加
                train_corrects += torch.sum(pre_lab == b_y.data)  # 如果预测正确,则准确度train_corrects加1
                train_num += b_x.size(0)  # 当前用于训练的样本数量
            else:  # 使用数据集的20%用于验证
                model.eval()  # 设置模型为评估模式,不启用Batch Normalization和Dropout
                output = model(b_x)  # 前向传播过程,输入为一个batch,输出为一个batch中对应的预测
                pre_lab = torch.argmax(output, 1)  # 查找每一行中最大值对应的行标
                loss = criterion(output, b_y)  # 计算每一个batch中64个样本的平均损失函数
                val_loss += loss.item() * b_x.size(0)  # 将验证集中每一个batch的损失函数进行累加
                val_corrects += torch.sum(pre_lab == b_y.data)  # 如果预测正确,则准确度val_corrects加1
                val_num += b_x.size(0)  # 当前用于验证的样本数量

        # 计算并保存每一次迭代的成本函数和准确率
        train_loss_all.append(train_loss / train_num)  # 计算并保存训练集的成本函数
        train_acc_all.append(train_corrects.double().item() / train_num)  # 计算并保存训练集的准确率
        val_loss_all.append(val_loss / val_num)  # 计算并保存验证集的成本函数
        val_acc_all.append(val_corrects.double().item() / val_num)  # 计算并保存验证集的准确率
        print('{} Train Loss: {:.4f} Train Acc: {:.4f}'.format(epoch, train_loss_all[-1], train_acc_all[-1]))
        print('{} Val Loss: {:.4f} Val Acc: {:.4f}'.format(epoch, val_loss_all[-1], val_acc_all[-1]))

        # 寻找最高准确度
        if val_acc_all[-1] > best_acc:
            best_acc = val_acc_all[-1]  # 保存当前的最高准确度
            best_model_wts = copy.deepcopy(model.state_dict())  # 保存当前最高准确度下的模型参数
        time_use = time.time() - since  # 计算耗费时间
        print("Train and val complete in {:.0f}m {:.0f}s".format(time_use // 60, time_use % 60))

    # 选择最优参数
    model.load_state_dict(best_model_wts)  # 加载最高准确度下的模型参数
    train_process = pd.DataFrame(data={"epoch": range(num_epochs),
                                       "train_loss_all": train_loss_all,
                                       "val_loss_all": val_loss_all,
                                       "train_acc_all": train_acc_all,
                                       "val_acc_all": val_acc_all}
                                 )  # 将每一代的损失函数和准确度保存为DataFrame格式

    # 显示每一次迭代后的训练集和验证集的损失函数和准确率
    plt.figure(figsize=(12, 4))
    plt.subplot(1, 2, 1)
    plt.plot(train_process['epoch'], train_process.train_loss_all, "ro-", label="Train loss")
    plt.plot(train_process['epoch'], train_process.val_loss_all, "bs-", label="Val loss")
    plt.legend()
    plt.xlabel("epoch")
    plt.ylabel("Loss")
    plt.subplot(1, 2, 2)
    plt.plot(train_process['epoch'], train_process.train_acc_all, "ro-", label="Train acc")
    plt.plot(train_process['epoch'], train_process.val_acc_all, "bs-", label="Val acc")
    plt.xlabel("epoch")
    plt.ylabel("acc")
    plt.legend()
    plt.show()

    return model, train_process

接下来开始对模型进行训练和测试,其中优化算法使用了Adam优化器,学习率设置为0.0003,损失函数为交叉熵函数。然后调用train_model()函数将训练集train_loader的80%用于训练,20%用于验证,一共训练25轮。

# 训练和测试模型
def train_model_process(myconvnet):
    optimizer = torch.optim.Adam(myconvnet.parameters(), lr=0.0003)  # 使用Adam优化器,学习率为0.0003
    criterion = nn.CrossEntropyLoss()  # 损失函数为交叉熵函数
    train_loader, class_label = train_data_process()  # 加载训练集
    test_data_x, test_data_y = test_data_process() # 加载测试集
    myconvnet, train_process = train_model(myconvnet, train_loader, 0.8, criterion, optimizer, num_epochs=25)  # 进行模型训练

    # 对测试集进行预测
    myconvnet.eval()  # 设置模型为评估模式,不启用Batch Normalization和Dropout
    output = myconvnet(test_data_x)  # 前向传播过程,输入为测试数据集,输出为对每个样本的预测
    pre_lab = torch.argmax(output, 1)  # 查找每一行中最大值对应的行标
    acc = accuracy_score(test_data_y, pre_lab)  # 计算分类准确率
    print("val_acc:", acc)

    # 计算混淆矩阵并可视化
    conf_mat = confusion_matrix(test_data_y, pre_lab)
    df_cm = pd.DataFrame(conf_mat, index=class_label, columns=class_label)
    heatmap = sns.heatmap(df_cm, annot=True, fmt="d", cmap="YlGnBu")
    heatmap.yaxis.set_ticklabels(heatmap.yaxis.get_ticklabels(), rotation=0, ha='right')
    heatmap.xaxis.set_ticklabels(heatmap.xaxis.get_ticklabels(), rotation=45, ha='right')
    plt.ylabel('True label')
    plt.xlabel('Predicted label')
    plt.show()

在模型训练过程中,损失函数和分类准确率的变化曲线如下。可以看到,损失函数在训练集上迅速减小,在验证集上先减小然后逐渐收敛到一个很小的区间,说明模型已经稳定。分类准确率在训练集上一直在增大,而在验证集上逐渐收敛到一个小的区间内。
在这里插入图片描述

为了得到计算模型的泛化能力,将测试集给到训练好的模型进行预测,从而得到在测试集上的预测准确率(如下图)。
在这里插入图片描述

针对测试样本的预测结果,使用混淆矩阵表示并将其可视化,观察其在每类数据上的预测情况(如下图)。可以看到,最容易预测发生错误的是T-shirt和Shirt,相互预测出错的样本量超过了100个。
在这里插入图片描述

5. 运行程序

如下是主函数中的内容,创建一个类ConvNet的对象,并对该卷积神经网络进行训练和预测。

if __name__ == '__main__':
    convnet = ConvNet()
    train_model_process(convnet)

注:在之前的程序中配置了使用多个进程同时加载训练集数据,多进程的使用必须在main()函数中进行,否则会在执行过程中报错。

卷积神经网络(DenseNet)识别Fashion-MNIST数据集(Pytorch版) 卷积神经网络(DenseNet)识别Fashion-MNIST数据集(Pytorch版)1. 前言1.1 案例介绍1.2 环境配置1.3 模块导入2. 图像数据准备2.1 训练验证集的准备2.2 测试集的准备3. 卷积神经网络的搭建3.1 稠密块的创建3.2 过渡层的创建3.3 DenseNet网络的搭建4. 卷积神经网络训练与预测5. 运行程序 1. 前言 1.1 案例介绍 本案例使用Pytorch搭建一个DenseNet网络结构,用于Fashion-MNIST数据集的图像分类。针对该问题的分析可以分为数 阅读详情

相关推荐

pytorch进行fashion mnist数据集分类

标题1.数据集介绍 (1)MNIST MNIST是深度学习最基本的数据集之一,由CNN鼻祖yann lecun建立的一个手写字符数据集,包含60000张训练图像和10000张测试图像,包含数字0-9共10个类别. (2)FASHION MNIST 由于MNIST数据集太简单,简单的网络就可以达到99.7%的top one准确率,也就是说在这个数据集上表现较好的网络,在别的任务上表现不一定好。因此...

lemonHe的博客 2万+

对服装图像进行分类--Fashion_mnist数据集

本指南将训练一个神经网络模型,对运动鞋和衬衫等服装图像进行分类。 1.加载Fashion MNIST数据集 # TensorFlow and tf.keras import tensorflow as tf from tensorflow import keras # Helper libraries import numpy as np import matplotlib.pyplot as plt print(tf.__version__) 2.2.0 fashion_mnist = keras

qq_44863281的博客 1970

【PyTorch】CNN图像识别分类模型

使用PyTorch搭建一个类似LeNet-5的卷积神经网络结构,用于fashion-mnist数据集的图像分类。分为数据准备、模型建立、使用训练集进行训练和使用测试集测试模型效果并可视化。 import numpy as np import pandas as pd from sklearn.metrics import accuracy_score,confusion_matrix,classification_report import matplotlib.pyplot as plt import s

weixin_39274067的博客 4777

深度学习笔记_6经典预训练网络LeNet-18解决FashionMNIST数据集

【代码】深度学习笔记_6经典预训练网络LeNet-18解决FashionMNIST数据集。

cfy2401926342的博客 992

深入解析EDID中Display Descriptor Block的配置技巧与实战应用

本文深入解析EDID中Display Descriptor Block的配置技巧与实战应用。通过剖析像素时钟、有效像素、消隐区与同步脉冲等核心参数,并结合1280x720@60Hz的实战配置案例,指导开发者如何正确为定制硬件或非标准显示器编写“身份证”,避免黑屏、分辨率异常等问题,确保显示设备完美点亮。

1a2s3d4f5g的博客 871

大语言模型(LLM)在组合优化中的新突破:LLM-LNS与FunSearch性能对比

本文深入探讨了大语言模型(LLM)在组合优化中的创新应用,重点对比了LLM-LNS与FunSearch两种方法的性能差异。研究表明,LLM-LNS在物流路径规划、资源调度等场景中展现出显著优势,其双层自演化架构能有效平衡探索与利用,相比传统方法提升效率约43%。文章还提供了实践选择指南,帮助开发者根据具体需求选用合适的技术方案。

weixin_42526415的博客 398

Pytorch8实现CNN卷积神经网络

摘要 本文介绍了CNN卷积神经网络的基本原理及其在图像识别任务中的优势。相比全连接网络,CNN通过局部连接、权值共享和下采样等机制有效减少了参数数量并保留了重要的空间信息。文章详细阐述了CNN的三大核心结构:卷积层用于特征提取,池化层用于降采样和增加平移不变性,全连接层完成最终分类。以LeNet为例展示了CNN的具体实现,包括模型构建和训练过程,并验证了其在Fashion-MNIST数据集上的良好性能。实验结果表明,CNN能够高效处理图像数据,为深度学习在计算机视觉领域的应用奠定了基础。

2301_80922247的博客 1034

从零搭建自动驾驶仿真环境:我的Nuplan-devkit实战笔记(含PyCharm配置技巧)

本文详细记录了从零搭建Nuplan-devkit自动驾驶仿真环境的完整流程,包括conda环境配置、pip版本控制、PyCharm专业版集成等关键步骤。特别针对Ubuntu系统下的依赖管理、数据目录优化和性能调优提供了实用技巧,帮助开发者高效构建稳定的自动驾驶仿真开发环境。

weixin_30505225的博客 474

【CNN】经典网络LeNet——最早发布的卷积神经网络之一

LeNet主要的出现契机是手写数字的识别,并在邮政和银行发挥了非常重要的角色。但是,这个网络在当时流行度没那么高,但是知名度最高的还是MNIST数据集。所有的都是黑白图。对于LeNet,总体来看,卷积编码层:由两个卷积层组成全连接密集块:由是哪个全连接层组成架构图如下图所示:输入的是28 * 28的单通道图片 得到6输出通道的28 * 28的, 通过池化层,得到6通道14 * 14的特征图,最后通过卷积操作得到16输出通道的特征图,在通过池化得到16通道的5 * 5。

写写平时的技术与感想 4483

C#实战:如何用Bartender 10.1实现动态打印与批量打印(附完整源码)

本文深入探讨了如何在C#项目中高效集成Bartender 10.1,实现企业级的动态打印与批量打印功能。文章提供了从环境配置、COM接口精讲、高可用打印服务类封装,到批量打印性能优化及生产环境部署的全套实战方案与源码,帮助开发者构建健壮、可维护的打印解决方案。

weixin_29290963的博客 430

基于Spring Boot框架的网上蛋糕销售系统

随着互联网的普及和电子商务的迅猛发展,网上购物已经成为人们日常生活的一部分。蛋糕作为一种受欢迎的食品,其销售市场也逐渐向网络化方向发展。网上蛋糕销售系统能够打破时间和地域的限制,让消费者随时随地浏览和购买蛋糕,同时也为蛋糕商家提供了一个展示和销售产品的平台。该系统的开发旨在提高蛋糕预定和销售的便捷性,节约时间和经济成本,并推动蛋糕市场的进一步发展。开发语言:Java,一种面向对象的编程语言,具有跨平台性、稳定性和安全性等特点,适用于构建大型、复杂的Web应用程序。 框架:Spring Boot,一个基于Sp

2301_81127431的博客 994

CNN网络详解

前言   在学计算机视觉的这段时间里整理了不少的笔记,想着就把这些笔记再重新整理出来,然后写成Blog和大家一起分享。目前的计划如下(以下网络全部使用Pytorch搭建): 专题一:计算机视觉基础 介绍CNN网络(计算机视觉的基础) 浅谈VGG网络,介绍ResNet网络(网络特点是越来越深) 介绍GoogLeNet网络(网络特点是越来越宽) 介绍DenseNet网络(一个看似十分NB但是却实际上用得不多的网络) 整理期间还会分享一些自己正在参加的比赛的Baseline 专题二:GAN网络 搭建普通的G

guowei_huai的博客 1万+

Unity半透明物体景深失效?教你用双材质球方案完美解决(附完整Shader代码)

本文深入剖析了Unity中半透明物体导致景深效果失效的根本原因,即半透明物体默认不写入摄像机深度图。针对此问题,文章详细介绍了稳定高效的“双材质球”解决方案,通过为物体附加一个仅写入深度信息的不可见材质,完美修复景深效果,并提供了完整的Shader代码与实现脚本。

weixin_29010003的博客 378

【深度学习】:《PyTorch入门到项目实战》卷积神经网络2-5:LeNet、AlexNet、VGG

我们介绍了三种经典的卷积神经网络架构:`LeNet,AlexNet,VGG`。他们的共同思想都是使用卷积层来学习图片的空间信息,提取特征,最后使用全连接层转换到我们要的分类空间。 LeNet是首个成功应用在手写数字识别数据集上的深度卷积神经网络,只有2个卷积层、两个池化层和三个全连接层 AlexNet在LeNet基础上使用了更多更深的卷积层,在2012年的ImageNet比赛上一战成名,从此引领了深度学习的浪潮 VGG在AlexNet的基础上构建了一个非常深的卷积神经网络,通过堆叠多个VGG块实现

阿里云专家博主、数据科学领域优质创作者、统计er在读 1万+

VsCode安装和配置c/c++环境(超完整,小白专用)

1. vsCode配置C/C++环境 1. vsCode下载和安装 1. 下载Microsoft vsCode [vsCode在这里插入图片描述官网下载: https://code.visualstudio.com/ 2. 安装vsCode 3. 下载中文插件 我这边已经下载过,刚卸载但是没有重启编译器,所以界面显示了中文 2. MinGW编译器下载和配置 1. 下载MinGW 在线安装——下载MinGW-W64-install.exe(速度慢) 下载压缩包——×86_64-posix-

黄化的多多 60万+

OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)

上一篇编译了proj6.2.0、gdal3.2.1,本篇继续。 OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译Osg,然后编译OsgEarth。OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

经典神经网络(1)LeNet及其在Fashion-MNIST数据集上的应用

LeNet详解、pytorch代码实现,及其在Fashion-MNIST数据集上的应用

qq_44665283的博客 2539

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【从零开始学习深度学习】25.卷积神经网络之LeNet模型介绍及其Pytorch实现【含完整代码】

【从零开始学习深度学习】25.卷积神经网络之LeNet模型介绍及其Pytorch实现

阿旭的博客 945

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【深度学习】LeNet实现(pyTorch)

Contents1 LeNet模型2 获取数据和训练模型      LeNet是1998年用来识别手写数字图像的卷积神经网络,它展示了通过梯度下降训练卷积神经网络可以达到手写数字识别在当时最先进的结果。这个奠基性的工作第一次将卷积神经网络推上舞台,为世人所知。 1 LeNet模型 LeNet分为卷积层块和全连接层块两个部分。 卷积层块里的基本单位是卷积层后接最大池化层:卷积层用来识别图像里的空间模式,如线条和物体局部,之后的最大池化层则用来降低卷积层对位置的敏感性。卷积层块由两个这样的基本单位重复堆叠构成。

Bryce-HJ 492

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

从0开始深度学习(27)——卷积神经网络(LeNet)

LeNet是最早的卷积神经网络之一,由Yann LeCun等人在1990年代提出,并以其名字命名。最初,LeNet被设计用于手写数字识别,最著名的应用是在美国的邮政系统中识别手写邮政编码。LeNet架构的成功证明了卷积神经网络在解决实际问题中的有效性,为后续更复杂、更强大的CNN模型的发展奠定了基础。结构如下:我们知道手写数字识别数据集的数据,都是28×28的灰度图,下面我们将输入一个28×28的矩阵,看看经过这个模型过后,会输出什么。可以发现最后输出为1×10。

立志成为炼丹师? 1240

atm取款机的简单程序代码_LeNet:一个简单的卷积神经网络PyTorch实现

前两篇文章分别介绍了卷积层和池化层,卷积和池化是卷积神经网络必备的两大基础。本文我们将介绍一个早期用来识别手写数字图像的卷积神经网络:LeNet[1]。LeNet名字来源于论文的第一作者Yann LeCun。1989年,LeNet使用卷积神经网络和梯度下降法,使得手写数字识别达到当时领先水平。这个奠基性的工作第一次将卷积神经网络推上历史舞台,为世人所知。由于LeNet的出色表现,在很多ATM取款机...

weixin_39860064的博客 183

LeNet-5:经典卷积神经网络的介绍与PyTorch实现

LeNet-5是最早发布的卷积神经网络之一,也是首个成功应用的CNN架构。LeNet-5最开始被用于识别手写数字,后续被广泛用于自动取款机中,帮助识别处理支票的数字。本文是一篇对LeNet-5网络的介绍和实现过程分享模型在训练过程中有效学习,优化过程稳定。训练与测试准确率接近且均在80%左右,说明模型在如Fashion-MNIST数据集上具备较强学改进方向:数据增强:添加随机翻转、裁剪或噪声,增强模型鲁棒性。超参数调优:调整学习率、增大训练轮次。

weixin_66055592的博客 1188

LeNet网络结构介绍及代码实战(pytorch)

本论文讲解了LeNet网络的结构并使用pytorch库进行了代码实战

weixin_42385747的博客 1067

动手学深度学习之lenet

参考伯禹学习平台《动手学深度学习》课程内容内容撰写的学习笔记 原文链接:https://www.boyuai.com/elites/course/cZu18YmweLv10OeV/lesson/cuwTT4MTwpHpKfaKKDcYQt 感谢伯禹平台,Datawhale,和鲸,AWS给我们提供的免费学习机会!! 总的学习感受:伯禹的课程做的很好,课程非常系统,每个较高级别的课程都会有需要掌握的前...

water19111213的博客 553

深度学习_卷积神经网络(LeNet)

在本节中,我们将介绍LeNet,它是最早发布的卷积神经网络之一。这个模型是由AT&T贝尔实验室的研究院Yann LeCun在1989年提出的(并以其命名),目的是识别手写数字。当时,LeNet取得了与支持向量机性能相媲美的成果,成为监督学习的主流方法。LeNet被广泛用于自动取款机中,帮助识别处理支票的数字。 LeNet 总体来看,LeNet(LeNet-5)由两个部分组成: 卷积编码器: 由两个卷积层组成 全连接层密集快: 由三个全连接层组成 每个卷积块中的基本单元是一个卷积层、一个sigm

Supre_yuan的博客 597

DL学习8--Lenet-Mnist

李沐视频学习

qq_46102205的博客 453
上一篇: 吴恩达卷积神经网络章节笔记(一)——卷积神经网络
下一篇: 卷积神经网络(AlexNet)识别Fashion-MNIST数据集(Pytorch版)
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值