Tensorflow Precision@K作为Keras中的自定义指标

Tensorflow Precision@K作为Keras中的自定义指标,tensorflow,keras,Tensorflow,Keras,我包括Precision@K作为Keras中的自定义度量。根据 我只需要使用Keras后端计算一个函数,并在编译步骤中传递它 仅使用Numpyprecision@k可按以下示例计算: def precisionatk(y_true,y_pred,k) precision_average = [] idx = (-y_pred).argsort(axis=-1)[:,:k] for i in range(idx.shape[0]): precision_s

我包括Precision@K作为Keras中的自定义度量。根据

我只需要使用Keras后端计算一个函数,并在编译步骤中传递它

仅使用
Numpy
precision@k可按以下示例计算:

def precisionatk(y_true,y_pred,k)
    precision_average = []
    idx =  (-y_pred).argsort(axis=-1)[:,:k]
    for i in range(idx.shape[0]):
        precision_sample = 0
        for j in idx[i,:]:
            if y_true[i,j] == 1:
                precision_sample += 1
        precision_sample = precision_sample / k
        precision_average.append(precision_sample)
    return np.mean(precision_average)


y_true = np.array([[0,0,1,0],[1,0,1,0]])
y_pred = np.array([[0.1,0.4,0.8,0.2],[0.3,0.2,0.5,0.1]])

print(precisionatk(y_true,y_pred,2))

0.75
那么,如何将其转换为Keras后端


编辑:我正在处理一个多标签问题,y_真值总是一个包含1或0的数组,y_预测每个类别的概率

有一个
Percision@K
tf
中。你可以在这里找到它。了解如何在keras中使用
tf
指标,请参阅本文。谢谢,但我认为tf的
precision\u at_k
甚至考虑了真实值的前k(这将是一天结束时的第一个k指数)。例如,如果在prediction@k= 1在索引10中有最高的分数,但是在真正的y中有一个是0个索引,在第十中,它将计算一个零的精度,因为它将被认为是真正的索引0。Percision@K在
tf
中。你可以在这里找到它。了解如何在keras中使用
tf
指标,请参阅本文。谢谢,但我认为tf的
precision\u at_k
甚至考虑了真实值的前k(这将是一天结束时的第一个k指数)。例如,如果在prediction@k=1我在索引10中具有最高的分数,但是在真正的y中有一个是0个索引,在第十中,它将计算一个零的精度,因为它将被认为是真正的索引0。
def precisionatk(y_true,y_pred,k)
    precision_average = []
    idx =  (-y_pred).argsort(axis=-1)[:,:k]
    for i in range(idx.shape[0]):
        precision_sample = 0
        for j in idx[i,:]:
            if y_true[i,j] == 1:
                precision_sample += 1
        precision_sample = precision_sample / k
        precision_average.append(precision_sample)
    return np.mean(precision_average)


y_true = np.array([[0,0,1,0],[1,0,1,0]])
y_pred = np.array([[0.1,0.4,0.8,0.2],[0.3,0.2,0.5,0.1]])

print(precisionatk(y_true,y_pred,2))

0.75