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

我想创建一个自定义的皮尔逊相关系数度量,如这里所定义

我不确定如何将其应用于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) #这里的K.mean是一个标量,它会自动从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)

如果需要针对每个特征计算损失,而不是将它们全部放在同一组中,这可能是相关的:

#原始形状:(batch, 10)fsp = y_pred - K.mean(y_pred,axis=0) #你对批次取平均,保持特征分开。   fst = y_true - K.mean(y_true,axis=0)     #平均值形状:(1,10)    #fst形状保持(batch,10)devP = K.std(y_pred,axis=0)  devt = K.std(y_true,axis=0)    #标准差形状:(1,10)return K.sum(K.mean(fsp*fst,axis=0)/(devP*devT))    #平均值形状:(1,10),使表达式中的所有张量都为(1,10)。     #求和仅因为我们需要一个单一的损失值

对十个特征的结果求和或取平均是相同的,一个是另一个的十倍(这对Keras模型不是很重要,只影响学习率,但许多优化器很快就能找到解决方法)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注