浅谈pytorch中的BN层的注意事项

 更新时间:2020年06月23日 09:08:25   作者:张叫张大卫  
这篇文章主要介绍了浅谈pytorch中的BN层的注意事项,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近修改一个代码的时候,当使用网络进行推理的时候,发现每次更改测试集的batch size大小竟然会导致推理结果不同,甚至产生错误结果,后来发现在网络中定义了BN层,BN层在训练过程中,会将一个Batch的中的数据转变成正太分布,在推理过程中使用训练过程中的参数对数据进行处理,然而网络并不知道你是在训练还是测试阶段,因此,需要手动的加上,需要在测试和训练阶段使用如下函数。

model.train() or model.eval()

BN类的定义见pytorch中文参考文档

补充知识:关于pytorch中BN层(具体实现)的一些小细节

最近在做目标检测,需要把训好的模型放到嵌入式设备上跑前向,因此得把各种层的实现都用C手撸一遍,,,此为背景。

其他层没什么好说的,但是BN层这有个小坑。pytorch在打印网络参数的时候,只打出weight和bias这两个参数。咦,说好的BN层有四个参数running_mean、running_var 、gamma 、beta的呢?一开始我以为是pytorch把BN层的计算简化成weight * X + bias,但马上反应过来应该没这么简单,因为pytorch中只有可学习的参数才称为parameter。上网找了一些资料但都没有说到这么细的,毕竟大部分用户使用时只要模型能跑起来就行了,,,于是开始看BN层有哪些属性,果然发现了熟悉的running_mean和running_var,原来pytorch的BN层实现并没有不同。这里吐个槽:为啥要把gamma和beta改叫weight、bias啊,很有迷惑性的好不好,,,

扯了这么多,干脆捋一遍pytorch里BN层的具体实现过程,帮自己理清思路,也可以给大家提供参考。再吐槽一下,在网上搜“pytorch bn层”出来的全是关于这一层怎么用的、初始化时要输入哪些参数,没找到一个pytorch中BN层是怎么实现的,,,

众所周知,BN层的输出Y与输入X之间的关系是:Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta,此不赘言。其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias),训练时通过反向传播更新;而running_mean、running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。所以在训练阶段,running_mean和running_var在每次前向时更新一次;在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。

以上这篇浅谈pytorch中的BN层的注意事项就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于PyQt5制作一个猜数字小游戏

    基于PyQt5制作一个猜数字小游戏

    这篇文章主要为大家介绍了如何用Python中的PyQt5模块制作一个带GUI的猜数字小游戏,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-03-03
  •  python用matplotlib可视化绘图详解

     python用matplotlib可视化绘图详解

    这篇文章主要介绍了 python用matplotlib可视化绘图详解,Matplotlib 是一个python的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形,下面我们就来看看关于matplotlib可视化绘图的详细过程吧
    2022-01-01
  • 利用Python操作消息队列RabbitMQ的方法教程

    利用Python操作消息队列RabbitMQ的方法教程

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。下面这篇文章主要给大家介绍了关于利用Python操作消息队列RabbitMQ的方法教程,需要的朋友可以参考下。
    2017-07-07
  • 浅谈Pytorch 定义的网络结构层能否重复使用

    浅谈Pytorch 定义的网络结构层能否重复使用

    这篇文章主要介绍了Pytorch定义的网络结构层能否重复使用的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python读取pdf、word、excel、ppt、csv和txt文件提取所有文本

    Python读取pdf、word、excel、ppt、csv和txt文件提取所有文本

    这篇文章主要给大家介绍了关于Python读取pdf、word、excel、ppt、csv和txt文件提取所有文本的相关资料,文中通过代码示例将实现的方法介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • GELU激活函数算法

    GELU激活函数算法

    这篇文章主要为大家介绍了GELU激活函数算法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Python基于React-Dropzone实现上传组件的示例代码

    Python基于React-Dropzone实现上传组件的示例代码

    本文主要介绍了在React-Flask框架上开发上传组件的技巧。文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 使用Python发送邮件附件以定时备份MySQL的教程

    使用Python发送邮件附件以定时备份MySQL的教程

    这篇文章主要介绍了使用Python发送邮件附件以定时备份MySQL的教程,本文的示例基于CentOS,需要的朋友可以参考下
    2015-04-04
  • 详解Python中的正则表达式

    详解Python中的正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。本文给大家带来了python中的正则表达式,感兴趣的朋友一起看看吧
    2018-07-07
  • 详解Python下ftp上传文件linux服务器

    详解Python下ftp上传文件linux服务器

    本篇文章给大家总结了Python下ftp上传文件linux服务器的详细功能代码,有需要的朋友参考学习下。
    2018-06-06

最新评论