我正在尝试计算倾斜损失,而倾斜损失又将用于Keras。但是,我必须做错事,因为我得到负面损失值(这应该是不可能的)。任何人都可以指出我做错了什么。我假设它是theano语法我错了。
损失在数学上定义为: 其中$ \ 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]))
。你可以像这样切片吗?
任何想法都会受到赞赏。
答案 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]