tensorflow学习(四)- batch-norm的正确用法

tensorflow正确的batch_norm用法

代码参考这个
有空再写写batch_norm的原理把

  • 设置错可能会出现的问题
  1. 不同batch_size 的测试结果不同(原因是因为,没有在batch_norm使用is_training = true,导致没有使用训练得出的参数值)
  2. 没有先更新指数加权平均, update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
  3. 总之按下面设置,感觉tensorflow的一些安排有问题
  • 主要关注的点
    with tf.name_scope("train_op"):
        # fc8_optimizer = tf.train.GradientDescentOptimizer(BASE_LR1)  不能定义太多优化器,内存会爆掉
        global_step = tf.train.create_global_step()
        learning_rate = tf.train.exponential_decay(
            PARAMS.params['model']['baseLR'],
            global_step,
            4*train_num / BATCH_SIZE,
            PARAMS.params['model']['decayLR'])

        optimizer = tf.train.AdamOptimizer(learning_rate)

        full_train_op = slim.learning.create_train_op(loss_entro_mean,
                                                      optimizer,
                                                      global_step=global_step)
        update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
        with tf.control_dependencies(update_ops):
            print("BN parameters: ", update_ops)
            updates = tf.group(*update_ops)
            full_train_op = control_flow_ops.with_dependencies([updates], full_train_op)

网络

 with slim.arg_scope([slim.conv2d, slim.fully_connected],
                        activation_fn = tf.nn.relu,
                        weights_initializer=tf.truncated_normal_initializer(stddev=0.1),
                        weights_regularizer=slim.l2_regularizer(0.00001),  # 越小惩罚项越重
                        normalizer_fn=tf.layers.batch_normalization,
                        normalizer_params={'training': is_training,
                                           'momentum': 0.95}
                        ):

注意:

  • 别用slim.batch_norm

batch_norm原理

为什么要使用batch_norm
  • 实现每一层的输入归一化
  • 改变数据分布-convariable shift
    如图所示,假设左边为训练分布,右边为测试分布,绿色为分类线。
    此时训练分布的不能用于测试,会分错。纠正错误的方法就是改变分布
    图片
  • 此外,在学习过程中,层内的z值分布可能会不断变化。使用了BN后,至少方差和均值不变,学习会更稳定,每层可以独立与其他不同的层。
batch_norm的实现
  1. batch_norm的位置
    Z = W T ∗ X Z=W^T*X Z=WTX A = g ( Z ) A=g(Z) A=g(Z)之间,也就是在激活函数的前面
  2. 实现方法:
    • 归一化:
      u = 1 m ∗ ∑ z i u=\frac 1m*\sum z^{i} u=m1zi
      σ 2 = 1 m ∑ ( z ( i ) − u ) 2 \sigma^{2}=\frac 1m\sum({z^{(i)}-u})^2 σ2=m1(z(i)u)2
      z n o r m ( i ) = z ( i ) − u σ 2 + ϵ z_{norm}^{(i)}=\frac{z^{(i)}-u}{\sqrt {\sigma^{2}+\epsilon} \quad } znorm(i)=σ2+ϵ z(i)u
    • γ \gamma γ β \beta β改变分布
      z ~ ( i ) = γ z n o r m ( i ) + β \tilde{z}^{(i)} = \gamma z_{norm}^{(i)} + \beta z~(i)=γznorm(i)+β
      其中, γ \gamma γ β \beta β为学习参数,可训练
  3. 如何在测试集中使用BN
    因为BN归一化是以mini_batch的形式处理的,但是在测试时。可能需要对每一个样本单独处理,而根据2. 的公式可以看出。单独的 σ \sigma σ u u u是没有意义的。因此在测试中可以使用训练值去估计这两个参数。
    具体实现可以用指数加权平均和去计算这两个值。
    在测试的时候就直接用训练得出的 σ \sigma σ u u u β \beta β γ \gamma γ
引用\[1\]:在TensorFlow项目中,可以使用bazelbuild来编译生成libtensorflow.so库文件。\[1\] 引用\[2\]:TensorFlow中的Tensor是指我们希望TensorFlow计算的节点,可以理解为一个多维矩阵。在TensorFlow中,占位符和变量都是Tensor的不同类型。占位符用于存储样本数据和标签,而变量是可以在计算过程中改变的值,通常用于存储模型的参数。在构建完loss函数后,我们需要创建一个会话(Session)来初始化变量并进行参数更新(如梯度下降法)。同时,TensorFlow还提供了多种数据读入的方法,包括利用占位符读入数据、使用队列建立文件到Tensor的映射以及使用Dataset API读入数据。\[2\] 引用\[3\]:在TensorFlow项目中,可以使用tf.contrib.layers.batch_norm函数来进行批量归一化操作,该函数可以对输入数据进行归一化处理,并且可以设置衰减系数、更新集合、epsilon值和是否进行缩放等参数。\[3\] 问题:关于TensorFlow项目,你还有其他问题吗? 回答:在TensorFlow项目中,可以使用bazelbuild来编译生成libtensorflow.so库文件。TensorFlow中的Tensor是指我们希望TensorFlow计算的节点,可以理解为一个多维矩阵。占位符和变量是Tensor的不同类型,占位符用于存储样本数据和标签,而变量用于存储模型的参数。在构建完loss函数后,我们需要创建一个会话(Session)来初始化变量并进行参数更新。TensorFlow还提供了多种数据读入的方法,包括利用占位符读入数据、使用队列建立文件到Tensor的映射以及使用Dataset API读入数据。此外,可以使用tf.contrib.layers.batch_norm函数进行批量归一化操作。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [【转】tensorflow学习使用路线](https://blog.csdn.net/Callon_H/article/details/60343633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于21个项目的TensorFlow实践学习](https://blog.csdn.net/qq_19329785/article/details/94872466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值