版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/computerme/article/details/80836060

————————————————

BN在如今的CNN结果中已经普遍应用,在tensorflow中可以通过tf.layers.batch_normalization()这个op来使用BN。该op隐藏了对BN的mean var alpha beta参数的显示声明,因此在训练和部署测试中需要特征注意正确使用BN的姿势。

###正确使用BN训练

注意把tf.layers.batch_normalization(x, training=is_training,name=scope)输入参数的training=True。另外需要在来训练中添加update_ops以便在每一次训练完后及时更新BN的参数。

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops): #保证train_op在update_ops执行之后再执行。
train_op = optimizer.minimize(loss)

###正确保存带BN的模型

保存模型的时候不能只保存trainable_variables因为BN的参数不属于trainable_variables。为了方便,可以用tf.global_variables()。使用姿势如下

saver = tf.train.Saver(var_list=tf.global_variables())
savepath = saver.save(sess, 'here_is_your_personal_model_path’)

###正确读取带BN的模型

与保存类似,读的时候变量也需要为 global_variables 。如下:

saver = tf.train.Saver()
or saver = tf.train.Saver(tf.global_variables())
saver.restore(sess, 'here_is_your_personal_model_path')

PS:inference的时候还需要把tf.layers.batch_normalization(x, training=is_training,name=scope) 这里的training设为False

Reference:

https://stackoverflow.com/questions/48260394/whats-the-differences-between-tf-graphkeys-trainable-variables-and-tf-graphkeys

【转载】 tensorflow batch_normalization的正确使用姿势的更多相关文章

  1. MongoDB系列:五、MongoDB Driver使用正确的姿势连接复制集

    MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在. 使用复 ...

  2. 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)

    基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)   前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...

  3. 玩转java多线程(wait和notifyAll的正确使用姿势)

    转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...

  4. xpath轴的正确使用姿势

    网上看了许多关于轴的介绍,只介绍了语法,而没有明说具体实际中该怎么使用,百思不得其解. 背景--python中使用xpath:  ----------------------------------- ...

  5. 高版本jquery尤其是1.10.2的版本设置input radio设置值的最正确的姿势。

    $("input:radio[name="analyshowtype"]").attr("checked",false); $(" ...

  6. NSnotificationCenter 正确使用姿势, removeObject 探索

    最近在做平板的过程中,发现了一些很不规范的代码.偶然修复支付bug的时候,看到其他项目代码,使用通知的地方没有移除,我以为我这个模块的支付闪退是因为他通知没有移除的缘故.而在debug和看了具体的代码 ...

  7. 微信H5中静默登录及非静默登录的正确使用姿势

    在微信中打开网页且需要调用微信登录接口时,微信官方给我们提供了两种登录调用方式:静默登录和非静默登录:但是官方文档中却没有说明在何种情况下使用静默登录,何种情况下使用非静默登录,所以在这里,我想将之前 ...

  8. Java日志正确使用姿势

    前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中“尽情”的打印我们需要的信息了.但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的bug发生,作为一名 ...

  9. Gradle的依赖方式——Lombok在Gradle中的正确配置姿势

    写过java的都知道,lombok几乎在项目中处于不可或缺的一部分,但是lombok在Gradle的项目中配置并非人人都知道. 很多人在项目依赖中直接这样写 1 compile "org.p ...

  10. Redis的正确使用姿势

    前言 说到分布式缓存,可能大多数人脑海浮现的就是redis了,为什么redis能够在竞争激烈的缓存大战中脱颖而出呢?原因无非有一下几点:性能好,丰富的特性跟数据结构,api操作简单.但是用的人多了,就 ...

随机推荐

  1. 配置系统未能初始化。“System.Transactions.Diagnostics.DiagnosticTrace”的类型初始值设定项引发异常。

    配置系统未能初始化."System.Transactions.Diagnostics.DiagnosticTrace"的类型初始值设定项引发异常. 1.是检查当前程序的 App.c ...

  2. FreeRTOS简单内核实现2 双向链表

    FreeRTOS Kernel V10.3.1 FreeRTOS 的 list.c / list.h 文件中有 3 个数据结构.2 个初始化函数.2 个插入函数.1 个移除函数和一些宏函数,链表是 F ...

  3. mysql 判断字符串结尾

    mysql 判断字符串结尾 CREATE TABLE `tbl_str` ( `id` INT DEFAULT NULL, `Str` VARCHAR(30) DEFAULT NULL) INSERT ...

  4. json LocalDateTime转对象

    json LocalDateTime转对象 feign.codec.DecodeException: JSON parse error: Can not deserialize instance of ...

  5. 基于 .NET CORE + VUE 前后端项目打包,实现批处理安装,一键部署

    2023年7月18日 目前基于已完成了基于WPF界面的全自动部署小工具 自动判断相关.net core环境和依赖,自动部署mysql数据库,自动部署前后端web服务的功能. 有疑问的可以直接评论. - ...

  6. tampermonkey脚本 百度搜索屏蔽CSDN

    // ==UserScript==// @name         屏蔽CSDN// @namespace    http://tampermonkey.net/// @version      20 ...

  7. iOS:长图切割并转为动画gif——精灵表单sprite Sheet的转化

    iOS:长图切割并转为动画gif--精灵表单sprite Sheet的转化 通常的,iOS显示gif可以将文件转为NSData后再对其进行解析,通过CADisplayLink逐帧进行提取.播放,判断N ...

  8. QuartzNet暂停恢复会执行多次的问题解决

    ' var config = new System.Collections.Specialized.NameValueCollection { { "quartz.jobStore.misf ...

  9. 【论文阅读】RAL 2022: Receding Moving Object Segmentation in 3D LiDAR Data Using Sparse 4D Convolutions

    参考与前言 Status: Finished Type: RAL Year: 2022 论文链接:https://www.ipb.uni-bonn.de/wp-content/papercite-da ...

  10. CF1864F 题解

    写了一小时结果被卡常了(笑. 考虑新加入一个数什么时候会产生贡献,或者什么时候不会产生贡献. 发现当一个数的位置与他前一次出现时的位置所构成的区间内假若有一个比它小的数那么就不得不对这个数新进行一次操 ...