自定义Keras损失在训练时会带来不同的结果

时间:2020-01-31 05:41:55

标签: python tensorflow machine-learning keras computer-vision

我已经在Keras中为YOLO模型创建了自定义损失函数。但是,在损失过程中,与在训练之外使用损失函数相比,得到的结果有所不同。

这是我的自定义损失:

@tf.function 
def yolo_loss(y_pred,y_true):

    pred_boxes = y_pred[...,:4]
    true_boxes = y_true[...,:4]

    # use boxes to get proper xy and wh as from the paper
    pred_cx,pred_cy = get_all_centers(pred_boxes)
    true_cx,true_cy = get_all_centers(true_boxes)

    pred_w,pred_h = get_wh(pred_boxes)
    true_w,true_h = get_wh(true_boxes)

    # create masks
    pred_confs = y_pred[...,4]
    true_confs = y_true[...,4] # this is equivalent to 1obj from the paper... it will be 1 if there is supposed to be something there


    obj = true_confs.__copy__()
    noobj = tf.where(obj==0,1,0)
    noobj = tf.cast(noobj,tf.float32)

    pred_clss  = y_pred[...,5:]
    true_clss  = y_true[...,5:]

    xy_loss = K.sum(obj*(
            ((pred_cx-true_cx)**2)
            +
            ((pred_cy-true_cy)**2)))

    wh_loss = K.sum(obj*(((pred_w-true_w)**2)+
                         ((pred_h-true_h)**2)))

    loc_loss = xy_loss+wh_loss

    conf_loss =K.sum(obj*(pred_confs-true_confs)**2)\
               +\
               K.sum(noobj*(pred_confs-true_confs)**2)


    cls_loss = K.sum(obj*(K.sum((pred_clss-true_clss)**2,axis=-1)))

    loss = loc_loss+conf_loss+cls_loss


    tf.print(xy_loss)
    tf.print(wh_loss)
    tf.print(conf_loss)
    tf.print(cls_loss)

    return loss

4个数字代表损失函数的不同部分。代码在这里可用:https://github.com/GoldwinXS/custom_yolo

输出看起来像这样(问题发生之前,我已经删除了一些文本):

640/1000 [================== .....]-ETA:8秒-损失:237.2000

0

0

231

0

768/1000 [===================== .......]]-ETA:5秒-损失:236.1667

0

0

235

0

896/1000 [========================= ....]-ETA:2秒-损失:236.0000

0

0

194

0

1000/1000 [==============================]-25s 25ms / step-损失:231.6320

然后在训练后打电话给我的自定义损失时,我得到:

1561.9729

694.685425

1846

9304.88672

一个人应该可以通过运行MyYoloTest.py来重现这一点

有人知道为什么会发生这种情况吗?

编辑:经过很多痛苦后,我发现y_pred进入具有TensorShape([None,None,None,None])形状的损失函数中 而y_true具有预期的形状:TensorShape([None,3,3,8])

有人对为什么会这样有任何想法吗?

0 个答案:

没有答案