在Keras中置换成本函数

时间:2018-05-19 11:52:07

标签: r keras loss-function

目前我尝试预测Keras R中图像中某些物体的位置。我只对物体的中心感兴趣,所以我尝试预测图像中的中心坐标(x_center,y_center)。我假设我的图像中最多有两个这样的对象。因此,我的学习目标是向量:

label = c(x_center_1, y_center_1, x_center_2, y_center_2)

常见的损失函数“mean_squared_error”不起作用,因为可以在不更改事物的情况下置换前两个和后两个。

我正在寻找的洛杉矶是

min( rmse(output, c(x_center_1, y_center_1, x_center_2, y_center_2)),  rmse(output, c( x_center_2, y_center_2, x_center_1, y_center_1))

其中rmse是均方根误差函数,输出是我模型的输出。

我认为我需要实现一个自定义的疯狂损失的方法是定义一个丢失函数LOSS,然后像这样插入它

compile(model, loss=LOSS, optimizer=opt, metrics = "accuracy")

为此,我需要使用Keras后端函数编写以下函数

rmse = function(v1,v2){
sqrt(sum(  (v1- v2)^2 )/ length(v1) )
}

LOSS = function(label, output){
min( rmse(output,  label  ),  rmse(output, label[c(3,4,1,2)])  )
}

当我试图让排列标签[c(3,4,1,2)])起作用时,我特别陷入困境。

我是否以正确的方式解决了这个问题?如何在Keras后端置换矢量?

2 个答案:

答案 0 :(得分:0)

没有明确的置换函数,但为此目的,gather(reference, indices)将检索张量indices中“索引reference的元素”。因此,您可以将其用于K.gather(label, [3,4,1,2])以获取所需的矢量doc

答案 1 :(得分:0)

谢谢。我将损失函数设为如下

rmse = function(v1,v2){
return(  k_sum(  k_square( layer_subtract( list(v1, v2) )) )  )
}

loss = function(label, output){
output_1 =  output[,1:2]
output_2 =  output[,3:4]
output_new = k_concatenate( list(output_2, output_1))
return(k_minimum( rmse(output,  label  ),  rmse(output_new,  label )  ))
}

这似乎工作正常。广播和连接张量似乎比收集它们更好。