【tensorflow】slim模块中fine-tune中的BatchNormalization的设置

2023-12-13 16:08

本文主要是介绍【tensorflow】slim模块中fine-tune中的BatchNormalization的设置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

tensorflow的BatchNorm 应该是tensorflow中最大的坑之一。大家遇到最多的问题就是在fine-tune的时候,加载一个预模型然后在训练时候发现效果良好,但是在测试的时候直接扑街。

这是因为batch normalization在训练过程中需要去计算整个样本的均值和方差,而在代码实现中,BN则是采取用移动平均(moving average)来求取批均值和批方差来,所以在每一个批度下来,都会对他的mean和var进行更新。所以在使用BN的时候,需要将moving_mean和moving_variance加入到tf.GraphKeys.UPDATE_OPS操作中。

此处以Inception v3的argscope为例:

    def inception_v3_arg_scope(weight_decay=0.00004,batch_norm_var_collection='moving_vars',batch_norm_decay=0.9997,batch_norm_epsilon=0.001,updates_collections=ops.GraphKeys.UPDATE_OPS,use_fused_batchnorm=True):"""Defines the default InceptionV3 arg scope.Args:weight_decay: The weight decay to use for regularizing the model.batch_norm_var_collection: The name of the collection for the batch normvariables.batch_norm_decay: Decay for batch norm moving averagebatch_norm_epsilon: Small float added to variance to avoid division by zeroupdates_collections: Collections for the update ops of the layeruse_fused_batchnorm: Enable fused batchnorm.Returns:An `arg_scope` to use for the inception v3 model."""batch_norm_params = {# Decay for the moving averages.'decay': batch_norm_decay,# epsilon to prevent 0s in variance.'epsilon': batch_norm_epsilon,# collection containing update_ops.'updates_collections': updates_collections,# Use fused batch norm if possible.'fused': use_fused_batchnorm,# collection containing the moving mean and moving variance.'variables_collections': {'beta': None,'gamma': None,'moving_mean': [batch_norm_var_collection],'moving_variance': [batch_norm_var_collection],}}# Set weight_decay for weights in Conv and FC layers.with arg_scope([layers.conv2d, layers_lib.fully_connected],weights_regularizer=regularizers.l2_regularizer(weight_decay)):with arg_scope([layers.conv2d],weights_initializer=initializers.variance_scaling_initializer(),activation_fn=nn_ops.relu,normalizer_fn=layers_lib.batch_norm,normalizer_params=batch_norm_params) as sc:return sc

可以看到moving_mean和moving_variance加入到ops.GraphKeys.UPDATE_OPS, 所以需要对这个集合进行更新

代码示例:

    opt = tf.train.AdamOptimizer(learning_rate=lr_v)update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)with tf.control_dependencies([tf.group(*update_ops)]):optimizer = opt.minimize(loss)

上面这段代码表示在求解minimize loss的时候,也需要对BN的参数进行更新。
此时,问题解决

参考:https://blog.csdn.net/qq_25737169/article/details/79616671

这篇关于【tensorflow】slim模块中fine-tune中的BatchNormalization的设置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489071

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详