Batch Normalization 批标准化

搭建网络

输入需要的模块和定义网络的结构

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt


ACTIVATION = tf.nn.relu # 每一层都使用 relu 
N_LAYERS = 7            # 一共7层隐藏层
N_HIDDEN_UNITS = 30     # 每个层隐藏层有 30 个神经元

使用 build_net() 功能搭建神经网络:

def built_net(xs, ys, norm):
    def add_layer(inputs, in_size, out_size, activation_function=None):
        # 添加层功能
        Weights = tf.Variable(tf.random_normal([in_size, out_size], mean=0., stddev=1.))
        biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
        Wx_plus_b = tf.matmul(inputs, Weights) + biases
        if activation_function is None:
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b)
        return outputs

    fix_seed(1)

    layers_inputs = [xs]    # 记录每层的 input

    # loop 建立所有层
    for l_n in range(N_LAYERS):
        layer_input = layers_inputs[l_n]
        in_size = layers_inputs[l_n].get_shape()[1].value

        output = add_layer(
            layer_input,    # input
            in_size,        # input size
            N_HIDDEN_UNITS, # output size
            ACTIVATION,     # activation function
        )
        layers_inputs.append(output)    # 把 output 加入记录

    # 建立 output layer
    prediction = add_layer(layers_inputs[-1], 30, 1, activation_function=None)

    cost = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1]))
    train_op = tf.train.GradientDescentOptimizer(0.001).minimize(cost)
    return [train_op, cost, layers_inputs]

创建数据

创造数据并可视化数据:

Batch Normalization 代码

built_net add_layer 都加上 norm 参数, 表示是否是 Batch Normalization 层:

每层的 Wx_plus_b 需要进行一次 batch normalize 的步骤, 这样输出到 activationWx_plus_b 就已经被 normalize 过了:

如果使用 batch 进行每次的更新, 那每个 batchmean/var 都会不同, 可以使用 moving average 的方法记录并慢慢改进 mean/var

的值. 然后将修改提升后的 mean/var 放入 tf.nn.batch_normalization().

test 阶段, 可以直接调用最后一次修改的 mean/var 值进行测试, 而不是采用 test 时的 fc_mean/fc_var.

对这句进行扩充, 修改前:

输入数据 xs 时, 给它做一个 normalization:

在建立网络的循环中的这一步加入 norm 这个参数:

对比有无 BN

搭建两个神经网络, 一个没有 BN, 一个有 BN:

训练神经网络:

relu cost 的对比:

没有使用 NB 的网络, 大部分神经元都死了, 所以连误差曲线都没了

tanh:

tanh 的误差对比:

Last updated

Was this helpful?