Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将可训练的tensorflow变量转换为不可训练的tensorflow变量?_Python_Tensorflow - Fatal编程技术网

Python 如何将可训练的tensorflow变量转换为不可训练的tensorflow变量?

Python 如何将可训练的tensorflow变量转换为不可训练的tensorflow变量?,python,tensorflow,Python,Tensorflow,我需要恢复一个DNN(VGG16Net),并使用迁移学习构建另一个网络。所以在这里,我需要将一些过滤器、偏差变量从可训练的tensorflow变量转换为不可训练的变量(我使用的是原生tensorflow框架,而不是keras或任何更高级别的包) 例如,从卷积层4_1获取权重 我曾经 conv4\u 3\u filter=sess.graph.get\u tensor\u by\u name('conv4\u 3/filter:0')) 但是变量“conv4_3_filter”始终是可训练的变

我需要恢复一个DNN(VGG16Net),并使用迁移学习构建另一个网络。所以在这里,我需要将一些过滤器、偏差变量从可训练的tensorflow变量转换为不可训练的变量(我使用的是原生tensorflow框架,而不是keras或任何更高级别的包)

例如,从卷积层4_1获取权重 我曾经

conv4\u 3\u filter=sess.graph.get\u tensor\u by\u name('conv4\u 3/filter:0'))
但是变量“conv4_3_filter”始终是可训练的变量。 所以,在这里,我试图找到一种通用的方法,将任何tensorflow变量从可训练变量转换为不可训练变量。
如何解决这个问题?

我认为不可能修改
tf.Variable
trainable
属性。但是,有多种变通方法

假设您有两个变量:

将tensorflow导入为tf
v1=tf.Variable(tf.random_normal([2,2]),name='v1')
v2=tf.Variable(tf.random_normal([2,2]),name='v2')
当您使用
tf.train.Optimizer
类及其子类进行优化时,默认情况下,它从
tf.GraphKeys.TRAINABLE_variables
集合中获取变量。默认情况下,使用
trainable=True
定义的每个变量都会添加到此集合中。您可以做的是清除此集合,并仅将您希望优化的变量附加到其中。例如,如果我只想优化
v1
,而不想优化
v2

var\u list=tf.trainable\u variables()
打印(变量列表)
# [,
#  ]
tf.get_default_graph().clear_集合(tf.GraphKeys.TRAINABLE_变量)
已清除变量列表=tf.可训练变量()
打印(已清除变量列表)
# []
tf.add_到_集合(tf.GraphKeys.TRAINABLE_变量,var_列表[0])
更新的变量列表=tf.trainable变量()
打印(更新的变量列表)
# []
另一种方法是使用优化器的
var\u list
关键字参数,并传递您希望在培训期间更新的变量(在执行
train\u op
期间):

optimizer=tf.train.GradientDescentOptimizer(0.01)
列车运行=优化器。最小化(损失,变量列表=[v1])

如果可能的话,我不知道如何将可训练变量转换为不可训练变量,但是您可以让变量保持可训练状态,但只训练其他变量,请参见示例。