可视化双头模型中的自定义损失

Visualizing custom loss in double-head model

使用来自this article的A2C代理,如何在更新权重时获取value_losspolicy_lossentropy_loss的数值?

我使用的模型是双头的,两个头共享同一个躯干。 policy head 输出形状为 [number of actions, batch size],value head 的形状为 [1, batch_size]。当这些损失函数作为度量给出时,编译此模型 returns 大小不兼容错误:

self.model.compile(optimizer=self.optimizer, 
                   metrics=[self._logits_loss, self._value_loss], 
                   loss=[self._logits_loss, self._value_loss])

self._value_lossself._policy_loss都是作为图来执行的,这意味着它们里面的所有变量都只是指向图节点的指针。我发现了一些示例,其中评估 Tensor 对象(使用 eval())以从节点中获取值。我不理解它们,因为为了 eval() 一个 Tensor 对象,你需要给它一个 Session 但在 TensorFlow 2.x Sessions 被弃用了。

另一个线索,当在 Keras 中从 Model API 调用 train_on_batch() 来训练模型时,方法 returns 损失。我不明白为什么,但它 returns 唯一的损失来自政策负责人。该头部的损失计算为 policy_loss - entropy_loss,但我的目标是分别获得所有三个损失,以便在图表中将它们可视化。

欢迎任何帮助,我被卡住了。

我找到了问题的答案。在 Keras 中,metrics 内置功能提供了一个接口,用于测量模型的性能和损失,无论是自定义模型还是标准模型。

编译模型时如下:

self.model.compile(optimizer=ko.RMSprop(lr=lr),
                   metrics=dict(output_1=self._entropy_loss),
                   loss=dict(output_1=self._logits_loss, output_2=self._value_loss))

... self.model.train_on_batch([...]) returns [total_loss, logits_loss, value_loss, entropy_loss] 的列表。通过计算 logits_loss + entropy_loss 可以计算出 policy_loss 的值。请注意,此解决方案会导致调用 self._entropy_loss() 两次。