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

目录
  • 批标准化层 tf.keras.layers.Batchnormalization()
    • 批标准化的实现过程
    • 批标准化的使用位置
  • 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).

总结

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

(0)

相关推荐

  • keras读取训练好的模型参数并把参数赋值给其它模型详解

    介绍 本博文中的代码,实现的是加载训练好的模型model_halcon_resenet.h5,并把该模型的参数赋值给两个不同的新的model. 函数式模型 官网上给出的调用一个训练好模型,并输出任意层的feature. model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output) 但是这有一个问题,就是新的model,如果输入inputs和训练好的model的inputs大小不

  • 使用keras根据层名称来初始化网络

    keras根据层名称来初始化网络 def get_model(input_shape1=[75, 75, 3], input_shape2=[1], weights=None): bn_model = 0 trainable = True # kernel_regularizer = regularizers.l2(1e-4) kernel_regularizer = None activation = 'relu' img_input = Input(shape=input_shape1) a

  • 基于Keras的扩展性使用

    Keras是一个用于在python上搭神经网络模型的框架,语法和torch比较相似.我个人认为Keras最大的特点是包装很好,一些在训练过程中要输出的方法和常用的优化函数.目标函数都已经内置了,非常适合用来写大作业.Keras和python的哲学有些相似,那就是尽量不自己造轮子. 但是最近逛知乎,看到有答案说,Keras只能用来搭一些世面上已经普及的网络,和其它框架相比比较小白.换句话说,就是Keras的扩展性不好.作为一个试用过theano.tensorflow.torch.caffe等框架,

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

    目录 批标准化层 tf.keras.layers.Batchnormalization() 批标准化的实现过程 批标准化的使用位置 tf.keras.layers.BatchNormalization使用细节 重点 总结 批标准化层 tf.keras.layers.Batchnormalization() tf.keras.layers.Batchnormalization() 重要参数: training:布尔值,指示图层应在训练模式还是在推理模式下运行. training=True:该图层将

  • 解读tf.keras.layers模块中的函数

    目录 tf.keras.layers模块中的函数 汇总tf.keras模型层layers 卷积网络相关层 总结 tf.keras.layers模块中的函数 from __future__ import print_function as _print_function import sys as _sys from . import experimental from tensorflow.python.keras.engine.base_layer import Layer from tens

  • keras.layers.Conv2D()函数参数用法及说明

    目录 tf.keras.layers.Conv2D() 函数 Conv2D (二维卷积层) 参数 tf.keras.layers.conv2D学习 总结 tf.keras.layers.Conv2D() 函数 Conv2D (二维卷积层) 这一层创建了一个卷积核,它与这一层的输入卷积以产生一个输出张量 当使用此层作为模型的第一层时,提供关键字参数 input_shape (整数元组,不包括样本轴,不需要写batch_size) def __init__(self, filters,      

  • 关于keras.layers.Conv1D的kernel_size参数使用介绍

    今天在用keras添加卷积层的时候,发现了kernel_size这个参数不知怎么理解,keras中文文档是这样描述的: kernel_size: 一个整数,或者单个整数表示的元组或列表, 指明 1D 卷积窗口的长度. 又经过多方查找,大体理解如下: 因为是添加一维卷积层Conv1D(),一维卷积一般会处理时序数据,所以,卷积核的宽度为1,而kernel_size就是卷积核的长度了,这样的意思就是这个卷积核是一个长方形的卷积核. 补充知识:tf.layers.conv1d函数解析(一维卷积) 一维

  • pytorch 图像中的数据预处理和批标准化实例

    目前数据预处理最常见的方法就是中心化和标准化. 中心化相当于修正数据的中心位置,实现方法非常简单,就是在每个特征维度上减去对应的均值,最后得到 0 均值的特征. 标准化也非常简单,在数据变成 0 均值之后,为了使得不同的特征维度有着相同的规模,可以除以标准差近似为一个标准正态分布,也可以依据最大值和最小值将其转化为 -1 ~ 1 之间 批标准化:BN 在数据预处理的时候,我们尽量输入特征不相关且满足一个标准的正态分布,这样模型的表现一般也较好.但是对于很深的网路结构,网路的非线性层会使得输出的结

  • 解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题

    错误描述: 1.保存模型:model.save_weights('./model.h5') 2.脚本重启 3.加载模型:model.load_weights('./model.h5') 4.模型报错:ValueError: You are trying to load a weight file containing 12 layers into a model with 0 layers. 问题分析: 模型创建后还没有编译,一般是在模型加载前调用model.build(input_shape)

  • 关于keras中keras.layers.merge的用法说明

    旧版本中: from keras.layers import merge merge6 = merge([layer1,layer2], mode = 'concat', concat_axis = 3) 新版本中: from keras.layers.merge import concatenate merge = concatenate([layer1, layer2], axis=3) 补充知识:keras输入数据的方法:model.fit和model.fit_generator 1.第一

  • react源码层深入刨析babel解析jsx实现

    目录 jsx v16.x及以前版本 v17及之后版本 ReactElement React.createElement ReactElement React.Component 总结 经过多年的发展,React已经更新了大版本16.17.18,本系列主要讲的是 version:17.0.2,在讲这个版本之前,我们先看一看在babel的编译下,每个大版本之下会有什么样的变化. jsx <div className='box'> <h1 className='title' style={{'

  • Django路由层URLconf作用及原理解析

    一.Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码. from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] Django 2.0版本中的路由系统已经替换成下面的写法(官方文档): from django

  • tensorflow之自定义神经网络层实例

    如下所示: import tensorflow as tf tfe = tf.contrib.eager tf.enable_eager_execution() 大多数情况下,在为机器学习模型编写代码时,您希望在比单个操作和单个变量操作更高的抽象级别上操作. 1.关于图层的一些有用操作 许多机器学习模型可以表达为相对简单的图层的组合和堆叠,TensorFlow提供了一组许多常用图层,以及您从头开始或作为组合创建自己的应用程序特定图层的简单方法.TensorFlow在tf.keras包中包含完整的

随机推荐