pytorch深度学习基础(十)——常用线性CNN模型的结构与训练

卷积神经网络(CNN)与深度卷积神经网络(DCNN) 作为小白,看到DCNN,一直想知道与CNN的区别,也没找到明确的说法,以下是自己的一点想法,欢迎指正! 目录 一、CNN与DCNN 二、基于pytorch的实现 1.LeNet-5 2.AlexNet 一、CNN与DCNN 卷积神经网络,如:LeNet 深度卷积神经网络,如:AlexNet AlexNet与LeNet结构类似,但使用了更多的卷积层和更大的参数空间来拟合大规模数据集ImageNet。 卷积神经网络就是含卷积层的网络。AlexNet是浅层神经网络和深度神经网络的分界.. 阅读详情

引入包

import torch
from torch import nn
from torchvision import datasets
from torchvision import transforms
from torch.utils.data import DataLoader
from tqdm import tqdm

LeNet

LeNet是一个较为简单的线性卷积模型,最早是应用于手写数字识别,提到手写数字识别就不得不提到mnist数据集,而为了与后续其他较强的模型进行对比,我们采用fashion_mnist数据集为例。

模型结构

模型结构如下
在这里插入图片描述

模型构建

因为LeNet是线性模型,所以我们直接使用torch.nn.Sequential构建模型

net = nn.Sequential(nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),  # (1, 28, 28)->(6, 28, 28)
                    nn.AvgPool2d(kernel_size=2, stride=2),  # (6, 28, 28)->(6, 14, 14)
                    nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),  # (6, 14, 14)->(16, 10, 10)
                    nn.AvgPool2d(kernel_size=2, stride=2),  # (16, 10, 10)->(16, 5, 5)
                    nn.Flatten(),
                    nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),  # (16 * 5 * 5, 120)
                    nn.Linear(120, 84), nn.Sigmoid(),  # (120, 84)
                    nn.Linear(84, 10)
                   )

我们先构建一个伪数据输入模型,来观察它的每一层的结构

X= torch.randn((1, 1, 28, 28))
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape: \t',X.shape)

在这里插入图片描述

AlexNet

模型结构

AlexNet也是一个线性模型,相当于算是LeNet的加强版,模型结构如下
在这里插入图片描述

模型构建

net = nn.Sequential(nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=1),nn.ReLU(),  # (3, 224, 224)->(96, 54, 54)
                    nn.MaxPool2d(kernel_size=3, stride=2),  # (96, 26, 26)
                    nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),  # (256, 26, 26)
                    nn.MaxPool2d(kernel_size=3, stride=2),  # (256, 12, 12)
                    nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),  # (384, 12, 12)
                    nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),  # (384, 12, 12)
                    nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),  # (256, 12, 12)
                    nn.MaxPool2d(kernel_size=3, stride=2),  # (256, 5, 5)
                    nn.Flatten(),  # 256 * 5 * 5
                    nn.Linear(6400, 4096), nn.ReLU(),
                    nn.Dropout(0.5),
                    nn.Linear(4096, 4096), nn.ReLU(),
                    nn.Dropout(0.5),
                    nn.Linear(4096, 10)
                   )

观察

X = torch.randn((1, 3, 224, 224))
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__, '\t', X.shape)

在这里插入图片描述

VGG

模型结构

VGG虽然仍然是线性模型,但是他引入了块的结构,模型结构依然是线性,只不过构建的方式更为简便,即不用一层层的去构建,直接通过构建块来构建

模型构建

vgg块

def vgg_block(num_conv, in_channels, out_channels):
    layers = []
    for _ in range(num_conv):
        layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))
        layers.append(nn.ReLU())
        in_channels = out_channels
        
    layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
    return nn.Sequential(*layers)

构建vgg11模型

def vgg11(in_channel):
    conv_archs = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))
    conv_blks = []
    for (num_conv, out_channel) in conv_archs:
        conv_blks.append(vgg_block(num_conv, in_channel, out_channel))
        in_channel = out_channel
    
    return nn.Sequential(*conv_blks, nn.Flatten(),
                         nn.Linear(out_channel*7*7, 4096), nn.ReLU(),
                         nn.Dropout(0.5),
                         nn.Linear(4096, 4096), nn.ReLU(),
                         nn.Linear(4096, 10)
                        )
net = vgg11(1)

加载数据集

可以直接使用torchvision.datasets中的FashionMNIST直接加载数据集,其中需要注意的是读入是图像的数据一定要使用transforms.ToTensor将数据转换成torch模型支持的数据类型,即tensor类型

def load_fashion_mnist(batch_size, resize=None):
    tran = [transforms.ToTensor()]
    if resize:
        tran.insert(0, transforms.Resize(resize))
    tran = transforms.Compose(tran)
    mnist_train = datasets.FashionMNIST(root='./data', train=True, transform=tran, download=True)
    mnist_test = datasets.FashionMNIST(root='./data', train=False, transform=tran, download=True)
    return (DataLoader(mnist_train, batch_size, shuffle=True),
            DataLoader(mnist_test, batch_size, shuffle=False)
           )

batch_size = 256
train_iter, test_iter = load_fashion_mnist(batch_size)

累加器

定义一个累加器,用来累积,在后边训练的时候用于统计精度和损失,这个是参照的李沐的动手学深度学习,刚开始的时候我也是按照这个这样写的,但是后边根据个人的使用习惯已经被替换掉了,暂时这个还是跟李沐老师的符合一下。

class Accumulator:
    def __init__(self, n):
        self.data = [0.0] * n
        
    def add(self, *args):
        self.data = [a + float(b) for a, b in zip(self.data, args)]
        
    def reset(self):
        self.data = [0.0] * len(self.data)
        
    def __getitem__(self, idx):
        return self.data[idx]

精度

def accuracy(y_hat, y):
    if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
        y_hat =  torch.argmax(y_hat, axis=1)
        
    cmp = y_hat.type(y.dtype)==y
    return float(cmp.type(y.dtype).sum())

其中y_hat是预测标签,y是真实标签。
这里需要强调的是,y作为真实标签,每个标签是一个数字,而y_hat既可以是一个数字,也可以是神经网络输出的不同类别的概率,为了统一形式,当输入的y_hat不为数字时,我们使用torch.argmax获取类别概率最大的索引,即最大的值。

训练

def train(net, name, train_ter, test_iter, num_epochs, lr, device):
    def init_weights(m):
        if isinstance(m, nn.Linear) or isinstance(m, nn.Conv2d):
            nn.init.xavier_uniform_(m.weight)
    
    net.apply(init_weights)
    print("device in : ", device)
    net = net.to(device)
    optimizer = torch.optim.SGD(net.parameters(), lr=lr)
    loss = nn.CrossEntropyLoss()
    for epoch in range(num_epochs):
        print("epoch {}/{}".format(epoch+1, num_epochs))
        metric = Accumulator(3)
        net.train()
        print('training...')
        for X, y in tqdm(train_iter, ncols=50, postfix="{}".format(name)):
            optimizer.zero_grad()
            X, y = X.to(device), y.to(device)
            y_hat = net(X)
            l = loss(y_hat, y)
            l.backward()
            optimizer.step()
            with torch.no_grad():
                metric.add(l * X.shape[0], accuracy(y_hat, y), X.shape[0])
            
            train_l = metric[0] / metric[2]
            train_acc = metric[1] / metric[2]
        tqdm.write('train loss:{} , train acc:{}'.format(train_l, train_acc))
        metric.reset()
        net.eval()
        print('validating...')
        for X, y in (test_iter):
            X, y = X.to(device), y.to(device)
            y_hat = net(X)
            with torch.no_grad():
                l = loss(y_hat, y)
                metric.add(l * X.shape[0], accuracy(y_hat, y), X.shape[0])
            
        test_l = metric[0] / metric[2]
        test_acc = metric[1] / metric[2]
        metric.reset()
        
        tqdm.write('test loss:{} , test acc:{}'.format(test_l, test_acc))

train(net, 'LeNet', train_iter, test_iter, 30, 0.95, 'cuda')

在这里插入图片描述

《Pytorch深度学习实践》课程合集(刘二大人)笔记 2 线性模型 深度学习步骤 数据集 —— 拿到的训练集,要分成两部分,训练集,交叉验证集 和 测试集 模型 训练 推理 ML常用损失函数 阅读详情

相关推荐

深入解析卷积神经网络(CNN):PyTorch实战指南与核心原理

卷积神经网络(CNN)是深度学习领域中最成功的网络架构之一,广泛应用于图像识别、视频分析和自然语言处理等任务。本文深入探讨了CNN的基本原理与核心构成,包括卷积层、池化层、全连接层和激活函数,并通过PyTorch实战演示了如何构建和训练一个简单的CNN模型。文章还介绍了如何使用CIFAR-10数据集进行模型训练与评估,展示了CNN在自动特征提取和分类任务中的强大能力。无论是深度学习初学者还是开发者,本文都提供了系统性的指导,帮助读者更好地理解和应用CNN。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1322

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

深度卷积神经网络(VGG-11)识别Fashion-MNIST数据集(Pytorch版)1. 前言1.1 案例介绍1.2 环境配置1.3 模块导入2. 图像数据准备2.1 训练验证集的准备2.2 测试集的准备3. 卷积神经网络的搭建3.1 VGG模块的创建3.2 VGG网络的搭建4. 卷积神经网络训练与预测5. 运行程序 1. 前言 1.1 案例介绍 本案例使用Pytorch搭建一个稍微简化的VGG-11网络结构,用于Fashion-MNIST数据集的图像分类。针对该问题的分析可以分为数据准备、模型建立以及

Rome was not built in a day. 4201

使用PyTorch构建卷积神经网络(CNN)实现CIFAR-10图像分类

在计算机视觉领域,卷积神经网络(CNN)已经成为处理图像识别任务的事实标准。从人脸识别到医学影像分析,CNN展现出了惊人的能力。本文将详细介绍如何使用PyTorch框架构建一个CNN模型,并在经典的CIFAR-10数据集上进行图像分类任务。 CIFAR-10数据集包含10个类别的60000张32x32彩色图像,每个类别有6000张图像,其中50000张用于训练,10000张用于测试。这个数据集虽然图像尺寸较小,但包含了足够的复杂性,是学习计算机视觉和深度学习的理想起点。

vvilkin的学习备忘 1842

Pytorch nn.Linear 全连接层的原理和作用(个人理解)

一、官网说明: 二、个人理解 对CNN来说图片以batchsize的大小并行送入神经网络,经过一些卷积,到最后送入全连接层进行分类,送入全连接层之前的每个特征图已经被拉平(变成1xn的形式,这里的n就是x中的3,x中的10代表有10个1),所以下面的x中的10行可以理解为batchsize(即10张图片),x中的3列可以理解为每个图片被提取了3个特征,最后的y可以理解为对这10个图片进行一个5分类,分类的结果为这5个数中最大的那个数所对应的索引,具体分类的结果为索引对应的类别。 三、计...

m0_51032217的博客 1万+

【人工智能-初级】第11章 深度学习与卷积神经网络(CNN):基础与实现

卷积神经网络是一种专门用于处理具有网格结构数据的深度学习模型。与传统的全连接神经网络不同,CNN 通过卷积层和池化层对输入数据进行特征提取,有效地减少参数数量并保留重要信息,从而使得它在图像处理任务上表现出色。卷积层(Convolutional Layer):用于提取输入数据的特征,通过卷积操作检测局部的模式。池化层(Pooling Layer):用于下采样数据,减少特征图的大小,降低计算复杂度。全连接层(Fully Connected Layer):将提取到的特征映射到输出空间,进行最终分类。

若北辰 2361

PyTorch中的CNN网络构建与训练实战指南

CNN是一种深度学习架构,特别适用于处理具有网格拓扑结构的数据,如图像。它通过一系列的卷积层、激活函数、池化层等组件,逐步抽象出数据的特征表示。其中,卷积层是CNN的核心,它通过卷积操作提取局部特征,从而实现图像特征的识别与学习。

weixin_42608318的博客 1041

7.2 手撕VGG11模型 & 使用Fashion_mnist数据训练VGG

与AlexNet,LeNet一样,VGG网络可以分为两部分,第一部分主要由卷积层和汇聚层组成,第二部分由全连接层组成。VGG有5个卷积块,前两个块包含一个卷积层,后三个块包含两个卷积层。2 * 1 + 3 * 2 = 8个卷积层和后面3个全连接层,所以它被称为VGG11。

分享计算机视觉,C++,网络摄像头研发,音视频开发,嵌入式等知识。 922

Spring AI Alibaba Skill 实战:定义、注册与渐进式披露的企业级落地

摘要:很多团队在接入大模型时,第一步做到的是“能对话”,第二步遇到的瓶颈却是“不能可靠执行”。Skill 的本质不是给模型多几个函数,而是把企业系统中的可控能力,以可治理、可审计、可扩展的方式交给 Agent。本文围绕 Spring AI Alibaba Skill 的定义、注册与渐进式披露,结合电商客服与售后场景,系统讲清楚其底层原理、架构设计、生产级实现、高并发治理与工程实践。@Component@Tool(description = "根据订单号查询订单状态、支付状态和物流状态")扫描包含。

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 623

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

VGG的概述,5种网络架构,VGG论文的创新点,VGG-11在Fashion-MNIST数据集上的应用示例

qq_44665283的博客 1113

HC32 CAN通信

qqa

zhaopenglihui的博客 5435

一文读懂AI大模型时代的RAG技术

RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合检索技术与生成模型的技术架构,旨在通过动态引入外部知识库增强大语言模型(LLM)的生成能力。其核心思想是通过检索系统从外部数据源(如企业知识库、实时文档等)获取相关信息,并将检索结果作为上下文输入生成模型,以提高生成答案的准确性、时效性和专业性

awei0916的专栏 2119

pytorch模型训练使用(以FashionMNIST为例)

本文采用fashion_mnist数据集进行训练,手写一个网络模型,在测试集上的准确率达到。本文实现了fashion_mnist的数据集模型搭建和测试,因为只是记录一下pytorch搭建网络的一个大体过程,所以很多地方没有进行解释和注释,有不懂的欢迎大家在评论区或私信对我提问。

sgfsfgs的博客 1531

手把手教你用STM32CubeIDE移植Vector CCP驱动,实现与INCA的标定通信(附避坑指南)

本文详细介绍了如何在STM32CubeIDE环境下移植Vector CCP驱动,实现与INCA的标定通信。从开发环境准备、CAN外设配置到CCP协议栈移植和A2L文件生成,提供了完整的操作流程和常见问题解决方案,帮助工程师快速掌握基于CAN总线的标定技术。

weixin_28685287的博客 139

CNN卷积神经网络实例(基于pytorch)

CNN卷积神经网络1.关于卷积神经网络2.卷积神经网络实例(手写字母识别)2.1 代码示例2.2 运行过程及结果2.3 测试结果3.参考与致谢 1.关于卷积神经网络 卷积神经网络(Convolutional Neural Network,CNN) 是一种具有局部连接、权重共享等特征的深层前馈神经网络。 我们先来看一下比较直观的了解一下,对卷积神经网络有个感性的认识: 我们首先先对我们输入的图片进行一次卷积,而后加入Relu激活函数,再做一次卷积,再加入Relu激活函数,而后对其处理结果进行汇聚(此处为Po

weixin_38468077的博客 2万+

C语言——利用矩阵LU分解法求逆、行列式

本章介绍了LU分解法,以及如何利用LU分解法求逆、行列式,针对每个公式、原理、代码进行了详细介绍,希望可以给大家带来帮助。

王元笙 1万+

【electron】- 从零到一:在electron-vite项目中集成better-sqlite3的工程化实践

本文详细介绍了在electron-vite项目中集成better-sqlite3数据库的完整工程化实践。针对原生模块的编译挑战,提供了从环境配置、路径规划、服务封装到IPC通信的解决方案,并重点解决了开发与生产环境的数据库路径分离及打包部署等核心问题,帮助开发者构建稳定高效的Electron桌面应用数据层。

weixin_29306571的博客 205

深度学习笔记——pytorch实现卷积神经网络CNN

B站刘二大人《pytorch深度学习实践》

weixin_45978839的博客 3749

PCL CSF布料模拟算法【2026最新版】

CSF布料模拟地面滤波算法的PCL实现,博客长期更新,本文最近更新时间为:2026年10月26日。

点云侠的博客 3918

【PyTorch实战演练】Faster R-CNN介绍以及通过预训练模型30行代码实现目标检测

Faster R-CNN介绍,并且用30行代码实现目标检测

使者大牙ℂypher的博客 6828

Codex 的 AGENTS.md 到底怎么写?前端、后端两套实战模板,照抄就能用

文件名是大写AGENTS.md,放在项目根目录构建、测试、类型检查命令都是可直接复制执行的只写了 Agent 从代码里推断不出来的约定红线规则用了明确的否定句式(禁止/不要/Never)标注了自动生成目录和禁止修改的模块写清了交付要求(改动清单 + 验证命令 + 风险说明)没有任何密钥、密码、连接串整体一页能看完,核心要点 10 条以内每一条都能通过"删掉会不会更容易犯错"的测试一份短小精准的 AGENTS.md,比一份充斥模糊规则的长文件有用得多。

篮球界最会写bug的人;程序猿中打球最菜的人。 613

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

CNN卷积神经网络简单示例(PyTorch)

CNN卷积神经网络简单示例(PyTorch)

两点点点的博客 7936

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

CNN自定义数据集训练指南_pytorch版(小白也能读懂!!!建议收藏!!!)

本文详细介绍了使用CNN(以ResNet18为例)训练自定义图像分类数据集的完整流程。从环境配置、数据集构建(6:2:2比例划分)到数据增强方法,逐步解析PyTorch实现。通过加载预训练模型、定义损失函数与优化器,完成模型训练与验证,并保存最佳权重。最后提供单图预测脚本和批量评估方案,支持结果导出至CSV文件,实现了从数据准备、模型训练到预测部署的全流程解决方案,适合初学者快速实践图像分类任务。

Albert_Roberts的博客 2783

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Pytorch入门一:卷积神经网络实现MNIST手写数字识别

1. pytorch介绍 Pytorch是Torch7团队开发的,与Torch的不同之处在于Pytorch使用了Python作为开发语言,同样说明它是一个以Python优先的深度学习框架,它不仅能够实现强大的GPU加速,同时还支持动态神经网络,这是TensorFlow等很多主流框架不支持的。而且Pytorch可以轻松扩展,近两年有赶超TensorFlow的势头 Pytorch中有两种变量类型,...

GuDoerr的博客 1万+

卷积神经网络 Convolutional Neural Network | CNN

介绍了卷积神经网络的基本思想,应用场景,优缺点,建模过程中的注意事项,研究课题,实现的类库方法和代码案例等

JasonH2021的博客 2万+

Pytorch与深度学习基础

Pytorch与深度学习基础前言Pytorch介绍导入Pytorch第一章:数据操作第一节:什么是张量?第二节:创建第一个张量第三节:张量的创建方法通过列表来创建自定义张量通过Numpy创建张量通过randn方法创建随机张量通过逻辑运算符构建二元张量一些特殊的张量创建高维张量的创建第四节:张量的属性张量的维度访问张量的属性第五节:改变张量的形状第六节:张量的运算张量之间的运算广播机制一个张量的元素求和一个张量的元素求平均值两个一维张量(向量)的内积(点积)二维张量(矩阵)的运算矩阵的转置矩阵的乘法矩阵的范数

weixin_45414514的博客 1723

【机器学习】使用卷积神经网络模型训练MNIST(含混淆矩阵)

设计了一个卷积神经网络模型训练MNIST并根据混淆矩阵对其进行测试以评估其性能和准确度。

chunyang的博客 3271
上一篇: pytorch零基础实现手写数学符号识别项目(三)——模型训练与预测
下一篇: pytorch深度学习基础(十一)——常用结构化CNN模型构建
艾醒(AiXing-w)
艾醒(AiXing-w) 2021年度博客之星AI领域top5 2021年度博客之星AI领域top5
博客等级 码龄7年 1万+粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾醒(AiXing-w)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值