在 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 中将(无,)批量维度重新引入张量?

如何在 Keras 中将顺序模型添加到预训练模型?

如何在 Keras 中将损失函数指定为二次加权 kappa?

如何在 Keras 中将标量添加到张量或从标量创建张量?

如何在keras中将三维数组转换为五维数组[重复]