【发布时间】:2018-01-20 12:17:09
【问题描述】:
我目前正在尝试实现具有二进制结果的自定义损失函数(精度),但 Tensorflow 后端拒绝使用生成“0”或“1”所必需的圆形函数。
据我调查,这是因为 Tensorflow 将轮次的梯度定义为 None 并且损失函数不能返回 None。
我目前已实现此自定义损失,以在 R Keras 界面中创建尽可能接近的“0”或“1”。
precision_loss<-function(y_true,y_pred){
y_pred_pos = K$clip(y_pred, 0, 1)
#Custom sigmoid to generate '0' '1'
y_pred_pos = K$maximum(0,K$minimum(1,(y_pred_pos+0.0625)/0.125))
y_pred_neg = 1 - y_pred_pos
y_pos = K$clip(y_true, 0, 1)
#Custom sigmoid to generate '0' '1'
y_pos = K$maximum(0,K$minimum(1,(y_pos+0.0625)/0.125))
y_neg = 1 - y_pos
#Generate confusion matrix counts
tp = K$sum(y_pos*y_pred_pos)
tn = K$sum(y_neg*y_pred_neg)
fp = K$sum(y_neg*y_pred_pos)
fn = K$sum(y_pos*y_pred_neg)
return(1-(tp/(tp+fp+K$epsilon())))
}
注意“sigmoid”:K$maximum(0,K$minimum(1,(y_pos+0.0625)/0.125))
我想要实现的是一个解决方法:
precision_loss<-function(y_true, y_pred){
y_pred_pos = K$round(K$clip(y_pred, 0, 1))
y_pred_neg = 1 - y_pred_pos
y_pos = K$round(K$clip(y_true, 0, 1))
y_neg = 1 - y_pos
#Generate confusion matrix counts
tp = K$sum(K$clip(y_pos * y_pred_pos,0,1))
tn = K$sum(K$clip(y_neg * y_pred_neg,0,1))
fp = K$sum(K$clip(y_neg * y_pred_pos,0,1))
fn = K$sum(K$clip(y_pos * y_pred_neg,0,1))
return(1-(tp/(tp+fp+K$epsilon())))
}
你们中的一些人有另一种实现,而不使用轮来在损失函数中生成二元结果?
PD:在自定义指标函数中允许轮次
【问题讨论】:
标签: tensorflow machine-learning deep-learning keras loss