【问题标题】:Cyclic loss in tensorflow张量流中的循环损失
【发布时间】:2016-12-05 09:17:53
【问题描述】:

我想建立一个网络,对于给定的输入,预测一天中的时间。结果应该在 0 到 24 的范围内。

我试图将其作为分类问题来解决,但这似乎不是正确的方法。我的问题是我不知道如何构建循环损失函数。例如,在我的情况下,如果网络的输出为 1,而真正的标签为 23,我希望距离为 2 而不是 22。有没有我可以使用的层?

【问题讨论】:

  • 欢迎来到 SO!这是一个很好的问题;它不应该被否决。但是,总是希望您展示您所做的一些工作,最好使用代码或伪代码 sn-p。这将减少您的问题被误解为缺乏研究和努力的可能性。

标签: python tensorflow deep-learning keras-layer


【解决方案1】:

据我所知,没有预先编写好的循环损失函数。对于循环损失,您应该像这样编写自己的损失函数:

import keras.backend as K
def cyclic_loss(y_true, y_pred): 
    return K.min((y_pred +24 - y_true) % 24, (y_true + 24 - y_pred) % 24)

model.compile(optimizer='sgd', loss=cyclic_loss, metrics=['acc'])

但是,如果您这样定义损失,则不是分类问题。如果你想要一个分类问题,你应该用 one-hot 编码对你的输出进行编码,并使用交叉熵作为损失函数。然后你有一天中每个小时的概率,你选择概率最高的小时。

作为回归任务,您可以使用上述循环损失函数。

【讨论】:

  • 非常感谢。看来我应该将它用作回归任务。如果我尝试在 tensorflow 中编写它是否会造成同样的损失?
  • 如果你使用 keras 作为包装器,是的。如果没有,您将不得不使用 tensorflow 后端。我自己没有直接使用 tensorflow 后端的乐趣,所以我不能肯定地说。
  • 好的,谢谢,我将使用 keras。有没有办法确保 y_pred 的输出以 24 为模?我放了一个 relu 来使 y_pred>0(Dense(1,activation='relu',name=y_pred) 但它不会比 24 高吗?凹非凸损失函数
  • 首先想到的是使用 keras.backend.switch (keras.io/backend/#switch) 在结果高于 24 或低于 0 的情况下返回一个非常高的损失。然后函数仍然是凸的。这应该与阈值函数相同。
猜你喜欢
  • 2019-08-22
  • 2018-12-16
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2018-02-03
  • 2019-02-11
相关资源
最近更新 更多