Taw*_*Taw 2 python keras tensorflow
过去每当我使用tensorflow的keras api时,我都会使用model.compile指定模型的损失函数。我目前正在开发一个存储库,它使用“add_loss”来指定 model.call 内部的损失函数。或者至少,这就是我假设正在发生的事情,因为我找不到此方法的任何文档(即https://www.tensorflow.org/api_docs/python/tf/keras/Model上没有),并且我也找不到任何使用此方法的教程。更重要的是,我什至无法弄清楚它在源代码中的定义位置。
class TRPO(Model):
def __init__(self, obs_dim, act_dim, hid1_mult, kl_targ, init_logvar, eta, **kwargs):
super(TRPO, self).__init__(**kwargs)
self.kl_targ = kl_targ
self.eta = eta
self.beta = self.add_weight('beta', initializer='zeros', trainable=False)
self.policy = PolicyNN(obs_dim, act_dim, hid1_mult, init_logvar)
self.logprob = LogProb()
self.kl_entropy = KLEntropy()
def call(self, inputs):
obs, act, adv, old_means, old_logvars, old_logp = inputs
new_means, new_logvars = self.policy(obs)
new_logp = self.logprob([act, new_means, new_logvars])
kl, entropy = self.kl_entropy([old_means, old_logvars,
new_means, new_logvars])
loss1 = -K.mean(adv * K.exp(new_logp - old_logp))
loss2 = K.mean(self.beta * kl)
# TODO - Take mean before or after hinge loss?
loss3 = self.eta * K.square(K.maximum(0.0, K.mean(kl) - 2.0 * self.kl_targ))
self.add_loss(loss1 + loss2 + loss3)
return [kl, entropy]
Run Code Online (Sandbox Code Playgroud)
任何人都有使用 add_loss 的经验并能指出它是如何工作的吗?并解释为什么你不直接编写自己的损失函数并将其传递到 model.compile 中?
小智 5
add_loss 您可以在这里找到官方文档。添加损失张量,可能取决于层输入。此方法可以在子类层或模型的调用函数内部使用,在这种情况下,损失应该是张量或张量列表。文档中很少有示例来解释add_loss.
add_loss您可以在tf.keras.layers.Layer中找到源代码。这是所有层都继承自的类。单击“在 GitHub 上查看源代码”并搜索add_loss.
回答你的问题 -
任何人都有使用 add_loss 的经验并能指出它是如何工作的吗?
您可以在此处和此处找到使用 add_loss 的好示例以及解释。
并解释为什么你不直接编写自己的损失函数并将其传递到 model.compile 中?
model.compile()Tensorflow 中的损失函数始终采用两个参数y_true和y_pred。使用model.add_loss()没有这样的限制,并且允许您编写依赖于许多其他张量的更复杂的损失,但它的不便之处在于更加依赖于模型,而标准损失函数适用于任何模型。
希望这能回答您的问题。快乐学习。
| 归档时间: |
|
| 查看次数: |
2788 次 |
| 最近记录: |