Keras

时间:2017-12-05 09:04:12

标签: tensorflow keras loss-function

我正在尝试编写自定义Keras丢失函数,但我遇到了实现和调试代码的问题。我的目标载体是:

y_pred = [p_conf, p_class_1, p_class_2]

其中,p_conf =置信度检测到感兴趣的事件

y_true示例:

[0, 0, 0] = no event of interest
[1, 1, 0] = first class event
[1, 0, 1] = second class event

我使用多标签分类获得了相对较好的结果(即在我的最后一层使用sigmoid激活和binary_crossentropy损失函数)但我想使用自定义损失函数来实验和改进我的结果,该函数计算:

  1. 当y_true = [0,...,...]
  2. 时,binary_crossentropy丢失
  3. 当y_true = [1,...,...]
  4. 时分类_crossentropy损失

    这是YOLO对象检测算法使用的简化损失函数。我尝试调整an existing Keras / TensorFlow implementation of the YOLO loss function,但没有成功。

    这是我目前的工作代码。它运行但产生不稳定的结果。即损失和准确性随时间降低。非常感谢任何帮助。

    import tensorflow as tf
    from keras import losses
    
    def custom_loss(y_true, y_pred):
    
        # Initialisation
        mask_shape = tf.shape(y_true)[:0]
        conf_mask = tf.zeros(mask_shape)    
        class_mask = tf.zeros(mask_shape)
    
        # Labels
        true_conf = y_true[..., 0]
        true_class = tf.argmax(y_true[..., 1:], -1)
    
        # Predictions
        pred_conf = tf.sigmoid(y_pred[..., 0])
        pred_class = y_pred[..., 1:]   
    
        # Masks for selecting rows based on confidence = {0, 1}
        conf_mask = conf_mask + (1 - y_true[..., 0])
        class_mask = y_true[..., 0]
    
        nb_class = tf.reduce_sum(tf.to_float(class_mask > 0.0))
    
        # Calculate loss
        loss_conf = losses.binary_crossentropy(true_conf, pred_conf)
        loss_class = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=true_class, logits=pred_class)
        loss_class = tf.reduce_sum(loss_class * class_mask) / nb_class
    
        loss = loss_conf + loss_class
    
        return loss
    

0 个答案:

没有答案