Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现用于对象检测的自定义丢失函数_Python_Tensorflow_Keras_Object Detection - Fatal编程技术网

Python 实现用于对象检测的自定义丢失函数

Python 实现用于对象检测的自定义丢失函数,python,tensorflow,keras,object-detection,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 obj

我是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而不是1000作为“image exist”参数。
您可以操纵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在这种情况下不会很好地工作,并在达到满意结果之前一直使用惩罚。

您是否使用大小为1的批次?(假设使用大小为5的遮罩时)没有批量大小不是1,我想会为每个图像计算损失函数吗?事实上,批量大小是16@OrDinari I将批量大小更改为1,现在损失仅为0-否change@OrDinari,如果类不是1,是否可以避免均方项。另外,您是否建议尝试在SGD上使用相同的代码?(PS:激活功能为ReLU)@Kitwradr是。批量大小无关紧要。@Shobhit Kumar,如果您喜欢使用不同于均方的损失函数,您可以使用您喜欢的任何损失函数。关于SGD,我只会在这种情况下使用SGD,根据我的经验,不同的优化器不能很好地处理上述“惩罚”。一般来说,我认为正确的解决方案是为输出设置两个磁头(4个参数和“present”),这将允许您轻松使用不同的激活函数和损耗函数。但是,它取决于域,因此可能不是最佳解决方案。@ShobhitKumar这是一个广泛的教程:,下面是stackoverflow:@或Dinari的一些玩具示例,非常感谢您的帮助。我成功地创建了我的网络