批标准化层 tf.keras.layers.Batchnormalization()解析

 更新时间:2023年02月21日 16:34:03   作者:壮壮不太胖^QwQ  
这篇文章主要介绍了批标准化层 tf.keras.layers.Batchnormalization(),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

批标准化层 tf.keras.layers.Batchnormalization()

tf.keras.layers.Batchnormalization()

重要参数:

  • training:布尔值,指示图层应在训练模式还是在推理模式下运行。
  • training=True:该图层将使用当前批输入的均值和方差对其输入进行标准化。
  • training=False:该层将使用在训练期间学习的移动统计数据的均值和方差来标准化其输入。

BatchNormalization 广泛用于 Keras 内置的许多高级卷积神经网络架构,比如 ResNet50、Inception V3 和 Xception。

BatchNormalization 层通常在卷积层或密集连接层之后使用。

批标准化的实现过程

  • 求每一个训练批次数据的均值
  • 求每一个训练批次数据的方差
  • 数据进行标准化
  • 训练参数γ,β
  • 输出y通过γ与β的线性变换得到原来的数值

在训练的正向传播中,不会改变当前输出,只记录下γ与β。在反向传播的时候,根据求得的γ与β通过链式求导方式,求出学习速率以至改变权值。

对于预测阶段时所使用的均值和方差,其实也是来源于训练集。比如我们在模型训练时我们就记录下每个batch下的均值和方差,待训练完毕后,我们求整个训练样本的均值和方差期望值,作为我们进行预测时进行BN的的均值和方差。

批标准化的使用位置

原始论文讲在CNN中一般应作用与非线性激活函数之前,但是,实际上放在激活函数之后效果可能会更好。

# 放在非线性激活函数之前
model.add(tf.keras.layers.Conv2D(64, (3, 3)))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Activation('relu'))

# 放在激活函数之后
model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(tf.keras.layers.BatchNormalization())

tf.keras.layers.BatchNormalization使用细节

关于keras中的BatchNormalization使用,官方文档说的足够详细。本文的目的旨在说明在BatchNormalization的使用过程中容易被忽略的细节。

在BatchNormalization的Arguments参数中有trainable属性;以及在Call arguments参数中有training。两个都是bool类型。第一次看到有两个参数的时候,我有点懵,为什么需要两个?

后来在查阅资料后发现了两者的不同作用。

1,trainable是Argument参数,类似于c++中构造函数的参数一样,是构建一个BatchNormalization层时就需要传入的,至于它的作用在下面会讲到。

2,training参数时Call argument(调用参数),是运行过程中需要传入的,用来控制模型在那个模式(train还是interfere)下运行。关于这个参数,如果使用模型调用fit()的话,是可以不给的(官方推荐是不给),因为在fit()的时候,模型会自己根据相应的阶段(是train阶段还是inference阶段)决定training值,这是由learning——phase机制实现的。

重点

关于trainable=False:如果设置trainable=False,那么这一层的BatchNormalization层就会被冻结(freeze),它的trainable weights(可训练参数)(就是gamma和beta)就不会被更新。

注意:freeze mode和inference mode是两个概念。

但是,在BatchNormalization层中,如果把某一层BatchNormalization层设置为trainable=False,那么这一层BatchNormalization层将一inference mode运行,也就是说(meaning that it will use the moving mean and the moving variance to normalize the current batch, rather than using the mean and variance of the current batch).

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python中re模块常用方法总结分析

    Python中re模块常用方法总结分析

    这篇文章主要为大家介绍了Python中re模块常用方法,并对这些常用方法进行总结分析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • 对Django项目中的ORM映射与模糊查询的使用详解

    对Django项目中的ORM映射与模糊查询的使用详解

    今天小编就为大家分享一篇对Django项目中的ORM映射与模糊查询的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python中创建表格详细过程

    Python中创建表格详细过程

    这篇文章主要介绍了Python中创建表格,在python中使用tabulate库来创建表格,并针对输出形式进行不断改进来美化输出效果,并给出了代码示例。需要的小伙伴可以参考一下
    2022-02-02
  • Python多线程thread及模块使用实例

    Python多线程thread及模块使用实例

    这篇文章主要介绍了Python多线程thread及模块使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用fiddler抓包工具Python requests报错:ValueError: check_hostname requires server_hostname的解决

    使用fiddler抓包工具Python requests报错:ValueError: check_h

    这篇文章主要介绍了使用fiddler抓包工具Python requests报错:ValueError: check_hostname requires server_hostname的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 如何使用Cython对python代码进行加密

    如何使用Cython对python代码进行加密

    这篇文章主要介绍了如何使用Cython对python代码进行加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 解决matplotlib库show()方法不显示图片的问题

    解决matplotlib库show()方法不显示图片的问题

    今天小编就为大家分享一篇解决matplotlib库show()方法不显示图片的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算

    基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算

    这篇文章主要介绍了基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python 对Excel求和、合并居中的操作

    Python 对Excel求和、合并居中的操作

    这篇文章主要介绍了Python 对Excel求和、合并居中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 在pandas多重索引multiIndex中选定指定索引的行方法

    在pandas多重索引multiIndex中选定指定索引的行方法

    今天小编就为大家分享一篇在pandas多重索引multiIndex中选定指定索引的行方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11

最新评论