我已经在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])
有人对为什么会这样有任何想法吗?