将Lasagne BatchNormLayer转换为Keras BatchNormalization图层

时间:2018-04-19 21:16:15

标签: tensorflow machine-learning keras theano lasagne

我想将预训练的烤宽面条(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

我认为Lasagne不支持beta_regularizer,gamma_regularizer,beta_constraint和gamma_constraint,因此Keras of None中的默认值是正确的。我还假设在Lasagne中心,比例始终打开,无法关闭。

这留下了Lasagne alpha和Keras的动力。从Lasagne documentation获取alpha:

  

分批方式的指数移动平均值的系数和训练期间计算的标准差;离一个越近,它就越依赖于最后一批看到的

从动态Keras documentation开始:

  

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

他们似乎对应 - 但是通过哪个公式?

1 个答案:

答案 0 :(得分:1)

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)

    ...

其中,正如问题所指出的那样,TensorFlow术语“衰变”是从Keras获得“势头”的价值。

由此看来,Lasagne所谓的'alpha'等于1 - '动量',因为在Keras中,'动量'是现有变量(现有移动平均值)的乘数,而在Lasagne中这个乘数是1 - alpha

不可否认,这很令人困惑,因为

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