如何在tensorflow中使用预训练模型作为不可训练的子网络?

时间:2016-02-03 15:18:52

标签: tensorflow

我想培训一个包含子网络的网络,我需要在培训期间保持修复。基本思想是在预训练网络(起始V3)

之前预先添加和附加一些层
new_layers -> pre-trained and fixed sub-net (inceptionv3) -> new_layers

并为我完成的任务运行培训流程,而不更改预先培训的任务。 我还需要直接在预训练网络的某个层上进行分支。例如,对于inceptionV3,我喜欢将它从conv 299x299用于最后一个池层,或者从conv 79x79到最后一个池层。

1 个答案:

答案 0 :(得分:5)

是否训练“层”取决于该层中使用的变量是否用渐变更新。如果您使用Optimizer界面来优化您的网络,那么您就不能将要保留的图层中使用的变量传递给minimize函数,即

opt.minimize(loss, <subset of variables you want to train>)

如果您直接使用tf.gradients函数,则将要保留的变量从第二个参数中移除到tf.gradients

现在,您如何“直接”分支到预先训练的网络层取决于该网络的实施方式。我只是找到你正在谈论的299x299层的tf.Conv2D调用,并将其作为输入传递,新层的输出,并在输出端,找到79x79层,使用其输出作为输入到你的新图层。