我的数据集由一个空闲系统组成,该系统有时会接收请求。我试图通过时钟来预测这些瞬间。由于请求是稀疏分布的(我已经强迫它们持续一段时间,所以它们不会变得太稀疏),我想创建一个新的损失函数,如果它只对所有内容给出零预测,就会惩罚模型. 我的实施尝试只是对标准 logits 的惩罚:
def sparse_penalty_logits(y_true, y_pred):
penalty = 10
if y_true != 0:
loss = -penalty*K.sum((y_true*K.log(y_pred) + (1 - y_true)*K.log(1 - y_pred)))
else:
loss = -K.sum((y_true*K.log(y_pred) + (1 - y_true)*K.log(1 - y_pred)))
return loss
这是正确的吗?(我也试过了tensorflow)。每次我运行它时,我要么得到很多NaN' 作为损失,要么得到根本不是二进制的预测。我想知道我在设置模型时是否做错了,因为binary_crossentropy也不能正常工作。我的模型是这样的(目标由带有0's 或1's 的列表示):
model = Sequential()
model.add(Dense(100, activation = 'relu', input_shape = (train.shape[1],)))
model.add(Dense(100, activation = 'relu'))
model.add(Dense(100, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(optimizer = 'adam', loss = sparse_penalty_logits)
如果我运行它,正如我所说的,我会得到非常奇怪的结果(男孩,我觉得我搞砸了真的很糟糕......):
