我正在训练一个tf.keras模型,并希望在训练期间使用TensorBoard回调将渐变写入磁盘。具体来说,对于每个可训练变量,我在给定步骤计算其梯度的平均欧几里得范数,并将其写入标量摘要缓冲区,如下所示:
def add_mean_norm_summary(variable, scope):
with tf.name_scope(scope):
mean_l2_norm = tf.norm(variable, ord='euclidean') / tf.to_float(tf.size(variable))
return tf.summary.scalar('{}_mean_l2_norm'.format(scope), mean_l2_norm)
我写了一个自定义的tf.keras.optimizer.Optimizer,它继承自现有的优化器(在我的例子中是Adam),并覆盖了其get_updates()
方法,如下所示:
def get_updates(self, loss, params):
grads = self.get_gradients(loss, params)
grad_summaries = []
for grad, param in zip(grads, params):
summary_name_scope = param.name.replace(':', '_') + '_gradient'
grad_summaries.append(add_mean_norm_summary(grad, summary_name_scope))
tf.summary.merge(grad_summaries, name='gradient_summaries')
我希望自己可以编写一个继承自tf.keras.callbacks.TensorBoard
的自定义TensorBoard回调,在这里我可以以某种方式获取这些摘要并将其添加到on_batch_end()
方法中的文件编写器中。到目前为止,我一直没有成功。我尝试从派生的TensorBoard类中按名称调用合并的摘要op,但是这告诉我图中没有这样的op。
有人知道如何正确执行此操作吗?