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

4

我希望训练一个包含子网络的神经网络,在训练过程中需要保持该子网络不变。基本思路是在预训练的网络(inceptionV3)前后添加一些层。

new_layers -> pre-trained and fixed sub-net (inceptionv3) -> new_layers

我需要在不改变预训练模型的情况下运行所需任务的训练过程。同时,我还需要直接在预训练网络的某些层上进行分支。例如,对于inceptionV3,我希望从conv 299x299到最后一个池化层或从conv 79x79到最后一个池化层。

1个回答

5
无论是否训练“层”取决于该层中使用的变量是否随梯度更新。 如果您正在使用优化器接口来优化您的网络,则可以不将要保持固定的层中使用的变量传递给minimize函数,即:
opt.minimize(loss, <subset of variables you want to train>)

如果您直接使用tf.gradients函数,则需要从第二个参数中删除要保留固定的变量。现在,如何“直接分支”到预训练网络的一层取决于该网络的实现方式。我会简单地定位到你所说的299x299层的tf.Conv2D调用,并将其作为输入传递给您的新层,在输出端定位到79x79层,将其输出用作您的新层的输入。

2
请注意,人们获取要训练的变量集的一种方法是使用tf.trainable_variables()函数https://www.tensorflow.org/versions/0.6.0/api_docs/python/state_ops.html#trainable_variables来获取使用trainable=True(默认值)创建的变量集合。您可以通过在构建变量时传递trainable=False来从该集合中排除变量:https://www.tensorflow.org/versions/0.6.0/api_docs/python/state_ops.html#Variable.__init__ - Josh11b
这是另一个与仅更新某些层的变量相关的问题:https://dev59.com/elsW5IYBdhLWcg3wdnFh - mathetes
我该如何设置每一层的输入?我需要像在classify_image示例中那样使用sess.run函数吗? - jrabary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接