Pytorch实战四 基于 VGG net 搭建一个串联的神经网络结构

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、VGG类的搭建
    • 1.源码
    • 2.初始化类
      • 2.1 初始化函数
      • 2.2 前向传播函数 forward(self,x)
  • 二、卷积补充
    • 卷积


前言

  对于标准的 VGG net 输入图像的尺寸是 24 x 24,进行 32 维的下采样之后得到一个 7 x 7 的特征图,然后用 FC 层完成分类。在这里我们要对数据进行增强,然后 resize 到 28 * 28 的尺寸。如果直接使用 VGG net 没有办法直接进行 32 x 32 下采样的。,下面我们来搭建这个串联的网络结构。


一、VGG类的搭建

1.源码

import torch
import torch.nn.functional as F # 使用这个库进行softmax
import torch.nn as nn    # 使用这个库进行卷积# 定义类
class VggBase(nn.Module):def __init__(self):# 第一步初始化函数super(VggBase, self).__init__()# 定义一些列算子,每次经过一个pooling层卷积加倍# 第一个卷积采用序列, 输入的数据 3 x 28 x 28 ,crop 之后self.conv1 = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3,padding=1),nn.BatchNorm2d(64), # 输出的通道nn.ReLU())self.max_pooling1 = nn.MaxPool2d(kernel_size=2, stride=2) # 下采样减半# 第一个卷积采用序列之后, 输出的数据 14*14*64self.conv2_1 = nn.Sequential(nn.Conv2d(64, 128, kernel_size=3,padding=1),nn.BatchNorm2d(128), # 输出的通道nn.ReLU())# 目前卷积14*14*128self.conv2_2 = nn.Sequential(nn.Conv2d(128, 128, kernel_size=3,padding=1),nn.BatchNorm2d(128), # 输出的通道nn.ReLU())self.max_pooling2= nn.MaxPool2d(kernel_size=2, stride=2)# 输出 7*7*128self.conv3_1 = nn.Sequential(nn.Conv2d(128, 256, kernel_size=3,padding=1),nn.BatchNorm2d(256), # 输出的通道nn.ReLU())# 目前卷积7*7*256self.conv3_2 = nn.Sequential(nn.Conv2d(256, 256, kernel_size=3,padding=1),nn.BatchNorm2d(256), # 输出的通道nn.ReLU())# 由于图片7*7奇数,需要padding = 1,防止损失self.max_pooling3= nn.MaxPool2d(kernel_size=2, stride=2,padding=1)# 输出4*4*256self.conv4_1 = nn.Sequential(nn.Conv2d(256, 512, kernel_size=3,padding=1),nn.BatchNorm2d(512), # 输出的通道nn.ReLU())# 目前卷积4*4*512self.conv4_2 = nn.Sequential(nn.Conv2d(512, 512, kernel_size=3,padding=1),nn.BatchNorm2d(512), # 输出的通道nn.ReLU())self.max_pooling4= nn.MaxPool2d(kernel_size=2, stride=2)#全连接层,目前的数据 batch * 4 * 4 * 512 我们要变成--> batch * (4 * 512)self.fc1 = nn.Linear(4*512,10) # 第一个输入参数的个数是 maxpooling之后特征图的大小 512*2*2# 输出 2*2*512def forward(self,x):# st1取出batch_size,就是x的第0维batch_size = x.size(0)#st2 定义输出,取第一个卷积out = self.conv1(x)out = self.max_pooling1(out)out = self.conv2_1(out)out = self.conv2_2(out)out = self.max_pooling2(out)out = self.conv3_1(out)out = self.conv3_2(out)out = self.max_pooling3(out)out = self.conv4_1(out)out = self.conv4_2(out)out = self.max_pooling4(out)# 全连接层,开始变形out = out.view(batch_size,-1) # -1 会根据具体的维度进行计算 -1 就是把 batch * 2 *2 * 512变成 batch*(4*512) 也就是batch_size * nout = self.fc1(out)  # 实际上VGG有三个fc层,输出结果 batch_size * 10out = F.log_softmax(out, dim=1)  #return outdef VGGNet():return VGGNet()

  网络的搭建不难,一个初始化类和一个前向传播函数,我觉得重点是要去理解一下形状是怎么变化的。如何控制padding和stride来变化形状,不知道的话,下面讲解将会很难听懂,去补基础吧,哈哈哈哈,点击这里,1-9集。

2.初始化类

2.1 初始化函数

重点在卷积层,定义了四个卷积层和4个池化层,卷积一次,采用序列定义卷积层。

self.conv1 = nn.Sequential(nn.Conv2d(3,64,kernel_size=3,padding=1),nn.BatchNorm2d(64), nn.ReLU())

  1. nn.Conv2d(3,64,kernel_size=3,padding=1)

    • 3代表输入通道,此处RGB通道等于3
    • 64是输出通道,也就是卷积核的数量
    • kernel_size = 3,卷积核的大小 3*3 的方阵
    • padding = 1,在图片四周补一圈0,保证卷积不改变图片尺寸,具体还得看情况。
    • 卷积的步长stride默认等于1,一般不调整。
  2. nn.BatchNorm2d(64) 归一化函数,64是一定要与卷积之后的输出通道相同。

  3. nn.ReLU() 激活函数,负数变0,正数不变。

池化层:降维,改变图片大小,不改变通道数目

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

  1. kernel_size=2 卷积核大小 2*2
  2. stride = 2, 向右移动两个步长,卷积核多大就移动几个步长。看教程一般都是2

后面无非就是重复多建立几个层,卷积和池化呗,注意,VGGNet池化之后,图片大小变少,下一次卷积时输出通道翻倍(卷积核翻倍)

2.2 前向传播函数 forward(self,x)

  前向传播就是调用前向传播函数,然后这个函数调用初始化中的操作算子,卷积池化,在卷积再池化 … 全链接层,分类或回归。顺序与初始化中的操作算子一样,只不过全连接层要处理一下。
  张量tensor(batch, C, H,W)翻译(一组图片,特征数目,图片竖高,图片横宽),第一步统计一组图片的数量,就是第 0 维。为什么分批次?6w张图片或者80w张,内存不够,我们分组传入图片训练。
  全链接层处理:

  1. out = self.fc1(out) 需要参数是(batch,n)目前是(batch,512,2,2)
  2. 张量处理:
    • 继续卷积池化:(batch,512,2,2)变成(batch,1024,1,1)由于(1,1)=1个元素,即(batch,1024)
    • out = out.view(batch_size,-1) 自动转化,最好是卷积吧。

out = self.fc1(out) 数据形成类别,形状 batch *10,每张图片在10个类别中都有数据,out = F.log_softmax(out, dim=1) 统计形成类别的概率,选择最大相似度的打印。

二、卷积补充

卷积

  大家看了基础视频,我也发表一下我的看法。卷积就是特征提取,但是特征又是什么?我们熟悉一下一张图片的输入和张量。

图 1 图片分解

图片的tensor张量=(batch, C, H,W)翻译(一组图片,特征数目,图片竖高,图片横宽) 一组图片的数量是不会改变的,改变的只有特征数目,图片的大小(最后两个维度控制),卷积的过程理解成特征提取变多,图片变小,越是细小,特征细节越多嘛。开始可以理解成只有红绿蓝这三种特征。

图 2 卷积

用一个卷积核33去和 R G B 这三张图片的33区域做内积(对应位置相乘)再相加,三张图片得到三个数,三个数再次求和得到一个元素,这就是卷积一个视野所得的新元素。然后滑动去卷积下一个元素,图片像素不够,为了防止遗漏细节还需要拓展叫做padding. padding = 1 ,在四周加一圈 0。比如这张 55 的图片,33的卷积核,图片大小只能是卷积核的倍数才能完美契合,否则需要拓展,拓展后可以比倍数多一点

在这里插入图片描述

我们进行padding = 1,四周加一圈0,变成77,多了一点无妨。卷积后的图片像素依旧是 55,如下图所示。我们卷积一般不改变图片大小,仅仅提升通道数目,特征数目。池化的时候才改变图片大小。怎么加padding呢?有一个技巧,选择卷积核中心,外扩,33 扩一圈,55 扩两圈 实际上也只有 33,发现不成倍数就 扩建一圈padding = 1, 5 * 5 的卷积核大了,完全可以使用两个33的卷积核代替,而且计算还小。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85299.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大学专业解读——计算机

我们继续,讲讲排名第二流行的新工科专业——计算机。说到计算机,可能所有人都知道,但具体到细分的专业类别,除了计算机科学,其实大多数人都是不了解的。 序: 计算机主要有如下几个专业: 计算机…

Bootstrap 5学习教程,从入门到精通, Bootstrap 5 列表组(List Group)语法知识点及案例(14)

Bootstrap 5 列表组(List Group)语法知识点及案例 一、列表组基础语法 列表组是Bootstrap中用于显示一系列内容的灵活组件&#xff0c;常用于显示菜单、导航或任何项目列表。 基本列表组结构 <ul class"list-group"><li class"list-group-item&quo…

FPGA基础 -- Verilog 命名事件

Verilog 的“命名事件&#xff08;Named Events&#xff09;”机制 进行一次系统、专业的培训。该机制在 Verilog 中是比较冷门但重要的仿真控制特性&#xff0c;主要用于 模块间同步、行为仿真触发、事件通信&#xff0c;在复杂的 Testbench、行为模型中尤为重要。 一、命名事…

《Go语言圣经》结构体

《Go语言圣经》结构体 一、结构体指针的高效应用 在处理大型结构体时&#xff0c;为避免内存复制&#xff0c;通常使用指针传递和返回结构体&#xff1a; // 通过指针传入结构体&#xff0c;避免值拷贝 func Bonus(e *Employee, percent int) int {return e.Salary * percen…

Ascend上如何进行带宽测试

1 工具安装 1.1 下载链接 https://www.hiascend.com/developer/download/community/result?moduledl%2Bcann 1.2 安装指令&#xff1a; ./Ascend-mindx-toolbox_{version}_linux-{arch}.run --install设置环境变量&#xff1a; source /usr/local/Ascend/toolbox/set_env.…

生产BUG集

磁盘达到阈值导致ES无法删除数据 method [POST], host [http://xx.xxx.xxx.xxx:9200], URI [/security_event/_delete_by_query?slices1&requests_per_second-1&ignore_unavailablefalse&expand_wildcardsopen&allow_no_indicestrue&ignore_throttledtru…

基于FastAPI与Selenium的智能开关状态管理系统实践

引言 在工业物联网&#xff08;IIoT&#xff09;与自动化控制场景中&#xff0c;设备状态的实时监控与自然语言指令执行是提升效率的关键。本文将介绍一种基于 FastAPI 和 Selenium 的智能设备状态管理系统&#xff0c;通过大语言模型&#xff08;LLM&#xff09;解析用户指令…

主体和债项均为“AAA”等级 海尔消金发行10亿金融债

6月18日&#xff0c;继年内发行ABS、落地ESG挂钩银团贷后&#xff0c;海尔消费金融&#xff08;以下简称“海尔消金”&#xff09;在金融市场上又迈出重要一步&#xff0c;成功簿记发行2025年首期规模达10亿元金融债&#xff0c;且主体信用等级仍为“AAA”。这一举措为海尔消金…

n8n:轻松自动化您的工作流

借助开源自动化利器 n8n&#xff0c;释放重复劳动的生产力&#xff01; 引言 n8n 是一款免费、开源的工作流自动化工具&#xff0c;致力于帮助开发者和团队通过连接各种应用和服务&#xff0c;实现重复任务的自动化处理。 它由 Jan Oberhauser 于 2019 年在德国柏林创建&…

Angular--Hello(TODO)

最近有个小错误&#xff0c;因为最近还是在看thingsboard&#xff0c;最近终于看到前端的代码&#xff0c;突然发现怎么全是ts的文件&#xff0c;仔细一看原来并不是之前认为的AngularJS&#xff0c;而是Angular。。。我tm真的无语了&#xff0c;又要去重新学。。。 Angular的…

在 Linux 系统中通过 yum 安装 Sublime Text

在 Linux 系统中通过 yum 安装 Sublime Text 的步骤如下&#xff1a; ​步骤 1&#xff1a;导入 GPG 公钥​ sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg 这一步用于验证软件包的合法性。 ​步骤 2&#xff1a;添加 Sublime Text 的软件仓…

面向自主多星对地观测的多智能体强化学习

大家读完觉的有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 抽象 近地轨道 &#xff08;LEO&#xff09; 卫星的指数级增长彻底改变了地球观测 &#xff08;EO&#xff09; 任务&#xff0c;解决了气候监测、灾害管理等方面的挑战。然而&#xff0c;多卫星系统…

flutter 短视频相关插件选型

​插件名称​​核心优势​​缺点​​短视频场景适用性​​推荐指数​​video_player​ (官方基础库)• 官方维护&#xff0c;跨平台兼容性最佳&#xff08;iOS/Android/macOS&#xff09; • 轻量级&#xff0c;无额外依赖&#xff0c;启动速度快 • 支持本地/网络视频、基础播…

QTableView为例:Qt模型视图委托(MVD)(Model-View-Delegate)

文章目录 1. QT中的MVD模式2. View3. Model4. Delegate5. 以TableView为例 1. QT中的MVD模式 模型视图委托&#xff08;MVD&#xff09;是Qt中特有的设计模式&#xff0c;类似MVC设计模式&#xff0c;将MVC设计模式中的Controller当做MVD中的Delegate&#xff0c;两者的概念基…

uni-app总结3-项目新建运行调试

一、新建项目 通过HbuilderX新建 在点击工具栏里的文件 -> 新建 -> 项目&#xff08;快捷键CtrlN&#xff0c;MacOS上是CMD N&#xff09;&#xff1a; 左测Tab选择uni-app类型&#xff0c;输入工程名&#xff0c;选择模板&#xff0c;Vue版本选择3&#xff0c;其他不…

LeetCode 每日一题打卡|若谷的刷题日记 4day--移动零

移动零 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1&#xff1a; 输入: nums [0,1,0,3,12] 输出: [1,3,1…

简历模板3——数据挖掘工程师5年经验

姓名 / Your Name 数据挖掘工程师 | 5年经验 | 推荐/画像/反欺诈 &#x1f4de; 138-XXXX-XXXX | ✉️ your.emailexample.com | &#x1f310; github.com/yourname | &#x1f4cd; 北京 &#x1f3af; 个人简介 / Summary 5年大厂数据挖掘工程经验&#xff0c;硕士学历&am…

Vue添加图片作为水印

直接上代码 把图片作为水印 <div class"info-warp"><div class"image-container"><img src"https://img.shetu66.com/2023/06/28/1687920981963810.png" /><div class"watermark-layer"><imgv-for"…

Conda 常用命令大全:从入门到高效使用

Conda 常用命令大全&#xff1a;从入门到高效使用 Conda 是 Python 生态中最流行的环境管理工具之一&#xff0c;它不仅可以管理 Python 包&#xff0c;还能创建隔离的虚拟环境&#xff0c;适用于数据分析、机器学习、科学计算等场景。本文将介绍 Conda 的常用命令&#xff0c…

【系统更新】TDuckX2.7升级!DSL逻辑、自定义Webhook、AI考试来袭

No.1 支持自定义 DSL 公式 逻辑规则支持自定义 DSL&#xff0c;通过公式表达式构建复杂逻辑条件&#xff0c;能够支持选项、矩阵、自增表单中的内容控制&#xff0c;可以满足多变业务场景&#xff0c;极大提升了逻辑配置的灵活性。 No.2 扩展值新增“名称字段” 在批量生成扩…