当前位置: 首页 > news >正文

GoogleLeNet V2 V3 —— Batch Normalization

文章目录

  • Batch Normalization
    • internal covariate shift
    • 激活层的作用
    • BN执行的位置
    • 数据白化
    • 网络中的BN层
    • 训练过程
  • BN的实验效果
    • MNIST
    • 与GoogleLeNet V1比较

GoogleLeNet出来之后,Google在这个基础上又演进了几个版本,一般来说是说有4个版本,之前的那个是V1,然后有一个V2,V3和V4。
其实我个人感觉V2和V3应该是在一起的,都是综合了两篇论文中的一些改进点来的:

  • Accelerating deep network training by reducing internal covariate shift
  • Rethinking the Inception Architecture for Computer Vision

其中,第一篇是提出了一个重要的概念:Batch Normalization,是针对内部协变量偏移问题的,简单的说就是加速训练过程。把BN作为激活层之前的另外一个网络层,可以加速网络训练的收敛速度。
第二篇就提出了一些新的卷积方法等,然后总和第一篇论文一起就提出了一个inception v2的网络结构,没有明确提到v3,但是其中的一些变形作为了v3版本。
我们就来看一下这两篇论文说了点啥,这个v2和v3又改进了点啥。

Batch Normalization

internal covariate shift

讲BN之前,肯定要说说BN到底是解决一个什么问题,在论文中提到的就是internal covariate shift问题,翻译过来是内部协变量偏移。不明觉厉,这个看不太懂是什么东西。
原文中的描述为:
Training Deep Neural Networks is complicated by the fact that the distribution of each layer’s inputs changes during training, as the parameters of the previous layers change.
This slows down the training by requiring lower learning rates and careful parameter initialization, and makes it notoriously hard to train models with saturating nonlinearities. We refer to this phenomenon as internal covariate shift, and address the problem by normalizing layer inputs。
大致意思是在训练的反向传播过程中,每个输入数据的分布情况回发生变化,在计算损失的之后,这一层的输出也会发生变化,从而导致下一层的输入数据分布发生变化。这种情况就叫做内部协变量偏移。
简单点说就是网络的隐藏层数据分布变化很大,容易出现梯度消失和梯度爆炸,导致训练过程很难收敛。一个梯度一下大到天上,一下就等于0,确实很难收敛。
那么BN的基本逻辑就是针对每个训练的batch数据,在每个激活层(Sigmond或者ReLU之类)前增加一个BN层,也就是做一次数据标准化,把上一层的输出线性变化到一个固定的分布内(fixed distribution)

激活层的作用

这里增加一点,就是之前一直没太弄明白激活层的作用。看完这篇论文之后大概了解了。整个网络,中间基本都是卷积和全连接层,不管是卷积还是全连接层,都是针对前一层数据的一种线性变换。也就是前一层数据的一种多项式变化,如果中间没有激活层的话,那么实际上无论增加多少层,都可以简化成一层,因为线性变化是可以叠加的。
举个例子,如果第一层的处理是:
F ( x ) = 2 x + 3 F(x)=2x+3 F(x)=2x+3

第二层的处理是:
H ( x ) = 4 x − 4 H(x)=4x-4 H(x)=4x4
这里的x就是上一层的 F ( x ) F(x) F(x),所以就是
H ( x ) = 4 ( 2 x + 3 ) − 4 = 8 x − 8 H(x)=4(2x+3)-4=8x-8 H(x)=4(2x+3)4=8x8
那么就可以简化成一层。复杂的线性变化也是一样的。但是如果增加了激活层的话,就不一样了,激活层是非线形函数,不满足
f ( x + y ) = f ( x ) + f ( y ) f(x+y)=f(x) + f(y) f(x+y)=f(x)+f(y),所以就不存在上述的变换。
这样就可以增强模型的表达能力(reprensetation power),就是对数据分布的拟合能力。
所以基本上,在网络结构里,每个卷积层后面都会跟一个非线性层(池化或者激活)。

BN执行的位置

论文中的描述是:To Batch-Normalize a network, we specify a subset of activations and insert the BN transform for each of them。
增加在所有的激活层之前。

数据白化

论文中提到:By fixing the distribution of the layer inputs x as the training progresses, we expect to improve the training speed. It has been long known that the network training converges faster if its inputs are whitened, linearly transformed to have zero
means and unit variances, and decorrelated。
这里提到就是利用了LeCun 1998年的论文中提到的,白化(whiten)的输入数据可以加速训练。而这个白化数据就是指数据分布符合均值为0,方差为1。
白化过程为:一个d维的矢量样本( x = ( x ( 1 ) , x ( 2 ) . . . . x ( d ) ) x=(x^{(1)},x^{(2)}....x^{(d)}) x=(x(1),x(2)....x(d)))的白化过程:
x ^ ( k ) = x ( k ) − E [ x ( k ) ] V a r [ x ( k ) ] \hat{x}^{(k)}=\frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}} x^(k)=Var[x(k)] x(k)E[x(k)]
把每一维计算完成之后就形成了服从0-1分布的 x ^ \hat{x} x^向量。

网络中的BN层

在白化之后,实际上还需要做一个线性变换:
y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y^{(k)}=\gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)} y(k)=γ(k)x^(k)+β(k)
至于为什么要增加这么一个动作,论文中是说:
Note that simply normalizing each input of a layer may change what the layer can represent. For instance, normalizing the inputs of a sigmoid would constrain them to the linear regime of the nonlinearity.
我理解是直接标准化会降低网络的表达能力,可能是直接强行拉到一个0-1的分布,会造成一些损失吧。所以可以做一些拉伸和偏移(正态分布的那个图做一些拉伸和偏移),然后在学习的过程中去动态的调整这两个参数 γ \gamma γ β \beta β。也就是学习到底是拉伸多少,偏移多少能更好的拟合数据。

上面的数据白话相当于是把一个样本作了标准化,然后需要把一个训练batch的数据一起做标准化。
论文中是说:since we use mini-batches in stochastic gradient training, of the mean and variance each mini-batch produces estimates of each activation。
也就是说为每个批次也要做一个normalization。

计算方法为:

从上图可以看出来,前面三步就是对数据作了一次白化(类似),只是方向上需要理解一下。
比如输入为一张图像,图像为 p ∗ q p * q pq宽,总共有m张图像,那么这里的向量 x x x的长度就是 m m m,也就是沿着图像数的方向。总共有p✖️q个这样的向量。也就是要做p✖️q次normalization计算。

这样就完成了BN层的计算。计算之后相当于这个批次中的图像中的每个像素都是服从同一分布的,但是 γ \gamma γ β \beta β不同。

训练过程

以SGD,随机梯度下降的反向传播算法来说:
从输出层开始,计算完loss和随机梯度后,就会向后传播,那么这个BN层也是需要传播的。

通过下图,就可以计算出 γ \gamma γ β \beta β每次的更新量 Δ γ \Delta \gamma Δγ Δ β \Delta \beta Δβ

整个训练过程为:

针对每一个BN层,通过上述的计算过程进行训练。

BN的实验效果

MNIST

在手写上与最古老的LeNet比较,达到同样的精确度,训练次数大大减少。

与GoogleLeNet V1比较

针对V1做了一些改动

  • 增大学习率
  • 去掉DropOut
  • 去掉LRN
  • 重新打乱训练集
  • 减少图像的扩展

做了下面几个模型的比对

  • 基于上面改动,增加了BN层的基本模型:BN-Baseline
  • Baseline的基础上,学习率提升5倍到 0.0075:BN-x5
  • 学习率提升30倍到0.045:BN-x30
  • 激活层使用Sigmond,5倍学习率的BN-x5-Sigmond

结论是在BN-x5的情况下,达到v1版本的精确率,训练次数最少。
而BN-30可以达到更高的精度,但是训练次数要多一点。
Sigmond根本达不到这个精度,BN更适用于ReLU激活层。

相关文章:

GoogleLeNet V2 V3 —— Batch Normalization

文章目录 Batch Normalizationinternal covariate shift激活层的作用BN执行的位置数据白化网络中的BN层训练过程 BN的实验效果MNIST与GoogleLeNet V1比较 GoogleLeNet出来之后,Google在这个基础上又演进了几个版本,一般来说是说有4个版本,之前…...

Mac 系统钥匙串证书不受信任

Mac 系统钥匙串证书不受信任 解决办法 通过尝试安装 Apple PKI 的 Worldwide Developer Relations - G4 (Expiring 12/10/2030 00:00:00 UTC) 解决该异常问题 以上便是此次分享的全部内容,希望能对大家有所帮助!...

一个企业级的文件上传组件应该是什么样的

目录 1.最简单的文件上传 2.拖拽粘贴样式优化 3.断点续传秒传进度条 文件切片 计算hash 断点续传秒传(前端) 断点续传秒传(后端) 进度条 4.抽样hash和webWorker 抽样hash(md5) webWorker 时间切片 5.文件类型判断 通过文件头判断文件类型 6.异步并发数控制(重要…...

安全渗透重点内容

this是js中的一个关键字,在不同的场合使用,this的值会发生变化,下面我将详细的介绍this在函数中的各种指向。 在方法中,this表示该方法所属的对象。 如果单独使用,this表示全局对象。 在函数中,this表示全…...

【触觉智能Purple Pi OH开发板体验】开箱体验:开源主板Purple Pi RK3566 上手指北

前言 前段时间收到来自【电子发烧友】的一款开发板,名叫:PurplePi,216G售价仅249元。它使用的芯片是rk3566,适配的OpenHarmony版本为3.2 Release 是目前最便宜的OpenHarmony标准系统开源开发板,并且软硬件全部开源&am…...

flink1.16使用消费/生产kafka之DataStream

flink高级版本后&#xff0c;消费kafka数据一种是Datastream 一种之tableApi。 上官网 Kafka | Apache Flink Kafka Source 引入依赖 flink和kafka的连接器&#xff0c;里面内置了kafka-client <dependency><groupId>org.apache.flink</groupId><arti…...

【多任务编程-线程通信】

进程/线程通信的方式 某些应用程序中&#xff0c;进程/进程和线程/线程之间不可避免的进行通信&#xff0c;进行消息传递&#xff0c;数据共享等 同一进程的线程之间通信方式包括Windows中常用Event, Message等。 不同进程之间的通信可以利用Event, FileMapping(内存共享), W…...

K8S暴露pod内多个端口

K8S暴露pod内多个端口 一、背景 公司统一用的某个底包跑jar服务&#xff0c;只暴露了8080端口 二、需求 由于有些服务在启动jar服务后&#xff0c;会启动多个端口&#xff0c;除了8080端口&#xff0c;还有别的端口需要暴露&#xff0c;我这里就还需要暴露9999端口。 注&a…...

Python 列表

""" #list函数 ls list() #创建一个空列表 print(list()) print(list(str(1234)))#[1, 2, 3, 4] print(list(range(5)))#[0, 1, 2, 3, 4] print(list((1,2,3,4)))#[1, 2, 3, 4] print(list(Lift is short, you need python))#注意空格也算一个字符 #[L, i, f,…...

Rabbitmq的安装与使用(Linux版)

目录 Rabbitmq安装 1.在Ubuntu上安装RabbitMQ&#xff1a; 打开终端&#xff0c;运行以下命令以更新软件包列表&#xff1a; 安装RabbitMQ&#xff1a; 安装完成后&#xff0c;RabbitMQ服务会自动启动。你可以使用以下命令来检查RabbitMQ服务状态&#xff1a; 2.在CentOS…...

Kubernetes对象深入学习之四:对象属性编码实战

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习》系列的第四篇&#xff0c;前面咱们读源码和文档&#xff0c;从理论上学习了kubernetes的对象相关的知识&#xff…...

深度学习入门教程(2):使用预训练模型来文字生成图片TextToImageGenerationWithNetwork

本深度学习入门教程是在polyu HPCStudio 启发以及资源支持下进行的&#xff0c;在此也感谢polyu以及提供支持的老师。 本文内容&#xff1a;在GoogleColab平台上使用预训练模型来文字生成图片Text To Image Generation With Network &#xff08;1&#xff09;你会学到什么&a…...

ORA-38760: This database instance failed to turn on flashback database

早晨接一个任务&#xff0c;使用rman备份在虚拟化单机上恢复实例&#xff0c;恢复参数文件、控制文件和数据文件都正常&#xff0c;recover归档时报错如下&#xff1a; Starting recover at 2023-07-28 10:25:01 using channel ORA_DISK_1 starting media recovery media reco…...

避免低级错误:深入解析Java的ConcurrentModificationException异常

在软件开发中&#xff0c;我们常常会遇到各种错误和异常。其中有一类比较低级但又常见的错误就是ConcurrentModificationException异常。最近了我就写了个这种异常&#xff0c;这个异常通常发生在使用迭代器遍历集合时&#xff0c;同时对集合进行修改&#xff0c;从而导致迭代器…...

7.28

1.思维导图 2.qt的sever #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器类 #include<QTcpSocket> //客户端类 #include<QMessageBox> //对话框类 #include<QList> …...

java线程中的常见方法(详解)

方法简介 方法名 功能 说明 start() 启动一个新线程&#xff0c;在新的线程运行 run 方法中的代码 start 方法只是让线程进入就绪&#xff0c;里面代码不一定立刻运行&#xff08;CPU 的时间片还没分给它&#xff09;。每个线程对象的start方法只能调用一次&#xff0c;如…...

线程池参数配置

上次面试被人问到&#xff0c;如果是IO 密集型的任务&#xff0c;该如何配置合适的线程数&#xff0c;当初我说要按照IO具体的请求毫秒时间&#xff0c;来配置具体的线程数。 NthreadsNcpu*(1w/c) 公式中 W/C 为系统 阻塞率 w:等待时间 c:计算时间一般情况下&#xff0c;如果存…...

Spread for Winform 16.2.20231.0 (SP2) Crack

Spread for Winform 16.2.20231.0 (SP2)发布。此版本包含针对客户报告的问题的重要修复&#xff1a; 安装版本 16 后&#xff0c;FarPoint.Localization.dll 将丢失。 将数据绑定到 Spread 时会出现 InvalidOperationException。 通过 Spread Designer 设置的上标将不会保留。…...

Go程序结构

Go程序结构 1、名称 ​ 名称的开头是一个字母或下划线&#xff0c;且区分大小写。 实体第一个字母的大小写决定其可见性是否跨包&#xff1a; ​ 若名称以大写字母开头&#xff0c;它是导出的&#xff0c;对包外是可见和可访问的&#xff0c;可以被自己包以外的其他程序所引用…...

JAVA面试总结-Redis篇章(四)——双写一致性

JAVA面试总结-Redis篇章&#xff08;四&#xff09;——双写一致性 问&#xff1a;redis 做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;第一种情况&#xff0c;如果你的项目一致性要求高的话 采用以下逻辑我们应该先删除缓存&#xff0c;再修改数据库&…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...