在 keras 中将“learning_phase”用于 tensorflow 后端?
Posted
技术标签:
【中文标题】在 keras 中将“learning_phase”用于 tensorflow 后端?【英文标题】:Usage of 'learning_phase' in keras for tensorflow backend? 【发布时间】:2018-08-16 03:53:58 【问题描述】:我正在尝试在 tensorflow 中使用 keras 后端训练 resnet 网络。每批更新的提要字典写成:
feed_dict= x:X_train[indices[start:end]], y:Y_train[indices[start:end]], keras.backend.learning_phase():1
我正在使用 keras 后端 (keras.backend.set_session(sess)
),因为原始 resnet 网络是使用 keras 定义的。由于模型包含 dropout 和 batch_norm 层,它需要一个学习阶段来区分训练和测试。
我观察到,每当我设置keras.backend.learning_phase():1
时,模型训练/测试的准确率几乎不会超过 10%。相反,如果没有设置学习阶段,即饲料字典定义为:
feed_dict= x:X_train[indices[start:end]], y:Y_train[indices[start:end]]
然后正如预期的那样,模型准确度以标准方式随着时代的增加而不断增加。
如果有人澄清是否不需要使用学习阶段或是否有其他问题,我将不胜感激。 Keras 2.0 文档似乎建议使用带有 dropout 和 batch_norm 层的学习阶段。
【问题讨论】:
仅仅两行代码不可能说出什么问题,你应该包含更多的代码。另外,你为什么不只使用model.fit? @Ma 优化步骤需要额外的调整,阻碍了model.fit的使用 【参考方案1】:将学习阶段设置为 1(训练)
K.set_learning_phase(1)
那么你需要为所有的批归一化层设置 training=false
if layer.name.startswith('bn'):
layer.call(layer.input, training=False)
【讨论】:
以上是关于在 keras 中将“learning_phase”用于 tensorflow 后端?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Keras 中将 Sklearn Metric 实现为 Metric?
如何在 Keras / Tensorflow 中将(无,)批量维度重新引入张量?