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



使用本文中的A2C代理,如何在更新权重时获得value_losspolicy_lossentropy_loss的数值?

我使用的型号是双头的,两个头共用一个行李箱。策略头输出形状为[number of actions, batch size],值头具有[1, batch_size]的形状。当这些损失函数作为度量给出时,编译此模型会返回大小不兼容错误:

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都作为图执行,这意味着它们内部的所有变量都只是指向图节点的指针。我发现了一些例子,其中张量对象被求值(使用eval(((以获得节点的值。我不理解它们,因为为了评估((Tensor对象,你需要给它一个Session,但在TensorFlow 2.x中,Session是不推荐使用的。

另一个线索是,当从Keras中的Model API调用train_on_batch()来训练模型时,该方法返回损失。我不明白为什么,但它唯一的损失来自政策负责人。该水头的损失计算为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))

CCD_ 11返回一个CCD_。通过对logits_loss + entropy_loss进行计算,可以计算出policy_loss的值。请注意,此解决方案会导致调用self._entropy_loss()两次。

最新更新