2

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

我在我的模型中使用两个 BatchNormalization 层(keras 层)并使用tensorflow 管道进行训练。

我在这里面临两个问题-

  1. 即使在将K.learning_phase设置为True之后, BatchNorm 层总体参数(均值和方差)也不会在训练时更新。结果,推理完全失败了。我需要一些关于如何在训练步骤之间手动更新这些参数的建议。
  2. 其次,使用 tensorflow saver op保存训练好的模型后,当我尝试加载它时,结果无法重现。似乎权重正在改变。有没有办法在保存加载操作中保持权重相同?
4

1 回答 1

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 模型(不编译它),然后运行以下命令

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

输入可以是类似的东西

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

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

于 2018-03-08T13:45:09.030 回答