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

如何在tensorflow中使用预训练模型作为不可训练子网络?,tensorflow,Tensorflow,我想训练一个包含子网络的网络,我需要在训练期间保持固定。其基本思想是在预先训练好的网络(inceptionV3)上预加和附加一些层 并为我的任务运行培训流程,而不更改预先培训的流程。 我还需要直接在预先培训的网络的某一层上分支。例如,对于inceptionV3,我喜欢从conv 299x299到最后一个池层或从conv 79x79到最后一个池层使用它。是否训练“层”取决于该层中使用的变量是否使用渐变更新。如果您正在使用该接口优化网络,那么您就不能将您想要固定的层中使用的变量传递到minimize

我想训练一个包含子网络的网络,我需要在训练期间保持固定。其基本思想是在预先训练好的网络(inceptionV3)上预加和附加一些层

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

是否训练“层”取决于该层中使用的变量是否使用渐变更新。如果您正在使用该接口优化网络,那么您就不能将您想要固定的层中使用的变量传递到
minimize
函数,即

opt.minimize(loss, <subset of variables you want to train>)
opt.最小化(损失,)
如果您直接使用
tf.gradients
函数,则将要固定的变量从第二个参数中删除到
tf.gradients


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

注意,人们获得要训练的变量集的一种方法是使用tf.trainable_variables()函数获取使用trainable=True(默认值)创建的变量集合。在构造变量时,可以通过传递trainable=False从该集合中排除变量:这里还有一个问题与仅更新某些层的变量有关:如何设置每个层的输入?我是否需要使用sess.run函数,例如在classify_图像示例中?
opt.minimize(loss, <subset of variables you want to train>)