在theano的倾斜损失

时间:2016-07-21 07:40:16

标签: python theano keras

我正在尝试计算倾斜损失,而倾斜损失又将用于Keras。但是,我必须做错事,因为我得到负面损失值(这应该是不可能的)。任何人都可以指出我做错了什么。我假设它是theano语法我错了。

损失在数学上定义为: enter image description here 其中$ \ xi_i = y_i - f_i $其中$ y_i $是观察值,$ f_i $是预测值。此外,我是在平均损失之后,因此我将损失函数定义为:

$$
\mathcal{L} = \frac{\alpha\sum \xi_i-\sum I(\xi_i<0)\xi_i}{N}
$$

其中$ I()$是指标函数,如果为真,则取值为1。

因此我的损失函数定义如下:

def tilted_loss2(y,f):
    q = 0.05
    e = (y-f)
    return (q*tt.sum(e)-tt.sum(e[e<0]))/e.shape[0]

然而,当我运行我的网络时,我得到负值。这里的theano语法有问题吗?我最大的怀疑是:tt.sum(e[e<0]))。你可以像这样切片吗?

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

你不能像这样切片。 see this answer

您需要按如下方式更改损失函数:

def tilted_loss2(y,f):
    q = 0.05
    e = (y-f)
    return (q*tt.sum(e)-tt.sum(e[(e<0).nonzero()]))/e.shape[0]

您也可以使用abs函数而不是可能无效的复杂切片语法来尝试此解决方法:

def tilted_loss2(y,f):
    q = 0.05
    e = (y-f)
    return (q*tt.sum(e)-tt.sum(e-abs(e))/2.)/e.shape[0]