皮尔逊线性系数 keras
Posted
技术标签:
【中文标题】皮尔逊线性系数 keras【英文标题】:pearsons linear coefficient keras 【发布时间】:2018-06-18 15:57:47 【问题描述】:我尝试在 Keras 中将 pearsons 线性系数作为一个度量来实现,但是由于占位符,我无法使用这个度量来编译我的模型。
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
。我无法弄清楚如何解决它。发生这种情况是因为我想按元素将两个张量相乘,但形状中的批量大小在编译期间没有定义并表示为 ?形状为 (?,224,224,3)。有没有办法设置或解决它?
【问题讨论】:
你的目标是什么形状的? 也是 (?,224,224,3),因为我尝试将一个张量中的每个元素与其在另一个张量中的对应元素(相同索引)相乘 【参考方案1】:问题在于两个事实:
-
张量的第一个维度是批处理维度(这就是为什么在模型编译期间设置为
None
)。
您使用sum
和mean
的方式是在您的计算中也包含这个额外的维度。
您的 Pearson 相关损失应如下所示:
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
【讨论】:
嗯,好的,谢谢!但是,为什么 keras 的其他损失都没有重塑?例如github.com/keras-team/keras/blob/master/keras/losses.py 因为它们采用完全不同的y_true
和y_pred
形状。
嗯,它们也采用 (batch, inputchannels) 的形状,对吗?他们还能如何计算批次的损失?
您要精确计算什么相关性?通道对通道或整个图像?
灰度图像与灰度图像【参考方案2】:
所以我想通了,问题出在(K.count_params(n_y_true)-1))
,因为它将 n_y_true.shape 的每个元素相乘,并且因为 n_y_true 是从 y_true 派生的,所以它具有形状 (?,?,?)。
【讨论】:
【参考方案3】:最终功能:
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)
【讨论】:
以上是关于皮尔逊线性系数 keras的主要内容,如果未能解决你的问题,请参考以下文章
相关系数之皮尔逊pearson相关系数和斯皮尔曼spearman等级相关系数(评价线性关系的相关系数)(第二部分)
相关系数之皮尔逊pearson相关系数和斯皮尔曼spearman等级相关系数(评价线性关系的相关系数)(第二部分)
相关系数之皮尔逊pearson相关系数和斯皮尔曼spearman等级相关系数(评价线性关系的相关系数)(第二部分)