代码之家  ›  专栏  ›  技术社区  ›  DreamFlasher

将千层面BatchNormalayer转换为Keras BatchNormalization层

  •  1
  • DreamFlasher  · 技术社区  · 7 年前

    我想将一个预培训的千层面(Theano)模型转换为Keras(Tensorflow)模型,因此所有层都需要具有完全相同的配置。从这两份文件中,我不清楚参数是如何对应的。让我们假设一个千层面 BatchNormLayer 使用默认设置:

    class lasagne.layers.BatchNormLayer(incoming, axes='auto', epsilon=1e-4, alpha=0.1, beta=lasagne.init.Constant(0), gamma=lasagne.init.Constant(1), mean=lasagne.init.Constant(0), inv_std=lasagne.init.Constant(1), **kwargs)

    这是 Keras BatchNormalization 层API:

    keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)

    大部分都很清楚,因此我将在此处提供相应的参数,以供将来参考:

    (Lasagne -> Keras)
    incoming -> (not needed, automatic)
    axes -> axis
    epsilon -> epsilon
    alpha -> ?
    beta -> beta_initializer
    gamma -> gamma_initializer
    mean -> moving_mean_initializer
    inv_std -> moving_variance_initializer
    ? -> momentum
    ? -> center
    ? -> scale
    ? -> beta_regularizer
    ? -> gamma_regularizer
    ? -> beta_constraint
    ? -> gamma_constraint
    

    我假设千层面根本不支持beta\u正则化器、gamma\u正则化器、beta\u约束和gamma\u约束,因此Keras中的默认值None是正确的。我还假设在千层面中心和秤总是打开,不能关闭。

    剩下的是烤宽面条alpha和Keras momentum。从 Lasagne documentation 对于alpha:

    训练期间计算的批量平均值和标准偏差的指数移动平均值系数;越接近一个,就越取决于最后看到的批次

    Keras documentation 对于动量:

    移动平均值和移动方差的动量。

    它们似乎是对应的——但用哪个公式呢?

    1 回复  |  直到 7 年前
        1
  •  1
  •   ely    7 年前

    从…起 the Lasagne code 我们看到 alpha 像这样:

    running_mean.default_update = ((1 - self.alpha) * running_mean +
                                   self.alpha * input_mean)
    running_inv_std.default_update = ((1 - self.alpha) *
                                      running_inv_std +
                                      self.alpha * input_inv_std)
    

    从这个 issue discussing Keras batch norm 'momentum' 我们可以看到:

    def assign_moving_average(variable, value, decay, zero_debias=True, name=None):
        """Compute the moving average of a variable.
        The moving average of 'variable' updated with 'value' is:
          variable * decay + value * (1 - decay)
    
        ...
    

    其中,正如问题所指出的,张量流术语“衰减”是从Keras获得的“动量”值。

    由此看来,千层面所称的“alpha”等于1-“momentum”,因为在Keras中,“momentum”是现有变量(现有移动平均数)的乘数,而在千层面中,这个乘数是 1 - alpha

    诚然,这令人困惑,因为

    • Keras下面的TensorFlow操作使用“衰变”一词,但这是Keras直接命名的“动量”。
    • TensorFlow代码仅将事物命名为“变量”和“值”,这使得很难知道哪个事物是存储的移动平均值,哪个事物是要组合的其他新数据。
    推荐文章