【问题标题】:Implementing a custom loss function for object detection为对象检测实现自定义损失函数
【发布时间】:2019-04-10 03:09:16
【问题描述】:

我是 keras 和 tensorflow 的新手。如何在进行对象检测时实现自定义损失函数,现在我有 5 个参数 - 4 个用于边界框坐标,1 个用于对象是否存在。 如果对象存在,损失函数应该返回坐标差的平方,否则如果对象不存在,它应该返回一个巨大的损失值。这是我现在正在尝试的代码:

def loss_func(y_true,y_pred):
  mask = np.array([False, False, False,False,True])   # check column of the class of object
  mask1 = np.array([True, True, True,True,False])     # get the columns of the coordinates of B box
  check_class = K.mean(K.square(tf.subtract(tf.boolean_mask(y_true,mask),tf.boolean_mask(y_pred,mask))))
  mean_square = K.mean(K.square(tf.subtract(tf.boolean_mask(y_true,mask1),tf.boolean_mask(y_pred,mask1))))
  value=K.mean(tf.boolean_mask(y_pred,mask))

  return value*mean_square + check_class

这里我屏蔽了其他值以获得最后一个值,即 1000--> 对象存在 0 --> 对象不存在。 还有其他更好的方法吗?

当我在 Kaggle 中运行时,损失值迅速下降,到第二个时期损失变为 0。

【问题讨论】:

  • 您是否使用大小为 1 的批次? (假设您使用大小为 5 的掩码)
  • No batch size 不是 1 ,我以为每张图片都会计算损失函数?事实上批量大小是 16
  • @Or Dinari 我将批量大小更改为 1 ,现在损失仅为 0 - 没有变化

标签: python tensorflow keras object-detection


【解决方案1】:

首先,我建议“图像存在”参数使用 1 而不是 1000。
您可以操纵 y_true 和 y_pred。

penalty = 100

def lf(y_true,y_pred):
    mean_square = tf.keras.losses.mean_squared_error(y_true[:,0:4], y_pred[:,0:4])
    check_class = tf.subtract(y_true[:,4], y_pred[:,4])
    check_class = check_class * -penalty
    check_class = tf.keras.backend.mean(check_class)
    return mean_square + check_class

上述函数首先检查前4个参数的均方误差。
第二部分然后检查“present”参数。
如果它们不同,则输出-1,如果它们相同,则输出0。
然后它使用惩罚来惩罚错误的参数。

通过一些常数使用“惩罚”可能很难训练。我建议将优化器更改为 SGD,adam 在这种情况下将无法正常工作,并使用惩罚直到达到令人满意的结果。

【讨论】:

  • @Or Dinari ,如果类不是 1,是否可以避免 mean_square 项。另外,您是否建议尝试在 SGD 上使用相同的代码? (PS:激活函数是ReLU)
  • @Kitwradr 是的。批量大小无关紧要。
  • @Shobhit Kumar,您可以使用您喜欢的任何损失函数,如果您喜欢与均方不同的东西。关于 SGD,我只会在这种情况下使用 SGD,根据我的经验,不同的优化器不能很好地处理上述的“惩罚”。通常,我认为正确的解决方案是输出 2 个磁头(4 个参数和“当前”),这将允许您轻松使用不同的激活函数和损失函数。但是,这取决于域,因此它可能不是最佳解决方案。
  • @ShobhitKumar 这是一个详尽的教程:pyimagesearch.com/2018/06/04/…,这里是来自 stackoverflow 的一些玩具示例:stackoverflow.com/questions/44036971/multiple-outputs-in-keras
  • @Or Dinari 非常感谢您的帮助。我能够成功地创建我的网络
猜你喜欢
  • 1970-01-01
  • 2017-08-20
  • 2021-10-25
  • 2021-07-27
  • 1970-01-01
  • 2019-12-16
  • 2019-06-13
  • 2020-07-29
  • 1970-01-01
相关资源
最近更新 更多