我在Ubuntu 16.04使用Keras 2.0.8与1.3.0 Tensorflow使用CUDA 8.0和cuDNN 6。
我在我的模型使用两个BatchNormalization层(keras层 ),并使用tensorflow管道培训。
我在这里面临的两个问题 -
- BatchNorm层总体参数 (均值和方差)甚至K.learning_phase设置为True后不被更新 ,而训练。 其结果是,推断是完全失败的。 我需要关于如何手动更新培训步骤之间的这些参数的一些建议。
- 其次,使用tensorflow 保护程序运算,当我尝试加载它节省了训练模型后, 结果不能再现 。 这似乎权重发生变化 。 有没有一种方法,以保持在保存负荷运行相同的权重?
我在几个星期前碰到了同样的问题。 在内部,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