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_norm

batch_norm

Layer Normalization和Batch Normalization的更多相关文章

  1. 深度学习之Batch Normalization

    在机器学习领域中,有一个重要的假设:独立同分布假设,也就是假设训练数据和测试数据是满足相同分布的,否则在训练集上学习到的模型在测试集上的表现会比较差.而在深层神经网络的训练中,当中间神经层的前一层参数 ...

  2. tensorflow中使用Batch Normalization

    在深度学习中为了提高训练速度,经常会使用一些正正则化方法,如L2.dropout,后来Sergey Ioffe 等人提出Batch Normalization方法,可以防止数据分布的变化,影响神经网络 ...

  3. 深度学习基础系列(七)| Batch Normalization

    Batch Normalization(批量标准化,简称BN)是近些年来深度学习优化中一个重要的手段.BN能带来如下优点: 加速训练过程: 可以使用较大的学习率: 允许在深层网络中使用sigmoid这 ...

  4. 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 ...

  5. 解开Batch Normalization的神秘面纱

    停更博客好长一段时间了,其实并不是没写了,而是转而做笔记了,但是发现做笔记其实印象无法更深刻,因此决定继续以写博客来记录或者复习巩固所学的知识,与此同时跟大家分享下自己对深度学习或者机器学习相关的知识 ...

  6. 激活函数,Batch Normalization和Dropout

    神经网络中还有一些激活函数,池化函数,正则化和归一化函数等.需要详细看看,啃一啃吧.. 1. 激活函数 1.1 激活函数作用 在生物的神经传导中,神经元接受多个神经的输入电位,当电位超过一定值时,该神 ...

  7. Batch Normalization、Layer Normalization、Instance Normalization、Group Normalization、Switchable Normalization比较

    深度神经网络难训练一个重要的原因就是深度神经网络涉及很多层的叠加,每一层的参数变化都会导致下一层输入数据分布的变化,随着层数的增加,高层输入数据分布变化会非常剧烈,这就使得高层需要不断适应低层的参数更 ...

  8. Batch Normalization和Layer Normalization

    Batch Normalization:对一个mini batch的样本,经过一个nueron(或filter)后生成的feature map中的所有point进行归一化.(纵向归一化) Layer ...

  9. 从Bayesian角度浅析Batch Normalization

    前置阅读:http://blog.csdn.net/happynear/article/details/44238541——Batch Norm阅读笔记与实现 前置阅读:http://www.zhih ...

随机推荐

  1. 深入HTTP协议

    一.HTTP定义 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. HTTP是一个属于应用层的面向对象协议,由于其简捷.快速的方式, ...

  2. vue Element验证input提示

    <el-form-item prop="userName" class="userName_color"> <b>详细地址<i c ...

  3. 基于nodejs中实现跨域的方法

    一般情况下跨域是通过ajax的方式请求数据,通过js在不同的域之间进行数据传输或者通信: 只有通过ajax方式获取请求的时候才会有跨域问题需要解决: 例如在本地模拟两个服务端. 一个服务端去通过aja ...

  4. DC-1 靶机渗透

    DC-1 靶机渗透 *概况*: 下载地址 https://www.vulnhub.com/entry/dc-1,292/ *官方描述:* DC-1 is a purposely built vulne ...

  5. window升级Nginx1.10到1.12.2

    window升级Nginx较为简单,只需要修改配置文件,然后启动即可. 环境:window系统 服务器:10.123.98.92 Nginx目录:e:\hgeagle\nginx-1.10.1 旧版N ...

  6. 解决pycharm的爬虫乱码问题(初步了解各种编码格式)

    Ascii码(American Standard Code for Information Interchange,美国信息互换标准代码):最初计算机只在美国使用时,只用8位的字节来组合出256(2的 ...

  7. JetBrains Rider C# 学习①

    Rider 发现 Alt+F7 键无效: 把GeForce Experience里的游戏覆盖关闭 前言 C#从入门到精通 链接:https://pan.baidu.com/s/1UveJI_f-c5D ...

  8. JavaWeb学习day4-Maven&IDEA中的使用

    1.创建本地仓库 ,因为使用apache官方的下载方式需要挂梯,下载速度慢且容易出错,可以配置阿里的下载路径,同时配置如下图的仓库路径 2.创建原型项目 3.等待jar包下载导入完成,出现下图即代表成 ...

  9. Dom基础(一):attribute和properrty的区别

    properrty:修改对象属性不会体现到html结构中,针对DOM节点自带属性(id,className,style) attribute:修改html属性,会改变html结构,大多可以添加自定义属 ...

  10. 论文解读(SUBG-CON)《Sub-graph Contrast for Scalable Self-Supervised Graph Representation Learning》

    论文信息 论文标题:Sub-graph Contrast for Scalable Self-Supervised Graph Representation Learning论文作者:Yizhu Ji ...