实现用于对象检测的自定义丢失功能

时间:2018-11-06 17:10:15

标签: python tensorflow keras object-detection

我是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中运行时的损失值迅速降低,到第2个时期,损失变为0。

1 个答案:

答案 0 :(得分:3)

首先,我建议对“ image exist”参数使用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 ,亚当在这种情况下将无法很好地工作,并且要付出一定的代价,直到获得满意的结果。

相关问题