PyTorch学习笔记(三)构建卷积神经网络模型

基于Pytorch的卷积神经网络CNN实例应用及详解 基于Pytorch的卷积神经网络CNN实例应用及详解 一、卷积神经网络CNN定义 卷积神经网络(CNN,有时被称为 ConvNet)是很吸引人的。在短时间内,它们变成了一种颠覆性的技术,打破了从文本、视频到语音等多个领域所有最先进的算法,远远超出了其最初在图像处理的应用范围。CNN 由许多神经网络层组成。卷积和池化这两种不同类型的层通常是交替的。网络中每个滤波器的深度从左到右增加。最后通常由一个或多个全连接的层组成。 二、卷积神经网络的原理 ... 阅读详情

Environment

  • OS: macOS Mojave
  • Python version: 3.7
  • PyTorch version: 1.4.0
  • IDE: PyCharm


0. 写在前面

使用 PyTorch 建模还是比较方便滴,大致可分为三部分

  1. 构建网络层,在 继承于 torch.nn.Module 的类对象的构造器 __init__ 方法中定义卷积、池化、线性、激活函数等;
  2. 定义前向传播,重写 forward 实例方法;
  3. 定义初始化方式,使用 torch.nn.init 中的函数。

1. 模型 Containers

PyTorch 中组装模型需要用到 Containers,包括 Module、Sequential、ModuleList、ModuleDict。Module 是所有模型的基类,此外一般看到用的是 Sequential,这儿小记一下用法。

1.1 Module 类

torch.nn.Module 为所有模型的基类

from torch.nn import Module
from torch.nn import Conv2d, ReLU, MaxPool2d, Linear


class LeNet5(Module):  # 继承
    def __init__(self, num_classes=10):
        super(LeNet5, self).__init__()
        self.conv1 = Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=2)
        self.conv2 = Conv2d(6, 16, 5)
        self.linear1 = Linear(in_features=16 * 5 * 5, out_features=120)
        self.linear2 = Linear(120, 84)
        self.linear3 = Linear(84, num_classes)
        self.relu = ReLU()
        self.maxpool = MaxPool2d(kernel_size=2)

    def forward(self, x):  # 一个 module 相当于一个运算,必须实现 forward 函数
        x = self.conv1(x)  # 1 x 28 x 28 -> 6 x 28 x 28
        x = self.relu(x)
        x = self.maxpool(x)  # 6 x 28 x 28 -> 6 x 14 x 14
        x = self.conv2(x)  # 6 x 14 x 14 -> 16 x 10 x 10
        x = self.relu(x)
        x = self.maxpool(x)  # 16 x 10 x 10 -> 16 x 5 x 5

        x = torch.flatten(x, 1)

        x = self.linear1(x)  # 400 -> 120
        x = self.relu(x)
        x = self.linear2(x)  # 120 -> 84
        x = self.relu(x)
        x = self.linear3(x)  # 84 -> num_classes

        return x


torch.nn.Module 实例对象的属性
在这里插入图片描述

1.2 Sequential 类

torch.nn.Sequential 类能够将多个网络层按顺序组装,一般向 Sequential 中传入网络层有两种格式

  1. 向 Sequential 中直接传入各网络层,实例化后以数字为索引
from torch.nn import Module, Sequential
from torch.nn import Conv2d, ReLU, MaxPool2d, Linear


class LeNet5(Module):
    def __init__(self, num_classes=10):
        super(LeNet5, self).__init__()

        self.features = Sequential(
            Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=2),
            ReLU(),
            MaxPool2d(kernel_size=2, stride=2),
            Conv2d(6, 16, 5),
            ReLU(),
            MaxPool2d(2, 2)
        )

        self.classifier = Sequential(
            Linear(in_features=16 * 5 * 5, out_features=120),
            ReLU(),
            Linear(120, 84),
            ReLU(),
            Linear(84, num_classes)
        )

    def forward(self, x):
        x = self.features(x)  # 使用了Sequential,这儿写起来就简洁一些
        x = torch.flatten(x, 1)
        x = self.classifier(x)

        return x


if __name__ == '__main__':
    lenet = LeNet5()
    print(lenet.features[3])  # 以数字为索引
# Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))

  1. 向 Sequential 中传入 OrderedDict 对象,实例化后可以自定义的名字为索引
from collections import OrderedDict
from torch.nn import Module, Sequential
from torch.nn import Conv2d, ReLU, MaxPool2d, Linear


class LeNet5(Module):
    def __init__(self, num_classes=10):
        super(LeNet5, self).__init__()

        self.features = Sequential(OrderedDict({
            'conv1': Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1, padding=2),
            'relu1': ReLU(),
            'pool1': MaxPool2d(kernel_size=2, stride=2),

            'conv2': Conv2d(6, 16, 5),
            'relu2': ReLU(),
            'pool2': MaxPool2d(2, 2)
        }))

        self.classifier = Sequential(OrderedDict({
            'fc1': Linear(in_features=16 * 5 * 5, out_features=120),
            'relu1': ReLU(),
            'fc2': Linear(120, 84),
            'relu2': ReLU(),
            'fc3': Linear(84, num_classes)
        }))

    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)

        return x


if __name__ == '__main__':
    lenet = LeNet5()
    print(lenet.features.conv2)
# Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))

2. 构建 AlexNet 模型

至此,可以轻易地搞出一个经典的卷积神经网络模型 AlexNet,参考


导入需要的模块和类

import torch
from torch.nn import Module, Sequential, Conv2d, MaxPool2d, Linear, ReLU, Dropout, AdaptiveAvgPool2d

包含模型的 .py 文件常作为一个模块,定义被导入时将导入的内容

__all__ = ['AlexNet']

定义网络结构

class AlexNet(Module):

    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        self.features = Sequential(
            Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            ReLU(inplace=True),
            MaxPool2d(kernel_size=3, stride=2),
            Conv2d(64, 192, kernel_size=5, padding=2),
            ReLU(inplace=True),
            MaxPool2d(kernel_size=3, stride=2),
            Conv2d(192, 384, kernel_size=3, padding=1),
            ReLU(inplace=True),
            Conv2d(384, 256, kernel_size=3, padding=1),
            ReLU(inplace=True),
            Conv2d(256, 256, kernel_size=3, padding=1),
            ReLU(inplace=True),
            MaxPool2d(kernel_size=3, stride=2),
        )
        self.avgpool = AdaptiveAvgPool2d((6, 6))
        self.classifier = Sequential(
            Dropout(),
            Linear(256 * 6 * 6, 4096),
            ReLU(inplace=True),
            Dropout(),
            Linear(4096, 4096),
            ReLU(inplace=True),
            Linear(4096, num_classes),
        )

    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x


3. torchvision 提供的模型

torchvision.models 模块提供了一些经典的模型

  • 经典的神经网络(依时间从早到迟排序)
from torchvision.models import alexnet, vgg, googlenet, inception, resnet, densenet
  • 经典的轻量级神经网络
from torchvision.models import mobilenet, shufflenetv2, squeezenet
  • 经典的神经网络自动搜索结构
from torchvision.models import mnasnet
【Pytorch教程】:卷积神经网络 CNN Pytorch教程目录 Torch and Numpy 变量 (Variable) 激励函数 关系拟合(回归) 区分类型 (分类) 快速搭建法 批训练 加速神经网络训练 Optimizer优化器 卷积神经网络 CNN 目录Pytorch教程目录什么是卷积神经网络 CNN卷积 和 神经网络池化(pooling)流行的 CNN 结构CNN 卷积神经网络MNIST手写数据CNN模型训练可视化训练全部代码 什么是卷积神经网络 CNN 卷积 和 神经网络 卷积神经网络是如何运作的呢, 举一个识别图片的例子, 我们知 阅读详情

相关推荐

PyTorch--卷积神经网络(CNN)模型实现手写数字识别

今天要介绍的这段代码是一个使用PyTorch框架实现的卷积神经网络(CNN)模型,用于对MNIST数据集进行分类的示例。MNIST数据集是手写数字识别领域的一个标准数据集,包含0到9的灰度图像。导入必要的库:导入PyTorch、PyTorch神经网络模块、torchvision(用于处理图像数据集)和transforms(用于图像预处理)。设备配置:设置模型运行的设备,优先使用GPU(如果可用),否则使用CPU。超参数设置:定义了训练迭代的轮数(num_epochs)、类别数()、批次大小(

wumingzei的博客 3605

简单粗暴,上手修改原始神经网络模型的结构,以mobilenetv2为例

如题,想用mobilenetv2来训练自己的数据集,那肯定需要对原有的模型进细微的修改,至少需要把分类数给修改一下吧。 要想细微修改网络模型,则需要首先知道网络模型的结构,以mobilenetv2为例,简单使用如下代码: from torchvision.models import mobilenet_v2 import torch.nn as nn num_classes=100 net=mobilenet_v2().cuda() print(net) 运行上述代码,显示mobilenetv2

booklijian的专栏 4317

学习笔记:深度学习(4)——卷积神经网络(CNN)PyTorch实践篇

小白PyTorch超快上手,采用CNN做了一个手写数字识别,一个MINST手写数字预测,以及尝试了Kaggle的Spaceship Titanic案例。

Morganfs的博客 4331

深度学习pytorch代码:完整的卷积神经网络模型的搭建及训练(含注释)

import torch.optim.optimizer import torchvision # 准备数据集 from torch.utils.tensorboard import SummaryWriter from model import * from torch.utils.data import DataLoader train_data = torchvision.datasets.CIFAR10(r"C:\Users\123\Desktop\python4.7\test03\data".

weixin_44575717的博客 2662

使用Pytorch搭建CNN

文章目录卷积卷积层GPUCNN(卷积神经网络)一个简单的CNN准备数据与训练模型ResNet改变学习率SEVgg 卷积 下面的conv函数实现了对二维单通道图像的卷积.考虑输入的卷积核kernel的长宽相同,padding为对图像的四个边缘补0,stride为卷积核窗口滑动的步长. import numpy as np def convolution(img, kernel, padding=...

羊城迷鹿的博客 2万+

RenderDoc实战:5分钟搞定安卓Vulkan应用抓帧(含常见连接失败排查)

本文详细介绍了如何使用RenderDoc工具对安卓Vulkan应用进行抓帧分析,包括环境配置、完整抓帧流程及常见连接问题的解决方案。通过实战案例和高级技巧,帮助开发者快速定位渲染问题和性能瓶颈,提升移动图形开发效率。

weixin_28318011的博客 282

Mobilenet系列(3):使用pytorch搭建MobileNetV2并基于迁移学习训练

MobileNet系列(2):MobileNet-V2 网络详解

@bangbang的博客 4259

千兆以太网 PCB 设计实战:4层板 100Ω 差分对布线,EMI 降低 6dB 实测

本文详细解析了千兆以太网 PCB 设计中的关键技术与实战经验,重点介绍了4层板上100Ω差分对的优化布线方法,通过实测数据展示了EMI降低6dB的有效方案。内容涵盖层叠设计、阻抗计算、布线技巧及EMI抑制措施,为硬件工程师提供了一套完整的高速电路设计解决方案。

weixin_29175469的博客 426

ResNet浅记

对ResNe比较好奇,既简单学习并浅记一下,方便以后查阅。

梁小憨憨的博客 1220

人大金仓集群部署(主备)

4.2 上传安装包镜像和授权文件到install目录下并授权。1、复制系统脚本到/opt/kingbase目录下(主节点)4.2 修改cluster_install.sh。回车进行下一步,直到出现以下界面,回复Y键回车。三、安装kingbase客户端段(都要安装)install目录作为安装包具体存放目录。4.1 修改install.conf文件。2、复制授权文件到安装目录下(主节点)3、修改ssh参数(节点都要配置)5、安装kingbase客户端。二、基本环境配置(都要配置)6、数据库集群安装(主节点)

edutech_wang的博客 1996

干扰管理学习日志4-------信道估计方法 LS(最小二乘)、MMSE(最小均方误差)

信道估计,就是从接收数据中将假定的某个信道模型的模型参数估计出来的过程。如果信道是线性的话,那么信道估计就是对系统冲激响应进行估计。需强调的是信道估计是信道对输入信号影响的一种数学表示,而“好”的信道估计则是使得某种估计误差最小化的估计算法。本文主要讲述非盲信道估计中的LS估计和MMSE估计。LS全称为,即估计的信道参数与实际信道参数的差,进行平方求和后得到的误差累积最小。MMSE估计是LS估计的改进,在LS估计的最终结果的基础上乘以加权矩阵,使之与实际信道参数更为接近。

taiyuezyh的博客 1万+

[027] 深度学习--学习笔记(5)CNN与ResNe的理论基础

1、CNN的提出 ①硬件设备的滞后 1980年,Yann LeCun在做手写数字识别时,以全连接层的形式构建神经网络,假设这个网络有四层,那么最终会产生236K个参数量,而且每个参数都是浮点型Float,即需要236K * 4 = 944K (Byte) 的运存空间。但当时计算机(AT&T DSP)芯片才有256K (Byte)的运存空间,所以这个网络无法实现运行。 ②从生物视觉获得启发 生物视觉:人观察一个画面时,总是聚焦于局部,并从多个局部构建整个画面印象。 启发:神经网络不一定把...

yhxxhy978的博客 1379

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

syqenter的专栏 8961

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

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

weixin_38468077的博客 2万+

ASPICE标准快速掌握「总目录」

欢迎大家来到雪云飞星的《ASPICE标准快速掌握》,开始前博主先列出本专栏学习的大纲,同时这也可以作为大家学习ASPICE协议知识点的参考。本专栏可以帮助大家快速掌握如何在项目中使用ASPICE,ASPICE的学习通常仅需要半天时间左右,掌握方法后完全就可以结合快查表来指导具体项目的质量提升了。

雪云飞星的博客 3010

Unity 编辑器篇|(四)编辑器拓展GUI类 (全面总结 | 建议收藏)

GUI 类是 Unity GUI 的接口,并且具有手动定位功能。“即时模式”GUI 系统(也称为 IMGUI)是一个完全独立的功能系统,不同于 Unity 基于游戏对象的主 UI 系统。IMGUI 是一个代码驱动的 GUI 系统,主要用作程序员的工具。为了驱动该系统,需在实现脚本上调用 OnGUI 函数即时模式 GUI 系统常用于:创建游戏内调试显示和工具。为脚本组件创建自定义检视面板。创建新的编辑器窗口和工具以扩展 Unity 本身。

游戏开发小Y的博客 12万+

【Pytorch】计算机视觉项目——卷积神经网络CNN模型识别图像分类

介绍卷积神经网络CNN的可视化解释器,分步骤详解如何使用Pytorch搭建CNN模型完成图像分类任务。

WHYbeHERE的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Pytorch基于卷积神经网络的人脸表情识别(白话CNN+数据集+代码实战)

Pytorch基于卷积神经网络的人脸识别(保姆级教程:白话CNN+数据集+代码实战) 前言 提示:本篇文章主要是关于李宏毅教授授课视频中的作业进行介绍,小白博主所作工作只是将现有的知识内容结合网路上一些优秀作者的总结以博文的形式加上自己的理解复述一遍。本文主要还是我的学习总结,因为网上的一些知识分布比较零散故作整理叙述。如果有不对的地方,还请帮忙指正,如有出现禁止转载的图片,文字内容请联系我修改。   相关参考:     李宏毅2020机器学习深度学习(完整版)国语:链接: lin

qq_43815869的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

用PyTorch构建基于卷积神经网络的手写数字识别模型

MINST数据库是机器学习领域非常经典的一个数据集,其由Yann提供的手写数字数据集构成,包含了0-9共10类手写数字图片,每张图片都做了尺寸归一化,都是28x28大小的灰度图。每张图片中像素值大小在0-255之间,其中0是黑色背景,255是白色前景。

方见华 6803

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pytorch搭建CNN卷积神经网络详解

个人觉得应该先写卷积操作的常见技术和公式操作,才能对卷积输入维度(结果),输出维度(结果)有更直观的了解吧。 简单介绍一下卷积的常用trick: Padding Striding 下方是输入输出公式(本人开始也很困惑,找到对应公式后,就十分明朗了): n:原始输入的维度 | f:卷积核的大小 | p:padding的大小| s:stride的大小 no padding: n - ...

Troublemaker丶的博客 3万+

【深度学习基础】详解Pytorch搭建CNN卷积神经网络LeNet-5实现手写数字识别

本文相熟了卷积神经网络CNN的原理,并介绍了如何使用PyTorch框架搭建卷积神经网络模型CNN。实现了LeNet-5的模型的搭建、模型训练、测试、网络的复用、直观查看数据集的图片预测结果等,完成了机器学习领域的Hello world——手写数字识别。

Bossfrank的博客 1万+

PyTorch构建卷积神经网络(CNN)训练模型:分步指南

PyTorch构建卷积神经网络(CNN)训练模型:分步指南

阿旭的博客 1万+

基于pytorch使用实现CNN 如何使用pytorch构建CNN卷积神经网络

基于pytorch使用实现CNN 如何使用pytorch构建CNN卷积神经网络 本文是一个基于pytorch使用CNN在生物信息学上进行位点预测的例子 基于pytorch实现CNN,基于CNN进行位点预测,将CNN代码进行封装,可以非常简单的使用代码,基于最简单的特征提取方法。

刘文凯的博客 4630

搭建CNN卷积神经网络(用pytorch搭建)

手撕卷积神经网络—CNN 卷积:提取特征 池化:压缩特征 heigh X weigh X depth 长度 宽度。深度(也就是特征图个数) 例如输入32x32x3 hxwxc 卷积就是取某个小区域进行特征计算用此处的 特征值x权重特征 进而得到最终数据输出 filter相当于助手可以有一个 但是也可以有多个 可以定义f1 f2 f3…当然得到特征图越丰富越是我们想要的结果但是多个卷积核的容积必须是相同 否则则无法相加。 移动步长 可以大一点也可以小一点用1就可以 卷积核尺寸 可以大一点 也可以小一点 大的话

weixin_46900108的博客 9081

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

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

两点点点的博客 7936
上一篇: PyTorch学习笔记(三)参数初始化与各种Norm层
下一篇: PyTorch学习笔记(四)损失函数
longrootchen
博客等级 码龄7年 19粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值