可视化双头模型中的自定义损失
Visualizing custom loss in double-head model
使用来自this article的A2C代理,如何在更新权重时获取value_loss
、policy_loss
和entropy_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_loss
和self._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()
两次。
使用来自this article的A2C代理,如何在更新权重时获取value_loss
、policy_loss
和entropy_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_loss
和self._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()
两次。