Python 如何防止keras自定义损失函数中的负面预测

Python 如何防止keras自定义损失函数中的负面预测,python,tensorflow,machine-learning,keras,computer-vision,Python,Tensorflow,Machine Learning,Keras,Computer Vision,我正在使用自定义损耗函数: def ratio_loss(y, y0): return (K.mean(K.abs(y - y0) / y)) 然后得到负的预测值——在我的例子中,这不会产生场景(我使用CNN和回归作为最后一层来获得对象的长度)。 我使用除法是为了在真实值相对于预测值相对较小的情况下惩罚更多 我怎样才能避免负面预测 这是模式(目前为…): 谢谢, 阿米尔 但是您的预期输出范围是多少 您可能应该在最后使用一些激活功能,例如: activation='sigmoid'-从0

我正在使用自定义损耗函数:

def ratio_loss(y, y0):
   return (K.mean(K.abs(y - y0) / y))
然后得到负的预测值——在我的例子中,这不会产生场景(我使用CNN和回归作为最后一层来获得对象的长度)。 我使用除法是为了在真实值相对于预测值相对较小的情况下惩罚更多

我怎样才能避免负面预测

这是模式(目前为…):

谢谢, 阿米尔

但是您的预期输出范围是多少

您可能应该在最后使用一些激活功能,例如:

  • activation='sigmoid'
    -从0到1
  • 激活='tanh'
    -从-1到+1
  • activation='softmax'
    -如果是只有一个正确类的分类问题
  • 激活='softplus'
    -从0到+inf
  • 等等

最后一层中的用法:

model.add(Dense(1,activation='sigmoid')) #from 0 to 1

#optional, from 0 to 200 after using the sigmoid above
model.add(Lambda(lambda x: 200*x))

提示:如果您是初学者,请避免使用过多的“relu”,它通常会卡在0中,必须使用精心选择的学习速率

你可以继续训练你的神经网络,希望它能学会不要做出低于0的任何预测(假设所有训练数据的输出都低于0)。然后,您可以添加一个预测后步骤,在该步骤中,您打开一个,如果它做出任何低于0的预测,那么您可以将其转换为0

正如Daniel Möller所回答的,您可以添加一个激活函数

这将涉及改变

model.add(Dense(1))

因为您提到,您希望注释中的输出为0到~200。
这将保证输出不低于0

输出应该在0到inf之间(实际上是~200)。我不明白您建议在哪里使用这些激活。。(我是古斯特,所以请原谅我说的废话)谢谢,这很有帮助!如果你认为这是你的答案,请把它标上答案,谢谢。但是现在(也许正如你所说的)它花费了很多时间并且产生了非常糟糕的结果(不知怎么的,在一开始我有相当好的结果)2400/2500[=============================================================>]-ETA:6s-损失:66.7620-sacc:0.05652416/2500[==================================================================================>]-ETA:5s-损失:66.8153-sacc:0.0566\你建议如何建立网络(就层\过滤器\激活的数量而言)以提供更好更快的结果?功能非常简单(我应该测量的跟踪类型)
model.add(Dense(1,activation='sigmoid')) #from 0 to 1

#optional, from 0 to 200 after using the sigmoid above
model.add(Lambda(lambda x: 200*x))
model.add(Dense(1))
model.add(Dense(1, activation='softplus'))