如何为导入的TensorFlow目标检测pb模型计算Grad-CAM所需梯度
基于TensorFlow 1.x静态图/PB模型计算Grad-CAM的实现方案
你当前使用的是TF1.x的会话(Session)静态图执行模式,无法直接使用TF2专属的tf.GradientTape接口,改用静态图原生的tf.gradients接口即可实现等价的梯度计算逻辑,完整实现步骤如下:
步骤1:构造梯度计算节点
在运行会话前,先从加载的PB图中提取所需张量,再构造目标得分到卷积层输出的梯度计算节点:
import tensorflow as tf # 已加载PB模型到sess会话的前提下,提取对应张量 input_tensor = sess.graph.get_tensor_by_name('image_tensor:0') conv_tensor = sess.graph.get_tensor_by_name('Mixed_5c/concat/Conv2d:0') score_tensor = sess.graph.get_tensor_by_name('detection_scores:0') # 定义目标计算得分:此处取置信度最高的检测结果得分,也可自行指定特定类别/检测框的得分 target_score = score_tensor[0, tf.argmax(score_tensor[0])] # 构造梯度节点:计算目标得分相对于卷积层输出的梯度 grads_tensor = tf.gradients(target_score, conv_tensor)[0]
步骤2:运行会话获取梯度与卷积输出
执行会话同时拿到卷积层输出、梯度值,后续处理逻辑和Keras版本完全一致:
conv_output, grads, scores = sess.run( [conv_tensor, grads_tensor, score_tensor], feed_dict={input_tensor: input_var} )
注意事项
- 如果你在导出PB模型时开启了剪枝优化删除了梯度相关节点,会导致梯度计算报错,导出时需要保留梯度节点,或改用
tf.train.import_meta_graph同时加载.meta权重文件和计算图 - 可以根据需求自定义
target_score的索引规则,比如针对特定类别、特定检测框计算专属热力图
内容的提问来源于stack exchange,提问作者Lord Mord
相关产品推荐
相关产品推荐

