python - Keras:处理自定义 PIL 逊相关指标的批量大小维度

标签 python machine-learning keras metric

我想为 PIL 逊相关性创建自定义指标 as defined here

我不确定如何将它准确地应用于 y_predy_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

我是否有必要使用 keepdims 并手动处理批处理维度并取平均值?或者 Keras 是否以某种方式自动执行此操作?

最佳答案

当您在没有轴的情况下使用 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

将十个特征的结果相加或取平均值是一样的,一个乘以另一个(这与keras模型关系不大,只影响学习率,但许多优化器很快找到了解决方法这)。

关于python - Keras:处理自定义 PIL 逊相关指标的批量大小维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46115896/

相关文章:

Python 数据模型 : confused again with classmethod

python - 使用 selenium 根据输入点击链接 [python]

python - 与敌人碰撞时减去生命不工作pygame

machine-learning - label_binarize 不适合 sklearn 朴素贝叶斯分类器显示错误的输入形状

python - 如何在不隐藏任务栏的情况下全屏显示 matplotlib 屏幕 - Python

python - 如何执行 ngram 到 ngram 关联

machine-learning - 无法理解 Keras ConvLSTM2D - 已编辑

tensorflow - Conv1D(filters=N, kernel_size=K) 与 Dense(output_dim=N) 层

tensorflow - 损失函数设计为假阳性和假阴性结合不同的权重

python - 为什么没有定义类别的图像的预测概率如此高?