Keras BatchNormalization填充参数在tensorflow训练时更新

时间:2017-10-06 04:33:36

标签: python tensorflow keras batch-normalization

我在Ubuntu 16.04中使用Keras 2.0.8和Tensorflow 1.3.0,使用Cuda 8.0和cuDNN 6。

我在模型中使用了两个BatchNormalization图层( keras图层),并使用 tensorflow管道进行了培训。

我在这里遇到两个问题 -

  1. Batchnorm图层人口参数(均值和差异)未更新,即使在将 K.learning_phase 设置为 True之后也进行了培训即可。结果,推断完全失败。我需要一些关于如何在人工培训步骤之间更新这些参数的建议。
  2. 其次,在使用tensorflow saver 操作保存训练模型之后,当我尝试加载时,结果不能是再现即可。似乎权重正在发生变化。有没有办法在保存 - 加载操作中保持相同的权重?

1 个答案:

答案 0 :(得分:0)

几周前我遇到了同样的问题。在内部,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模型(没有编译它),然后运行以下

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

其中输入可以是

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

输出是张量流张量的列表。该模型似乎自动聚合输入输出之间的所有其他更新操作。

相关问题