YOLO的Keras自定义损失功能

时间:2018-06-30 18:04:27

标签: python tensorflow keras

我正在尝试在Keras中定义自定义损失函数

def yolo_loss(y_true, y_pred):

此处y_true和y_pred的形状为[batch_size,19,19,5]。

对于该批次中的每张图像,我要将损失计算为:

loss =   
square(y_true[:,:,0] - y_pred[:,:,0])  
+ square(y_true[:,:,1] - y_pred[:,:,1])   
+ square(y_true[:,:,2] - y_pred[:,:,2])   
+ (sqrt(y_true[:,:,3]) - sqrt(y_pred[:,:,3]))  
+ (sqrt(y_true[:,:,4]) - sqrt(y_pred[:,:,4]))

我想到了几种方法,

1)使用for循环:

def yolo_loss(y_true, y_pred):
    y_ret = tf.zeros([1,y_true.shape[0]])
    for i in range(0,int(y_true.shape[0])):
        op1 = y_true[i,:,:,:]
        op2 = y_pred[i,:,:,:]
        class_error = tf.reduce_sum(tf.multiply((op1[:,:,0]-op2[:,:,0]),(op1[:,:,0]-op2[:,:,0])))
        row_error = tf.reduce_sum(tf.multiply((op1[:,:,1]-op2[:,:,1]),(op1[:,:,1]-op2[:,:,1])))
        col_error = tf.reduce_sum(tf.multiply((op1[:,:,2]-op2[:,:,2]),(op1[:,:,2]-op2[:,:,2])))
        h_error = tf.reduce_sum(tf.abs(tf.sqrt(op1[:,:,3])-tf.sqrt(op2[:,:,3])))
        w_error = tf.reduce_sum(tf.abs(tf.sqrt(op1[:,:,4])-tf.sqrt(op2[:,:,4])))
        total_error = class_error + row_error + col_error + h_error + w_error
        y_ret[0,i] = total_error
    return y_ret

这给我一个错误:

  

ValueError:无法将部分已知的TensorShape转换为Tensor:   (1,?)

这是因为我想批次大小是不确定的。

2)另一种方法是将sqrt变换应用于批处理中的每个图像张量,然后减去它们,然后应用平方变换。

例如

1) sqrt(y_true[:,:,:,3])  
2) sqrt(y_pred[:,:,:,3])  
3) sqrt(y_true[:,:,:,4])  
4) sqrt(y_pred[:,:,:,4])  
5) y_new = y_true-y_pred  
6) square(y_new[:,:,:,0])  
7) square(y_new[:,:,:,1])  
8) square(y_new[:,:,:,2])  
9) reduce_sum for each new tensor in the batch and return o/p in shape [1,batch_size]

但是我找不到在Keras中执行此操作的方法。

有人可以建议,什么是实现此损失功能的最佳方法。我在后端使用Tensorflow的Keras。

1 个答案:

答案 0 :(得分:1)

您可以浏览此git中心页面。

glGetShaderInfoLog