Keras BatchNormalization总体参数更新,而在tensorflow培训(Kera

2019-09-28 18:05发布

我在Ubuntu 16.04使用Keras 2.0.8与1.3.0 Tensorflow使用CUDA 8.0和cuDNN 6。

我在我的模型使用两个BatchNormalization层(keras层 ),并使用tensorflow管道培训。

我在这里面临的两个问题 -

  1. BatchNorm层总体参数 (均值和方差)甚至K.learning_phase设置为True不被更新 ,而训练。 其结果是,推断是完全失败的。 我需要关于如何手动更新培训步骤之间的这些参数的一些建议。
  2. 其次,使用tensorflow 保护程序运算,当我尝试加载节省了训练模型后, 结果不能再现 。 这似乎权重发生变化 。 有没有一种方法,以保持在保存负荷运行相同的权重?

Answer 1:

我在几个星期前碰到了同样的问题。 在内部,keras层可以添加额外的更新操作的模型(例如batchnorm )。 所以,你需要明确地运行这些额外的欢声笑语。 对于batchnorm这些更新似乎只是一些assign_ops其交换电流平均值/方差与新值。 如果你没有创建一个keras模型这可能工作; 假设x是你喜欢正常化张量

bn = keras.layers.BatchNormalization()
x = bn(x)

....
sess.run([minimizer_op,bn.updates],K.learning_phase(): 1)

在我的工作流程,我创建一个keras模型(W / O编译它),然后运行以下

model = keras.Model(inputs=inputs, outputs=prediction)
sess.run([minimizer_op,model.updates],K.learning_phase(): 1)

其中输入可以是这样的

inputs = [keras.layers.Input(tensor=input_variables)]

输出是tensorflow张量的列表。 该模型似乎自动汇总投入产出之间的所有其他更新操作。



文章来源: Keras BatchNormalization population parameters update while training in tensorflow