我正在使用迁移学习和keras.applications.InceptionV3。我设法成功地训练了模型。
但是,当我想生成"激活最大化"图像(例如,最大化激活其中一个自定义类的输入图像,例如 https://arxiv.org/pdf/1512.02017v3.pdf (时,我很难使用预先训练的模型,因为我确实设法在"适合"模式下使用它并禁用所有 dropout 等。
我所做的是将预先训练的模型组合在tf.keras.Sequential中,对第一层(输入图像(的权重进行梯度下降。
尽管设置了 base_model.trainable = False,但是当在外部顺序模型上使用 model.fit(data( 时,预训练模型似乎被置于训练模式(尽管权重未更新(。
在外部调用 fit 时,有没有办法强制base_model(顺序的子项(处于"预测"模式?
我刚刚遇到了同样的问题。在阅读了一些文档并查看了 tf.keras.layers.Layer
、tf.keras.layers.Dense
和 tf.keras.layers.BatchNormalization
的 TensorFlows 实现的源代码后,我得到了以下理解。
如果在调用层时传递training = False
,它将在推理模式下运行。这与属性无关 trainable
,这意味着不同的东西。如果他们把它称为training_mode
,这可能会减少误解。
在进行迁移学习或微调时,training = False
应该传递调用基本模型本身。到目前为止,我所看到的,这只会影响tf.keras.layers.Dropout
和tf.keras.layers.BatchNormalization
等层,而不会影响其他层。
通过 training = False
在推理模式下运行将导致tf.layers.Dropout
根本不应用辍学率。
由于tf.layers.Dropout
没有可训练的权重,因此将属性设置为trainable = False
将完全不起作用,