皮尔逊线性系数克拉斯



我试图在 Keras 中将皮尔逊线性系数实现为指标,但由于占位符,我无法使用这个指标编译我的模型。

def CC(y_true, y_pred):
y_true = K.clip(y_true, K.epsilon(), 1)
y_pred = K.clip(y_pred, K.epsilon(), 1)
n_y_true=y_true/(K.sum(y_true)+K.epsilon())
n_y_pred=y_pred/(K.sum(y_pred)+K.epsilon())
y_true_average=K.mean(y_true)
y_pred_average=K.mean(y_pred)
print((K.map_fn(lambda x: x-y_pred_average,n_y_pred)).shape[0])
if not(K.map_fn(lambda x: x-y_pred_average,n_y_pred)).shape[0]==None:
    return (K.sum(K.dot((K.map_fn(lambda x: x-y_pred_average,n_y_pred)),(K.map_fn(lambda x: x-y_true_average,n_y_true))))/(K.count_params(n_y_true)-1))/(K.dot(K.std(n_y_pred),K.std(n_y_true)))
else:
    return 0

我尝试使用 K.dot 而不是 *,但仍然存在相同的错误。在编译过程中,我收到错误unsupported operand type(s) for *: 'NoneType' and 'NoneType.而且我不知道如何解决它。发生这种情况是因为我想元素地乘以两个张量,但在编译过程中没有定义形状中的 batchsize 并表示为 ?呈 (?,224,224,3( 的形状。有没有办法设置或解决它?

问题在于两个事实:

  1. 张量的第一个维度是批处理维度(这就是为什么在模型编译期间设置为 None (。
  2. 您使用summean的方式,即在计算中也包含此附加维度。

您的皮尔逊相关损失应如下所示:

def pearson_loss(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), 1)
    y_pred = K.clip(y_pred, K.epsilon(), 1)
    # reshape stage
    y_true = K.reshape(y_true, shape=(-1, 224 * 224 * 3))
    y_pred = K.reshape(y_pred, shape=(-1, 224 * 224 * 3))
    # normalizing stage - setting a 0 mean.
    y_true -= y_true.mean(axis=-1)
    y_pred -= y_pred.mean(axis=-1)
    # normalizing stage - setting a 1 variance
    y_true = K.l2_normalize(y_true, axis=-1)
    y_pred = K.l2_normalize(y_pred, axis=-1)
    # final result
    pearson_correlation = K.sum(y_true * y_pred, axis=-1)
    return pearson_correlation

最后一个函数:

def CC(y_true, y_pred):

    #normalise
    n_y_true = (y_true - K.mean(y_true[:])) / K.std(y_true[:])
    n_y_pred = (y_pred - K.mean(y_pred[:])) / K.std(y_pred[:])  
    top=K.sum((n_y_true[:]-K.mean(n_y_true[:]))*(n_y_pred[:]-K.mean(n_y_pred[:])),axis=[-1,-2])
    bottom=K.sqrt(K.sum(K.pow((n_y_true[:]-K.mean(n_y_true[:])),2),axis=[-1,-2])*K.sum(K.pow(n_y_pred[:]-K.mean(n_y_pred[:]),2),axis=[-1,-2]))
    result=top/bottom

    return K.mean(result)

所以我想通了,问题(K.count_params(n_y_true)-1))因为它乘以 n_y_true.shape 的每个元素,并且因为它是从y_true派生出来的,n_y_true所以它具有形状 (?,?,?(。

相关内容

  • 没有找到相关文章

最新更新