Keras:处理自定义皮尔逊相关度量的批量大小维度

时间:2017-09-08 11:52:33

标签: python machine-learning keras metric

我想为皮尔逊相关as defined here

创建自定义指标

我不确定如何将其应用于批次falsey_pred

我做了什么:

y_true

我是否有必要使用def pearson_correlation_f(y_true, y_pred): y_true,_ = tf.split(y_true[:,1:],2,axis=1) y_pred, _ = tf.split(y_pred[:,1:], 2, axis=1) fsp = y_pred - K.mean(y_pred,axis=-1,keepdims=True) fst = y_true - K.mean(y_true,axis=-1, keepdims=True) corr = K.mean((K.sum((fsp)*(fst),axis=-1))) / K.mean(( K.sqrt(K.sum(K.square(y_pred - K.mean(y_pred,axis=-1,keepdims=True)),axis=-1) * K.sum(K.square(y_true - K.mean(y_true,axis=-1,keepdims=True)),axis=-1)))) return corr 并手动处理批量维度并取其平均值?或者Keras会以某种方式自动执行此操作吗?

1 个答案:

答案 0 :(得分:4)

当您使用没有轴的K.mean时,Keras会自动计算整批的平均值。

后端已经具有标准偏差功能,因此使用它们可能更干净(也许更快)。

如果您的真实数据形如(BatchSize,1),我会说keep_dims是不必要的。否则,我不确定,测试结果会很好。

(我不明白你使用split的原因,但似乎也没必要。)

所以,我尝试这样的事情:

fsp = y_pred - K.mean(y_pred) #being K.mean a scalar here, it will be automatically subtracted from all elements in y_pred
fst = y_true - K.mean(y_true)

devP = K.std(y_pred)
devT = K.std(y_true)

return K.mean(fsp*fst)/(devP*devT)

如果与每个功能的丢失相关而不是将它们全部放在同一组中是相关的:

#original shapes: (batch, 10)

fsp = y_pred - K.mean(y_pred,axis=0) #you take the mean over the batch, keeping the features separate.   
fst = y_true - K.mean(y_true,axis=0) 
    #mean shape: (1,10)
    #fst shape keeps (batch,10)

devP = K.std(y_pred,axis=0)  
devt = K.std(y_true,axis=0)
    #dev shape: (1,10)

return K.sum(K.mean(fsp*fst,axis=0)/(devP*devT))
    #mean shape: (1,10), making all tensors in the expression be (1,10). 
    #sum is only necessary because we need a single loss value

总结十个特征的结果或取其平均值是相同的,是另一个的10倍(这与keras模型不太相关,仅影响学习率,但许多优化器很快找到了解决方法这个)。