【问题标题】:How to disable e.g. Dropout in tf.keras.Model to generate activation maximation images using transfer learning如何禁用例如tf.keras.Model 中的 Dropout 以使用迁移学习生成激活最大化图像
【发布时间】:2019-11-22 18:48:16
【问题描述】:

我正在使用迁移学习和 keras.applications.InceptionV3。我成功地训练了模型。

但是,当我想生成“激活最大化”图像(例如,最大化自定义类之一的激活的输入图像,参考例如 https://arxiv.org/pdf/1512.02017v3.pdf )时,我很难使用预训练模型,因为我确实管理在“适合”模式下使用它并禁用所有辍学等。

我所做的是在 tf.keras.Sequential 中结合预训练模型,对第一层(输入图像)的权重进行梯度下降。

尽管设置了 base_model.trainable = False,但是在外部顺序模型上使用 model.fit(data) 时,似乎预训练模型进入了训练模式(尽管权重没有更新)。

在外部调用 fit 时,有什么方法可以强制 base_model(Sequential 的子模型)处于“预测”模式?

【问题讨论】:

  • 没有得到你需要的东西,但是为所有层设置trainable = False 就可以了。你可以在这里查看我的笔记本github.com/michelucci/oreilly-london-ai/blob/master/day2/…,例如。检查这是否对您有帮助...如果向下滚动,您会发现几个迁移学习的示例。
  • 谢谢,很抱歉回复晚了——我试过了,但似乎没有用——批量标准化似乎仍然表现得很奇怪(我认为)。我会再调试一些并报告回来
  • 不,trainable = False 似乎不足以使预训练模型在训练模式下与推理模式下的行为相同:-(

标签: tensorflow2.0 tf.keras


【解决方案1】:

我刚刚遇到了同样的问题。在阅读了一些文档并查看了tf.keras.layers.Layertf.keras.layers.Densetf.keras.layers.BatchNormalization的TensorFlows实现的源代码后,我得到了以下理解。

如果在调用层时传递了training = False,它将在推理模式下运行。这与属性trainable 无关,这意味着不同的东西。如果他们将其命名为training_mode,这可能会减少误解。

在进行迁移学习或微调时,training = False 应传递给调用基本模型本身。据我目前所见,这只会影响tf.keras.layers.Dropouttf.keras.layers.BatchNormalization 等层,而不会影响其他层。

通过training = False 在推理模式下运行将导致tf.layers.Dropout 根本不应用丢弃率。

由于tf.layers.Dropout 没有可训练的权重,设置属性trainable = False 将完全没有效果,

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2020-12-08
    • 2020-10-10
    • 2019-03-31
    • 1970-01-01
    • 2018-01-12
    • 2020-07-01
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多