GoogLeNet的不同版本

  • GoogLeNet 致敬 LeNet

GoogLeNet V1

  • Inception块,增加网络宽度,在卷积操作时可以提取不同尺度特征
  • 利用1×1卷积进行降维,减少参数量
  • 参数量计算:上一层通道数 × 卷积层的长度^2 × 下一层通道数
  • 采用模块化结构Stage
  • 最后进行全局平均池化average pooling能让输入图像大小不用固定
  • 辅助分类器,为训练提供更多梯度信息
  • 将网络模块化三个阶段,每个阶段内部feature map不变,结束后下降样到下个stage,这种模式在后面经常出现,如:resnet,mobilenet,shufflenet等

GoogLeNet V2

  • BatchNormalization(BN):数据归一化,对每个训练的mini-batch做归一化
    • BN使得模型可以使用较大的学习率而不用特别关心诸如梯度爆炸或消失等优化问题;
    • 降低了模型效果对初始权重的依赖;
    • 可以加速收敛,一定程度上可以不使用Dropout这种降低收敛速度的方法,但却起到了正则化作用,提高了模型泛化性;
    • 即使不使用ReLU也能缓解激活函数饱和问题;
    • 能够学习到从当前层到下一层的分布缩放(scaling(方差),shift(期望))系数
  • 问题
    • 网络训练过程中不止学习本层数据,而且要适应上层的分布,这里相当于规定了同一的输入格式,减少适应上层分布的过程。
  • 解决方法:将输入值减均值除上方差,z值化。

GoogLeNet V3

  • 贡献:
    • 提出通用的网络结构设计准则
    • 引入卷积分解提高效率(空间可分离卷积)
    • 引入高效的feature map降维
    • 平滑样本标注
  • 准则:
    • 避免特征表示上的瓶颈,尤其在神经网络的前若干层。(慎用)
      • 如果在网络的浅层35×35×320被降维到17×17×320,会丢失大量信息,后面不可逆。所以对feature map进行降维的同时会对channel进行升维。
    • 特征的数目越多收敛越快(不怎么流行)
      • 增加1×3和3×1激活输出,产生相互解耦的特征表示。
    • 合理压缩特征维度数(通道数),来减少计算量
      • 用1×1的卷积先降维,再特征提取,相邻通道信息比较像
    • 网络的深度和宽度需要等比例的放大和缩小
      • 没有具体给出指导,后期EfficientNet(V1,V2)才填了这个坑
    • “优化”辅助分类器
      • 去掉了
    • 优化池化操作
      • 并行做卷积和池化,然后再合并
    • 优化标签
      • 将one hot标签平滑一点
      • (1-label_smoothing)*one_hot_labels+label_smoothing/num_classes
      • label_smothing = 0.1
      • num_classes = 1000

GoogLeNet V4(不流行,太复杂而且没意义)

  • 以结果为导向,网络解释性不强。
  • 但是融合了残差网络
  • 缺点:人为赋予了模型大量的先验知识

GoogLeNet V5(很简单)

  • Xception
  1. 1×1卷积核在通道维度上进行相乘求和,3*3卷积核在空间维度上做信息处理
  2. 普通卷积同时在通道和空间上进行处理,普通的卷积核是三维的
  3. 先做通道上处理,后做空间上处理
  4. 解耦精度更高,计算量更小
    补充:
  • 如果训练的网络结果不好,不一定是网络结构不好,有可能是超参数不好。如梯度弥散
  • 模型自己学习到的知识比人为赋予的归纳偏置上限更高
  • 古人诚不欺我:大道至简

GoogLeNetV5论文名称:Xception: Deep learning with depthwise separable convolutions
GoogLeNetV5论文下载链接:
https://openaccess.thecvf.com/content_cvpr_2017/papers/Chollet_Xception_Deep_Learning_CVPR_2017_paper.pdf

Xception代码

import torch.nn as nnclass SeperableConv2d(nn.Module): def __init__(self, input_channels, output_channels, kernel_size, **kwargs):super().__init__()self.depthwise = nn.Conv2d(input_channels,input_channels,kernel_size,groups=input_channels,bias=False,**kwargs)self.pointwise = nn.Conv2d(input_channels, output_channels, 1, bias=False)def forward(self, x):x = self.depthwise(x)x = self.pointwise(x)return xclass EntryFlow(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Sequential(nn.Conv2d(3, 32, 3, padding=1, bias=False,stride=2),nn.BatchNorm2d(32),nn.ReLU(inplace=True))self.conv2 = nn.Sequential(nn.Conv2d(32, 64, 3, padding=1, bias=False),nn.BatchNorm2d(64),nn.ReLU(inplace=True))self.conv3_residual = nn.Sequential(SeperableConv2d(64, 128, 3, padding=1),nn.BatchNorm2d(128),nn.ReLU(inplace=True),SeperableConv2d(128, 128, 3, padding=1),nn.BatchNorm2d(128),nn.MaxPool2d(3, stride=2, padding=1),)self.conv3_shortcut = nn.Sequential(nn.Conv2d(64, 128, 1, stride=2),nn.BatchNorm2d(128),)self.conv4_residual = nn.Sequential(nn.ReLU(inplace=True),SeperableConv2d(128, 256, 3, padding=1),nn.BatchNorm2d(256),nn.ReLU(inplace=True),SeperableConv2d(256, 256, 3, padding=1),nn.BatchNorm2d(256),nn.MaxPool2d(3, stride=2, padding=1))self.conv4_shortcut = nn.Sequential(nn.Conv2d(128, 256, 1, stride=2),nn.BatchNorm2d(256),)#no downsamplingself.conv5_residual = nn.Sequential(nn.ReLU(inplace=True),SeperableConv2d(256, 728, 3, padding=1),nn.BatchNorm2d(728),nn.ReLU(inplace=True),SeperableConv2d(728, 728, 3, padding=1),nn.BatchNorm2d(728),nn.MaxPool2d(3, 1, padding=1))#no downsamplingself.conv5_shortcut = nn.Sequential(nn.Conv2d(256, 728, 1),nn.BatchNorm2d(728))def forward(self, x):x = self.conv1(x)x = self.conv2(x)residual = self.conv3_residual(x)shortcut = self.conv3_shortcut(x)x = residual + shortcutresidual = self.conv4_residual(x)shortcut = self.conv4_shortcut(x)x = residual + shortcutresidual = self.conv5_residual(x)shortcut = self.conv5_shortcut(x)x = residual + shortcutreturn xclass MiddleFLowBlock(nn.Module):def __init__(self):super().__init__()self.shortcut = nn.Sequential()self.conv1 = nn.Sequential(nn.ReLU(inplace=True),SeperableConv2d(728, 728, 3, padding=1),nn.BatchNorm2d(728))self.conv2 = nn.Sequential(nn.ReLU(inplace=True),SeperableConv2d(728, 728, 3, padding=1),nn.BatchNorm2d(728))self.conv3 = nn.Sequential(nn.ReLU(inplace=True),SeperableConv2d(728, 728, 3, padding=1),nn.BatchNorm2d(728))def forward(self, x):residual = self.conv1(x)residual = self.conv2(residual)residual = self.conv3(residual)shortcut = self.shortcut(x)return shortcut + residualclass MiddleFlow(nn.Module):def __init__(self, block):super().__init__() self.middel_block = self._make_flow(block, 8)def forward(self, x):x = self.middel_block(x)return xdef _make_flow(self, block, times):flows = []for i in range(times):flows.append(block())return nn.Sequential(*flows)class ExitFLow(nn.Module):def __init__(self):super().__init__()self.residual = nn.Sequential(nn.ReLU(),SeperableConv2d(728, 728, 3, padding=1),nn.BatchNorm2d(728),nn.ReLU(),SeperableConv2d(728, 1024, 3, padding=1),nn.BatchNorm2d(1024),nn.MaxPool2d(3, stride=2, padding=1))self.shortcut = nn.Sequential(nn.Conv2d(728, 1024, 1, stride=2),nn.BatchNorm2d(1024))self.conv = nn.Sequential(SeperableConv2d(1024, 1536, 3, padding=1),nn.BatchNorm2d(1536),nn.ReLU(inplace=True),SeperableConv2d(1536, 2048, 3, padding=1),nn.BatchNorm2d(2048),nn.ReLU(inplace=True))self.avgpool = nn.AdaptiveAvgPool2d((1, 1))def forward(self, x):shortcut = self.shortcut(x)residual = self.residual(x)output = shortcut + residualoutput = self.conv(output)output = self.avgpool(output)return outputclass Xception(nn.Module):def __init__(self, block, num_classes=100):super().__init__()self.entry_flow = EntryFlow()self.middel_flow = MiddleFlow(block)self.exit_flow = ExitFLow()self.fc = nn.Linear(2048, num_classes)def forward(self, x):x = self.entry_flow(x)x = self.middel_flow(x)x = self.exit_flow(x)x = x.view(x.size(0), -1)x = self.fc(x)return xdef xception(num_classes):return Xception(MiddleFLowBlock, num_classes=num_classes)

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

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

相关文章

从文心大模型4.0与FuncGPT:用AI为开发者打开新视界

今天,在百度2023世界大会上,文心大模型4.0正式发布,而在大洋的彼岸,因为大模型代表ChatGPT之类的AI编码工具来势汹汹,作为全世界每个开发者最爱的代码辅助网站,Stack Overflow的CEO Prashanth Chandrasekar…

3、Kafka Broker

4.1 Kafka Broker 工作流程 4.1.1 Zookeeper 存储的 Kafka 信息 (1)启动 Zookeeper 客户端。 [hadoop102 zookeeper-3.5.7]$ bin/zkCli.sh(2)通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2] ls /kaf…

Three.js + Tensorflow.js 构建实时人脸点云

本文重点介绍使用 Three.js 和 Tensorflow.js 实现实时人脸网格点云所需的步骤。 它假设你之前了解异步 javascript 和 Three.js 基础知识,因此不会涵盖基础知识。 该项目的源代码可以在此 Git 存储库中找到。 在阅读本文时查看该代码将会很有帮助,因为…

【实战】学习 Electron:构建跨平台桌面应用

文章目录 一、Electron 简介二、Electron 的优势1. 学习曲线平缓2. 丰富的生态系统3. 跨平台支持4. 开源和社区支持 三、Electron 的使用1. 安装 Node.js2. 安装 Electron3. 创建项目4. 初始化项目5. 安装依赖6. 创建主进程文件7. 创建渲染进程文件8. 打包应用程序9. 运行应用程…

【debug】安装diffusion的bug解决合集

环境问题 ImportError: cannot import name ‘CLIPImageProcessor’ from ‘transformers’ (D:\Python\lib\site-packages\transformers_init_.py) https://github.com/huggingface/transformers/issues/23340 解决:查看更详细信息,安装环境 transfor…

@Scheduled定时器

Scheduled定时器 一、基本使用二、参数说明fixedDelayfixedRateinitialDelaycron 三、cron 表达式参数说明实用性的案例 四、Scheduled注意事项五、配置文件1、fixedDelay2、fixedRate3、cron 一、基本使用 Scheduled // 由Spring定义,用于将方法设置为调度任务。…

在 Ubuntu 22.04安装配置 Ansible

一、按官网指引安装 我使用的ubuntu22.04版本,使用apt安装。官网指引如下: $ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible 由于内部网络…

36 机器学习(四):异常值检测|线性回归|逻辑回归|聚类算法|集成学习

文章目录 异常值检测箱线图z-score 保存模型 与 使用模型回归的性能评估线性回归正规方程的线性回归梯度下降的线性回归原理介绍L1 和 L2 正则化的介绍api介绍------LinearRegressionapi介绍------SGDRegressor 岭回归 和 Lasso 回归 逻辑回归基本使用原理介绍正向原理介绍损失…

Elasticsearch集群搭建与相关知识点整理

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章参考网上的课程,介绍Elasticsearch集群的搭建,以及Elasticsearch集群相关知识点整理。 如果文章有什么需要改进的地方还请大佬不吝赐教&am…

Git Cherry Pick的使用

cherry-pick命令的基本用法 cherry-pick命令的基本语法如下&#xff1a; git cherry-pick <commit>其中&#xff0c;<commit>是要应用的提交的哈希值或分支名。该命令会将指定的提交应用到当前分支上&#xff0c;并创建一个新的提交。 使用场景 cherry-pick命令…

【JavaEE】JUC 常见的类 -- 多线程篇(8)

JUC 常见的类 1. Callable 接口2. ReentrantLock3. 原子类4. 线程池5. 信号量 Semaphore6. CountDownLatch 1. Callable 接口 Callable Interface 也是一种创建线程的方式 Runnable 能表示一个任务 (run方法) – 返回 voidCallable 也能表示一个任务(call方法) 返回一个具体的…

LabVIEW中的数据通信方法

LabVIEW中的数据通信方法 LabVIEW中包含多种数据通信方法&#xff0c;不同的方法适用于不同的场景。应该先了解概述&#xff0c;确保在应用程序中使用正确的数据通信方法。 数据通信类型&#xff1a; 数据流元素 缓冲接口 变量接口 应用场景&#xff1a; 在多数程序框图对…

ArcGIS笔记11_提取栅格中的数据到点要素

本文目录 前言Step 1 准备好点要素和栅格文件Step 2 多值提取到点 前言 很多时候需要将栅格中的数据提取到点要素&#xff0c;让点获取到栅格文件对应坐标所包含的数据&#xff0c;本博文主要介绍这个操作。 Step 1 准备好点要素和栅格文件 如下图所示&#xff1a; Step 2 多…

基于MATLAB的图像条形码识别系统(matlab毕毕业设计2)

摘要 &#xff1a; 本论文旨在介绍一种基于MATLAB的图像条形码识别系统。该系统利用计算机视觉技术和图像处理算法&#xff0c;实现对不同类型的条形码进行准确识别。本文将详细介绍系统学习的流程&#xff0c;并提供详细教案&#xff0c;以帮助读者理解和实施该系统。 引言…

记一次Postgresql从堆叠注入到RCE

本次研究过程来自一次某cms的代码审计实战&#xff0c;整个环境部署的相对较好&#xff0c;postgresql、web权限都有单独的用户管理&#xff0c;web目录不可写、服务器不能出网等限制。不过比较幸运的是所有的数据操作都是用同一个superuser权限的postgresql用户来执行的。 限…

02HTML功能元素

1.功能元素 1.1.列表标签 ​ 列表标签的作用: 给一堆数据添加列表语义, 也就是告诉搜索引擎告诉浏览器这一堆数据是一个整体 - HTML中列表标签的分类 ​ 无序列表(最多)(unordered list) ​ 有序列表(最少)(ordered list) ​ 定义列表(其次)(definition list) 1.1.1.无序列…

notepad++ 批量替换删除指定字符之后 或者 之前的字符,Notepad+批量替换使用大全

notepad 批量替换删除指定字符之后 或者 之前的字符&#xff0c;Notepad批量替换使用大全 资源宝分享&#xff1a;www.httple.net 注意: 不支持多行表达式 (involving \n, \r, etc). 1 基本表达式 符号解释.匹配任意字符&#xff0c;除了新一行(\n)。也就是说 “.”可以匹配 \…

uniapp map地图实现marker聚合点,并点击marker触发事件

1.uniapp官方文档说明 2.关键代码片段 // 仅调用初始化&#xff0c;才会触发 on.("markerClusterCreate", (e) > {})this._mapContext.initMarkerCluster({enableDefaultStyle: false, // 是否使用默认样式zoomOnClick: true, // 点击聚合的点&#xff0c;是否…

经典算法试题(二)

文章目录 一、岁数1、题目2、思路讲解3、代码实现4、结果 二、打碎的鸡蛋1、题目2、思路讲解3、代码实现4、结果 三、分糖1、题目2、思路讲解3、代码实现4、结果 四、兔子产子1、题目2、思路讲解3、代码实现4、结果 五、矩阵问题1、题目2、思路讲解3、代码实现4、结果 六、谁是…

计网----数据包在传输中的变化过程,单播组播和广播,ARP协议,ARP代理,免费ARP,DNS协议,路由数据转发过程

计网----数据包在传输中的变化过程&#xff0c;单播组播和广播&#xff0c;ARP协议&#xff0c;ARP代理&#xff0c;免费ARP&#xff0c;DNS协议&#xff0c;路由数据转发过程 一.数据包在传输中的变化过程&#xff08;在同一个路由器下&#xff09; 1.传输数据时&#xff0c…