【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: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

Tomcat性能参数设置

转自:http://blog.csdn.net/chinadeng/article/details/6591542 Tomcat性能参数设置 2010 - 12 - 27 Tomcat性能参数设置 博客分类: Java Linux Tomcat 网络应用 多线程 Socket 默认参数不适合生产环境使用,因此需要修改一些参数   1、修改启动时内存参数、并指定J

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

C8T6超绝模块--EXTI

C8T6超绝模块–EXTI 大纲 控制流程结构体分析EXTI实现按键 具体案例 控制流程 这里是流程框图,具体可以去看我STM32专栏的EXTI的具体分析 结构体分析 typedef struct {uint32_t EXTI_Line; // 中断/事件线EXTIMode_TypeDef EXTI_Mode; // EXTI 模式EXTITrigger_TypeDef EXTI_

1、创建多模块的maven springboot项目

现在的java的项目都是多模块的,这次也跟个风。 目标:实现下述结构 项目AcedBoot, 子模块:         aced-api 对外提供接口,         aced-web 给前端提供接口,         aced-service 服务层,         aced-dao 数据底层,包含数据库mapper和实体类entity,         aced-commo