批归一化层-BN层(Batch Normalization)

作用及影响:

直接作用:对输入BN层的张量进行数值归一化,使其成为均值为零,方差为一的张量。
带来影响:
1.使得网络更加稳定,结果不容易受到一些超参数的影响。
2.对于深层网络,减少梯度消失或爆炸的可能。
3.使网络每一层输出结果稳定,进而加快了模型训练的速度。

算法思想:


例如:
输入x(i) = [1, 2, 3, 4, 5],平均值μ = 3(全局平均值) , 方差σ = 2(全局方差) ,计算公式x(i) = (x(i) - μ)/σ
→x(i) = [-1, -0.5, 0, 0.5, 1] (得到的是第i行x结果)
再用x(i)×W(权重)+b(偏差值)→y(i) (得到的是第i行y结果)
最后输出y

Pytorch框架中的代码实现

默认权重初始值,且不考虑偏差值b

import torch
import torch.nn as nn
import numpy as np"""
基于pytorch的网络编写
测试BN层
权重w为默认初始化
偏差值b=0
"""
x=torch.randn(2,10)
#x为随机输入。第一维是batch_size,第二维是输入维度,这个输入就相当于2个10维向量的矩阵
bn = torch.nn.BatchNorm1d(10)
#定义bn层,参数要与输入的维度一致,这个维度与batch_size是无关的
print(bn.state_dict())
print(bn(x))

自定义框架中的代码实现(受到一位兄弟的启迪)

#weight = torch.randn(bn.state_dict()["weight"].shape)
#由于默认的bn初始化weight参数都为1,所以容易看不出最后scale的作用,这里随机生成一个新的权重代替初始权重
#去掉这两行当然也应当获得一致的结果,这里相当于增加一点难度
weight = bn.state_dict()["weight"]
bn.weight = torch.nn.Parameter(weight)
#原始的初始化权重,是[1,1,1,1...],为了方便对比我们这里还是继承初始化权重,如果需要自己设置权重可参考前面3行注释
#取出参数
w = bn.state_dict()["weight"].numpy()
b = bn.state_dict()["bias"].numpy()
#将输入转成numpy数组
x = x.numpy()
#计算均值,注意是沿batch_size的维度进行均值计算
p = np.mean(x, axis=0)
#按照公式计算var
v = np.mean(np.square(x - p), axis=0)
#按照公式计算,这里e=1e-5是为了防止分母为零,查看torch源码可以找到,torch中的e也等于1e-5
x = (x - p) / np.sqrt(v + 1e-5)
#最后的scale线性运算
y = w * x + b #偏差值b=0
print(y, "自定义bn输出")

输出结果对比:


在tensor中会四舍五入保留四位小数,通过对比也可以发现结果是一样的。

Pytorch中BN层入门思想及实现相关推荐

  1. PyTorch中BN层与CONV层的融合(merge_bn)

    之前发了很久之前写好的一篇关于Caffe中merge_bn的博客,详情可见 Caffe中BN层与CONV层的融合(merge_bn) 今天由于工作需要要对PyTorch模型进行merge_bn,发现网 ...

  2. PyTorch中BN层中新加的 num_batches_tracked 有什么用?

    从PyTorch 0.4.1开始, BN层中新增加了一个参数 track_running_stats, BatchNorm2d(128, eps=1e-05, momentum=0.1, affine ...

  3. Caffe中BN层与CONV层的融合(merge_bn)

    半年前写的博客,今天发现没有发出去,还好本地有md的文档,决定重新发一下 毕竟网上来回抄袭的blog太多了,代码质量也莫得保证 今天需要用pytorch融合下bn层,写个脚本稍后再传到csdn上 原理 ...

  4. 三分钟完全了解PyTorch中卷积层内部计算方法和权值初始值的来历,让你对模型有更深层次的理解

    首先先说明第一个答案,也就是PyTorch中卷积层的计算方法,其实这点很多人可能在书上已经看过图了,我只是用代码复现一遍 我们把所有变量都明确,首先是输入变量,我们设为2 * 2的全1矩阵,如下: 然 ...

  5. Pytorch中卷积层转向全连接层时,全连接层输入维度的确定

    Pytorch中卷积层转向全连接层时,全连接层输入维度的确定 一.代码法: 改变的AlexNet网络结构: AlexNet 二.公式法: 一.代码法: 改变的AlexNet网络结构: 输入维度为 ( ...

  6. 【pytorch】BN层计算

    官方文档 有一个针对BN层的详细的理解: Pytorch的BatchNorm层使用中容易出现的问题 class torch.nn.BatchNorm2d(num_features, eps=1e-05 ...

  7. 神经网络中BN层的原理与作用

    BN层介绍 BN,全称Batch Normalization,是2015年提出的一种方法,在进行深度网络训练时,大都会采取这种算法. 原文链接:Batch Normalization: Acceler ...

  8. 网络中BN层的作用以及为什么冻结BN层

    BN层的作用主要有三个: 加快网络的训练和收敛的速度 控制梯度爆炸防止梯度消失 防止过拟合

  9. mxnet与pytorch比较 bn层

    mxnet预训练转pytorch时,如果处理不够仔细,结果就会对不上,可能下降好几个百分点. 目录 mxnet部分 pytorch部分 mxnet的BatchNorm操作源码 mxnet部分 http ...

最新文章

  1. Myeclipse 8.0 +Flash builder 4 plugin 的实现
  2. 《告别失控:软件开发团队管理必读》一一2.9 工具
  3. Android应用开发-广播和服务
  4. python的垃圾处理机制_Python语法入门之垃圾回收机制
  5. 变异函数 python_使用Python进行变异测试
  6. jquery在线预览PDF文件,打开PDF文件
  7. 剑指offer——26.树的子结构(不太熟)
  8. windows下mysql+apache+php配置
  9. android.opengl.GLSurfaceView.Renderer概述
  10. 【算法学习】【图像增强】【Retinex】White Patch Retinex 程序解读
  11. java 构造函数嵌套_java – spring – 构造函数注入和覆盖嵌套bean的父定义
  12. Atitit  发帖机实现(1)-----UsrQBm2008 页面上下文规范
  13. docker核心视频教程
  14. 公差与配合查询的相关术语
  15. mac terminal终端快速打开指定文件夹
  16. 在线合并、分解PDF;PDF格式转换
  17. 计算机RRC是什么指令,srb0 srb1 srb2的区别_srb什么意思_srb1 RRC建立请求
  18. C#将日期转化成英文
  19. 前端页面闪烁提示用户
  20. 成长经历:DIV标签设置背景色,没有显示背景色

热门文章

  1. POJ 1511 Invitation Cards——Dijkstra优先队列优化+反向建图
  2. shared_ptr简介以及常见问题
  3. 【Computer Organization】The Core Design Thinking of single cycle CPU
  4. 万字总结!springcloud分布式限流
  5. 怎么查这个文件在linux下的哪个目录
  6. clone-graph
  7. WebAPI 2参数绑定方法
  8. MFC学习中遇到的小问题和解决方案
  9. No tag datetimepicker defined in tag library imported with prefix s解决
  10. SQL2005中row_number()等函数的用法