Tensorflow1.12中的冻结层不会冻结可转换对象

时间:2019-11-21 01:51:45

标签: tensorflow transfer-learning

不幸的是,我坚持使用tensorflow 1.12,我需要进行迁移学习。该模型有多个层,我正在使用layer.trainable=False冻结它们。但是,这并未将图层中变量的可训练属性设置为False,这使它可以计算tf.GradientTape()中这些变量的梯度。我正在使用急切模式,因此我在第0个时期使用tfe.defun()来编译模型。

解决问题的是无法明确设置变量的可训练属性,即

for x in layer.variables:
    x.trainable=False

引发错误:AttributeError: can't set attribute

有人知道tensorflow==1.12有这个问题吗?如果是这样,我有办法解决这个问题吗?

编辑

我尝试了一种新方法,仅按照documentation中的建议将trainable_variables显示为tf.GradientTape()。我正在传递watch_accessed_variables=False,并明确传递通过

选择的trainable_variables的列表
trainable_variables = [y for x in model.layers for y in x.variables if x.trainable]

但是,正如文档中所述,我在None中得到了所有tape.gradients(loss, trainable_variables)。是否因为尚未构建trainable_variables?有没有办法检查变量的构建状态?我不确定是否是这种情况,因为我在实例化模型时明确建立了所有模块。

0 个答案:

没有答案