【问题标题】:Keras: handling batch size dimension for custom pearson correlation metricKeras:处理自定义 pearson 相关指标的批量大小维度
【发布时间】:2017-09-08 11:52:33
【问题描述】:

我想为 pearson 相关性as defined here 创建一个自定义指标

我不确定如何将其准确应用于 y_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

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

【问题讨论】:

  • 你的y_training var 是什么形状的?
  • 对不起... [batchsize x 10]
  • 每个样本十个特征?
  • 这是一个预测 10 个值的向量的回归。所以 y_true, y_pred 样本的维度是 10。
  • 我不是一个学过足够统计学的人...所以,你想把这个公式分别应用于这 10 个特征中的每一个(这是split 的目的吗?)还是它可以一次将公式应用于所有这些吗? -- 如果第二个选项没问题,我的回答应该没问题。如果没有,我可以尝试纠正它以瞄准正确的轴。

标签: python machine-learning keras metric


【解决方案1】:

当您使用不带轴的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 模型不太相关,只影响学习率,但许多优化器很快就找到了解决方法这)。

【讨论】:

  • 我正在尝试做同样的事情,但就我而言,我预测的是单个输出。当我尝试运行 model.evaluate() 时使用上述任一方法时,我得到“nan”。你能给我一些关于如何调试的提示吗?我可以让这样的自定义指标正常工作:def my_mse(ytrue, y_pred): return K.mean(K.square(y_pred-y_true), axis =1)。我尝试将axis = 1放在上面,但仍然得到'nan'。我还添加了零分母检查,如果是则返回 0 以消除这种可能性。非常感谢任何帮助。
  • 如果你只有一个样本,很可能你没有任何偏差或统计数据。
  • 谢谢。我刚刚检查了 model.fit 的输出,我可以看到正在计算的所有相关性,它们看起来是正确的。所以很明显 model.evaluate() 按照你的建议一次只做一个样本。
  • 通常的原因是无效数据或图层中的无效结果。但是有很多可能性。有时,例如,您会在某处得到一条充满零的行,或者一些不可能的除法/根等。
  • 根据 Keras 评估的描述,它说它在默认的 32 批次中执行,这应该有效吗?我的测试向量要长得多。所以我很困惑为什么它似乎在 model.fit() 中有效,但在 model.evaluate() 中无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多