如何抑制TensorFlow 2.x冻结预训练层时触发的无梯度警告
方案1:使用Keras原生冻结机制(推荐)
你当前的冻结需求可以直接通过Keras官方的trainable属性实现,不需要手动添加tf.stop_gradient,既可以达到完全冻结预训练层的效果,也不会触发梯度不存在的警告。
修改后的代码示例:
head = load_my_cool_pretrained_representation_model() # 冻结整个预训练头部的所有参数 head.trainable = False x = tf.keras.layers.Dense(10000)(head.output) x = tf.keras.layers.Dense(1)(x) model = tf.keras.Model(inputs=head.inputs, outputs=x) model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam())
该方案是Keras官方推荐的预训练模型冻结方式,后续如果需要解冻微调也只需要修改trainable属性,无需调整网络结构。
方案2:仅过滤指定警告(不修改现有模型结构)
如果你需要保留现有tf.stop_gradient的写法,只需要过滤对应的警告信息,可以在代码开头添加如下逻辑,精准过滤该条警告且不影响其他警告的输出:
import tensorflow as tf # 仅过滤梯度不存在的特定警告 tf.get_logger().addFilter(lambda record: 'Gradients do not exist for variables' not in record.getMessage())
如果可以接受关闭所有TensorFlow警告,也可以直接调整日志级别:
import tensorflow as tf tf.get_logger().setLevel('ERROR')
内容的提问来源于stack exchange,提问作者Ottpocket
相关产品推荐
相关产品推荐

