如何使用预训练模型作为张量流中的非训练子网络?

jra*_*ary 4 tensorflow

我想培训一个包含子网络的网络,我需要在培训期间保持修复.基本思想是在预训练网络之前预先添加和附加一些图层(inceptionV3)

new_layers -> pre-trained and fixed sub-net (inceptionv3) -> new_layers
Run Code Online (Sandbox Code Playgroud)

并且在不改变预先训练的任务的情况下运行我的任务的训练过程.我还需要直接在预训练网络的某个层上进行分支.例如,对于inceptionV3,我喜欢将它从conv 299x299用于最后一个池层,或者从conv 79x79到最后一个池层.

kev*_*man 5

是否训练"层"是由该层中使用的变量是否用梯度更新来确定的.如果您使用优化程序界面来优化您的网络,那么您可以简单地不将要保留的图层中使用的变量传递给minimize函数,即,

opt.minimize(loss, <subset of variables you want to train>)
Run Code Online (Sandbox Code Playgroud)

如果tf.gradients直接使用函数,则从第二个参数中删除要修复的变量tf.gradients.

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

  • 请注意,人们获取要训练的变量集的一种方法是使用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__ (2认同)