【问题标题】:Visualizing custom loss in double-head model可视化双头模型中的自定义损失
【发布时间】:2020-08-11 00:40:20
【问题描述】:

使用来自this article 的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())以从节点中获取值。我不理解它们,因为为了 eval() 一个 Tensor 对象,您需要给它一个 Session 但在 TensorFlow 2.x 中,Sessions 已被弃用。

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

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

【问题讨论】:

    标签: python keras tensorflow2.0 loss-function


    【解决方案1】:

    我找到了问题的答案。在 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([...]) 返回[total_loss, logits_loss, value_loss, entropy_loss] 的列表。通过计算logits_loss + entropy_loss,可以计算出policy_loss 的值。请注意,此解决方案会导致调用 self._entropy_loss() 两次。

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 2021-04-18
      • 2022-11-07
      • 2020-05-14
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2023-03-14
      相关资源
      最近更新 更多