Tensorflow 将千层面BatchNormal层转换为Keras BatchNormal层

Tensorflow 将千层面BatchNormal层转换为Keras BatchNormal层,tensorflow,machine-learning,keras,theano,lasagne,Tensorflow,Machine Learning,Keras,Theano,Lasagne,我想将一个预培训的千层面(Theano)模型转换为Keras(Tensorflow)模型,因此所有层都需要具有完全相同的配置。从这两份文件中,我不清楚参数是如何对应的。让我们假设一个有默认设置的千层面: class lasagne.layers.batchNormalLayer(传入,axs='auto',epsilon=1e-4,alpha=0.1,beta=lasagne.init.Constant(0),gamma=lasagne.init.Constant(1),mean=lasagne

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

class lasagne.layers.batchNormalLayer(传入,axs='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)

这是层API:

keras.layers.BatchNormalization(轴=-1,动量=0.99,ε=0.001,中心=真,标度=真,β-初始值设定项='0',γ-初始值设定项='1',移动-平均值-初始值设定项='0',移动-方差-初始值设定项='1',β-正则化项=无,γ-正则化项=无,β-约束=无,γ-约束=无)

大部分内容都很清楚,因此我将在这里提供相应的参数供将来参考:

(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_正则化、gamma_正则化、beta_约束和gamma_约束,因此Keras中的默认值None是正确的。我还假设在千层面中心和规模总是打开,不能关闭

这就剩下了烤宽面条alpha和Keras动量。从用于alpha的

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

从动量的角度来看:

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

它们似乎是对应的——但通过哪个公式?

从中我们可以看到
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)
从中我们可以看到:

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获得的“动量”值

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

诚然,这令人困惑,因为

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