不幸的是,我坚持使用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?有没有办法检查变量的构建状态?我不确定是否是这种情况,因为我在实例化模型时明确建立了所有模块。