tensorflow中Batch Normalization和Layer Normalization的实现

深度学习是一门经验主义的科学,也就是说,人们总是实验效果好了之后才尝试去解释。BN和LN进来得到这么广泛的应用,也不是因为其想法多么巧妙,而是因为其效果确实好。

tensorflow1.12版本中这两个函数的实现如下:

tf.contrib.layers.batch_norm(
    inputs,
    decay=0.999,
    center=True,
    scale=False,
    epsilon=0.001,
    activation_fn=None,
    param_initializers=None,
    param_regularizers=None,
    updates_collections=tf.GraphKeys.UPDATE_OPS,
    is_training=True,
    reuse=None,
    variables_collections=None,
    outputs_collections=None,
    trainable=True,
    batch_weights=None,
    fused=None,
    data_format=DATA_FORMAT_NHWC,
    zero_debias_moving_mean=False,
    scope=None,
    renorm=False,
    renorm_clipping=None,
    renorm_decay=0.99,
    adjustment=None
)
tf.contrib.layers.layer_norm(
    inputs,
    center=True,
    scale=True,
    activation_fn=None,
    reuse=None,
    variables_collections=None,
    outputs_collections=None,
    trainable=True,
    begin_norm_axis=1,
    begin_params_axis=-1,
    scope=None
)

看起来参数很多,实际上大部分按照默认值来就可以。

对于BN而言,有一个参数需要设置一下,那就是updates_collections应设置为None,否则与BN相关的两个偏置量不会更新;

对于LN而言,我看到别人有将begin_norm_axis设置为-1的,也就是说仅在最后一维上进行Layer Normalization,我不是很理解为什么可以这么做。

另外,两个函数似乎都需要设置scope,否则会发生命名空间冲突的问题。

猜你喜欢

转载自blog.csdn.net/bonjourdeutsch/article/details/102917023