我想将预训练的烤宽面条(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开始:
移动均值和移动方差的动量。
他们似乎对应 - 但是通过哪个公式?
答案 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
。
不可否认,这很令人困惑,因为