Layer Normalization和Batch Normalization
Layer Normalization
总览
- 针对同一通道数的图片的H*W进行层正则化,后面的γ和β是可以学习的参数,其中这两个的维度和最后一个的维度相同
- 例如特征图矩阵维度为[3, 577, 768], 那么γ和β的维度均为Tensor(768,)



step1:代码示例1
import torch
import torch.nn as nn
input = torch.tensor(
[
[
[
[2., 2.],
[3., 3.]
],
[
[3., 3.],
[2., 2.]
]
],
[
[
[2., 2.],
[3., 3.]
],
[
[3., 3.],
[2., 2.]
]
]
]
)
print(input)
print(input.shape) # torch.Size([2, 2, 2, 2])
layer_norm = nn.LayerNorm([2, 2, 2, 2], elementwise_affine=True)
output = layer_norm(input)
print(output)
"""
tensor([[[[-1.0000, -1.0000],
[ 1.0000, 1.0000]],
[[ 1.0000, 1.0000],
[-1.0000, -1.0000]]],
[[[-1.0000, -1.0000],
[ 1.0000, 1.0000]],
[[ 1.0000, 1.0000],
[-1.0000, -1.0000]]]], grad_fn=<NativeLayerNormBackward>)
"""
# 总结
"""
根据公式
E(x) = ((2+2+3+3)*4)/16 = 2.5
Var(x) = {(2-2.5)**2 * 8 + (3-2.5)**2 * 8} / 16 = 0.5**2
带入公式可以得到:
y = (x - E(x)) / (var(x)**0.5)
可以得到output
"""
step2更改输入观察输出
import torch
import torch.nn as nn
input = torch.tensor(
[
[
[
[3., 2.], # 这里将2 变成 3进行观察输出
[3., 3.]
],
[
[3., 3.],
[2., 2.]
]
],
[
[
[2., 2.],
[3., 3.]
],
[
[3., 3.],
[2., 2.]
]
]
]
)
print(input)
print(input.shape) # torch.Size([2, 2, 2, 2])
layer_norm = nn.LayerNorm([2, 2, 2, 2], elementwise_affine=True)
output = layer_norm(input)
print(output)
"""
tensor([[[[ 0.8819, -1.1339],
[ 0.8819, 0.8819]],
[[ 0.8819, 0.8819],
[-1.1339, -1.1339]]],
[[[-1.1339, -1.1339],
[ 0.8819, 0.8819]],
[[ 0.8819, 0.8819],
[-1.1339, -1.1339]]]], grad_fn=<NativeLayerNormBackward>)
"""
# 总结
"""
由上述的公式可得,输入变化,整个输出都进行了改变
"""
Batch Normalization
- 计算公式同上, 这里他的可学习参数与in_channel同
step1:代码示例1:
import torch
import torch.nn as nn
# With Learnable Parameters
m = nn.BatchNorm2d(2)
input = torch.tensor(
[
[
[
[2., 2.],
[3., 3.]
],
[
[3., 3.],
[2., 2.]
]
],
[
[
[2., 2.],
[3., 3.]
],
[
[3., 3.],
[2., 2.]
]
]
]
)
print(input)
print(input.shape) # torch.Size([2, 2, 2, 2])
output = m(input)
print(output)
"""
tensor([[[[-1.0000, -1.0000],
[ 1.0000, 1.0000]],
[[ 1.0000, 1.0000],
[-1.0000, -1.0000]]],
[[[-1.0000, -1.0000],
[ 1.0000, 1.0000]],
[[ 1.0000, 1.0000],
[-1.0000, -1.0000]]]], grad_fn=<NativeBatchNormBackward>)
"""
# 总结:
"""
计算的是某个批次的正则
根据公式 以第一个批次为例:
E(x) = {2+2+3+3+2+2+3+3}/8 = 2.5
Var(x) = {(2-2.5)**2 * 4 + (3-2.5)**2 * 4}/8 = 0.5**2
带入公式可以得到:
y = (x - E(x)) / (var(x)**0.5)
可以得到output
"""
进行微小更改观察变化
import torch
import torch.nn as nn
# With Learnable Parameters
m = nn.BatchNorm2d(2)
input = torch.tensor(
[
[
[
[3., 2.], # 这里2变成3来观察变化
[3., 3.]
],
[
[3., 3.],
[2., 2.]
]
],
[
[
[2., 2.],
[3., 3.]
],
[
[3., 3.],
[2., 2.]
]
]
]
)
print(input)
print(input.shape) # torch.Size([2, 2, 2, 2])
output = m(input)
print(output)
"""
tensor([[[[ 0.7746, -1.2910],
[ 0.7746, 0.7746]],
[[ 1.0000, 1.0000],
[-1.0000, -1.0000]]],
[[[-1.2910, -1.2910],
[ 0.7746, 0.7746]],
[[ 1.0000, 1.0000],
[-1.0000, -1.0000]]]], grad_fn=<NativeBatchNormBackward>)
"""
# 总结:
"""
进行微小更改观察到,发生变化的是他同一批次里面的
"""
参考
Layer Normalization和Batch Normalization的更多相关文章
- 深度学习之Batch Normalization
在机器学习领域中,有一个重要的假设:独立同分布假设,也就是假设训练数据和测试数据是满足相同分布的,否则在训练集上学习到的模型在测试集上的表现会比较差.而在深层神经网络的训练中,当中间神经层的前一层参数 ...
- tensorflow中使用Batch Normalization
在深度学习中为了提高训练速度,经常会使用一些正正则化方法,如L2.dropout,后来Sergey Ioffe 等人提出Batch Normalization方法,可以防止数据分布的变化,影响神经网络 ...
- 深度学习基础系列(七)| Batch Normalization
Batch Normalization(批量标准化,简称BN)是近些年来深度学习优化中一个重要的手段.BN能带来如下优点: 加速训练过程: 可以使用较大的学习率: 允许在深层网络中使用sigmoid这 ...
- Deep Learning 27:Batch normalization理解——读论文“Batch normalization: Accelerating deep network training by reducing internal covariate shift ”——ICML 2015
这篇经典论文,甚至可以说是2015年最牛的一篇论文,早就有很多人解读,不需要自己着摸,但是看了论文原文Batch normalization: Accelerating deep network tr ...
- 解开Batch Normalization的神秘面纱
停更博客好长一段时间了,其实并不是没写了,而是转而做笔记了,但是发现做笔记其实印象无法更深刻,因此决定继续以写博客来记录或者复习巩固所学的知识,与此同时跟大家分享下自己对深度学习或者机器学习相关的知识 ...
- 激活函数,Batch Normalization和Dropout
神经网络中还有一些激活函数,池化函数,正则化和归一化函数等.需要详细看看,啃一啃吧.. 1. 激活函数 1.1 激活函数作用 在生物的神经传导中,神经元接受多个神经的输入电位,当电位超过一定值时,该神 ...
- Batch Normalization、Layer Normalization、Instance Normalization、Group Normalization、Switchable Normalization比较
深度神经网络难训练一个重要的原因就是深度神经网络涉及很多层的叠加,每一层的参数变化都会导致下一层输入数据分布的变化,随着层数的增加,高层输入数据分布变化会非常剧烈,这就使得高层需要不断适应低层的参数更 ...
- Batch Normalization和Layer Normalization
Batch Normalization:对一个mini batch的样本,经过一个nueron(或filter)后生成的feature map中的所有point进行归一化.(纵向归一化) Layer ...
- 从Bayesian角度浅析Batch Normalization
前置阅读:http://blog.csdn.net/happynear/article/details/44238541——Batch Norm阅读笔记与实现 前置阅读:http://www.zhih ...
随机推荐
- 基于mongodb的搜索分页
mongodb模糊查询并分页 1.建立数据库 代码如下: var mongoose = require('mongoose'); var shortid = require('shortid'); v ...
- MongoDB从bson文件中恢复数据
首先需要到mangodb的安装目录的bin下面找到mongorestore.exe WIN10系统MongoDB安装目录bin文件夹下没有mongorestore.exe 先下载工具 https:/ ...
- java基础-File
File类 * File更应该叫做一个路径, 文件路径或者文件夹路径 * 路径分为绝对路径和相对路径 * 绝对路径是一个固定的路径,从盘符开始 * 相对路径相对于某个位置,在eclipse下 ...
- 使用React实现一个TodoList案例
1.效果图: 2.项目源码 3.源码 TodoList.js import React, { Component, Fragment } from 'react'; import TodoItem f ...
- 调试了一个早上, 定位了一个chrome的新问题, 新版chrome 不能有效的追踪客户来源Referer了
- vs技巧 - 调试asp.net core源码
学习asp.net core的方式除了看官方文档,看源码是也是一种很好的方式.本文介绍一种方法,简单配置vs,无需第三方插件就可以将asp.net core的源码链接自己的项目,随时穿梭于core的源 ...
- Ubuntu安装docker-compose(摘自官网,自用)
安装 Docker Compose 预计阅读时间:8分钟 加速 Docker 桌面中的新功能 Docker Desktop 可帮助您在 Mac 和 Windows 上轻松构建.共享和运行容器,就像在 ...
- 序列化之Serializer类与ModelSerializer类的使用
序列化之Serializer类的使用(5星) 作用: 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 反序列化,把客户端发送过来的数据,经过request以后变成字 ...
- js模块系统 - amd|cmd|commonjs|esm|umd
写过前端代码大概率听说过amd cmd umd commonjs esm这些名词, 想当初我第一次看到这些的时候, 人都麻了, 都是些啥啊. 后来我知道了, 这些都是js的模块规范. amd - 浏览 ...
- docker基础_数据卷
docker数据卷 为什么要使用数据卷 如果数据都在容器中,那么容器一旦删除,数据就会丢失!docker容器需要将产生的数据同步到本地.容器与容器之间也需要有一个数据共享的技术 将某些文件共享.这就是 ...