zoukankan      html  css  js  c++  java
  • 深度学习原理与框架- batch_normalize(归一化操作)

    1. batch_normalize(归一化操作),公式:传统的归一化公式 (number - mean) / std, mean表示均值, std表示标准差

    而此时的公式是 scale * (num - mean) / std + beta  #scale 和 beta在计算的过程中会进行不断的更新,以使得数据可以产生多样性的分步

    即 经过一次卷积层后,进行一次归一化操作,同时进行一次激活操作

       x = conv_layer(x, [5, 5, 3, 64], 1)
       x = batch_normalize(x, is_training)
       x = tf.nn.relu(x)

    归一化操作,比如x = [32, 32, 64, 128]  第一个32表示宽,第二个32表示长,64表示通道数,128表示feature_map的个数

    使用batch_mean, batch_var = tf.nn.moments(x, [0, 1, 2]), 求出前三个通道的均值和标准差,此时的维度为(128, )

    在训练的过程中,因为每次获得的图像个数都是batch_size, 因此使用动量平均的方法,来获得平均的均值和标准差

     使用tf.Variable()构造pop_mean 和 pop_var, trainable = FALSE

    使用train_mean = tf.assign(pop_mean, pop_mean*decay + batch_mean*(1-decay))  # pop_mean表示上一次的均值,batch_mean表示当前的x的均值 

    使用train_var = tf.assign(pop_var, pop_var*decay + batch_var*(1-decay))  # pop_var表示上一次的标准差, batch_var表示当前的x的标准差

    使用with tf.control_dependecies([train_mean, train_var]):  在执行batch_normalization的时候会对train_mean 和 train_var进行操作,更新pop_mean 和 pop_var 

                   return tf.nn.batch_normalization(x,  batch_mean, batch_var, beta, scale, epsilon),  

    下面是代码:

    def batch_normalize(x, is_training, decay=0.99, epsilon=0.001):
        # 定义训练过程中的归一化操作
        def bn_train():
            # 获得前三个通道的均值和标准差
            batch_mean, batch_var = tf.nn.moments(x, axes=[0, 1, 2])
            # 均值获得动量平均的均值,即pop_mean * decay + batch_mean * (1-decay)
            train_mean = tf.assign(pop_mean, pop_mean * decay + batch_mean * (1 - decay))
            # 标准差获得动量平均的标准差,即pop_var * decay + batch_var * (1 - decay)
            train_var = tf.assign(pop_var, pop_var * decay + batch_var * (1 - decay))
            # 使用tf.control_dependencies表示在执行下一步操作前,会进行train_mean和train_var操作,进行参数的更新
            with tf.control_dependencies([train_mean, train_var]):
                # 进行归一化操作
                return tf.nn.batch_normalization(x, batch_mean, batch_var, beta, scale, epsilon)
        # 定义测试阶段的归一化操作
        def bn_inference():
            # 使用训练过程中的动量平均的平均值和标准差,作为均值和标准差的输入
            return tf.nn.batch_normalization(x, pop_mean, pop_var, beta, scale, epsilon)
        # 获得最后一个通道数,即features的个数
        dim = x.get_shape().as_list()[-1]
        # 构造beta, 即偏差, 用于与归一化后的数据进行相加操作, 在训练过程中会进行更新操作
        beta = tf.get_variable(
            name='beta',
            shape=[dim],
            dtype=tf.float32,
            initializer=tf.truncated_normal_initializer(stddev=0.0),
            trainable=True)
        # 构造scale,用于与归一化后的数据进行相乘操作,在训练过程中进行更新
        scale = tf.get_variable(
            name='scale',
            shape=[dim],
            dtype=tf.float32,
            initializer=tf.truncated_normal_initializer(stddev=0.1),
            trainable=True)
        # 用于构建动量平均的平均值
        pop_mean = tf.get_variable(
            name='pop_mean',
            shape=[dim],
            dtype=tf.float32,
            initializer=tf.constant_initializer(0.0),
            trainable=False)
        # 用于构建动量平均的标准差
        pop_var = tf.get_variable(
            name='pop_var',
            shape=[dim],
            dtype=tf.float32,
            initializer=tf.constant_initializer(1.0),
            trainable=False)
        # 如果is_training 等于 True,执行bn_train操作,否者执行bn_inference操作
        return tf.cond(is_training, bn_train, bn_inference)
  • 相关阅读:
    基于docker+reveal.js搭建一个属于自己的在线ppt网站
    Python3学习笔记
    SSL证书简介
    Centos7.4下用Docker-Compose部署WordPress(续)-服务器端用Nginx作为反向代理并添加SSL证书(阿里云免费DV证书)
    Centos7.4下用Docker-Compose部署WordPress
    Yii2+Swagger搭建RESTful风格的API项目
    CentOS 6(64-bit) + Nginx搭建静态文件服务器
    Ubuntu 14.04TLS和CentOS-6(64bit)上安装Nginx
    Ubuntu 14.04TLS Nginx搭建静态文件服务器
    Ubuntu 12.04 安装Redis并设置主从复制
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/10617885.html
Copyright © 2011-2022 走看看