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. chrome插件one-read开发1:准备

    阅读我的博客文章:chrome插件one-read开发:准备 前言 为啥要做这个,因为我原本想用chrome做一个书签管理的东西,但是很久没有碰过chrome的插件开发了.所以先做一个简单的,来熟悉下 ...

  2. 正则、字符类Pattern、Matcher类

    字符类 * [abc] a.b 或 c(简单类)  * [^abc] 任何字符,除了 a.b 或 c(否定)  * [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)  * [0-9 ...

  3. pytest-mark 参数化

    在类前或用例前用pytest.mark.parametrize ,可进行参数化 传参方式比较灵活,有很多种,下面是列出的几种方式,其他的可自行研究 @pytest.mark.parametrize(& ...

  4. Hash-题解-方法

    有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = "nagar ...

  5. 【图像处理】Golang 获取JPG图像的宽高

    一.背景 有些业务需要判断图片的宽高,来做一些图片相关缩放,旋转等基础操作. 但是图片缩放,旋转,拼接等操作需要将图片从 JPG 格式转成 RGBA 格式操作,操作完毕后,再转回 JPG 图片. 那如 ...

  6. Python自动批量修改服务器密码

    工作中,我们经常会定期更换服务器密码,如果手动去修改,不仅费时,而且容易出错.下面提供了一种思路,可以实现批量.自动修改服务器密码. 大致思路:首先,为每一台服务器设定一个唯一标识:其次,将每台服务器 ...

  7. 7-19(排序) 寻找大富翁 (25 分)(归并排序)(C语言实现)

    7-19(排序) 寻找大富翁 (25 分) 胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁. 输入格式 ...

  8. 基于docker搭建laravel项目

    基于docker搭建laravel项目 公司PHP项目是Laravel框架写的,目前环境需要通过docker来部署一下.网上学习了一下相关知识.整理后做一个笔记.用到定时任务crontab与进程管理s ...

  9. JavaScript学习总结7-BOM

    今天学习了BOM模型,可以利用其来获得屏幕数据,网页历史,以及网页location等数据

  10. canvas基础简单易懂教程(完结,多图)

    目录 Canvas学习 一. Canvas概述 1.1 Hello world 1.2 Canvas的像素化 1.3 Canvas的动画思想 1.4 面向对象思维实现canvas动画 二.Canvas ...