如何使用TensorFlow计算平均平均精度(mAP)?

时间:2019-03-20 13:34:12

标签: python tensorflow

我想使用TensorFlow来计算哈希码的平均平均精度(mAP),但我不知道如何直接使用张量计算。

使用NumPy的代码如下:

import numpy as np
import time
import os
# read train and test binarayCode
CURRENT_DIR = os.getcwd()



def getCode(train_codes,train_groudTruth,test_codes,test_groudTruth):

    line_number = 0
    with open(CURRENT_DIR+'/result.txt','r') as f:
        for line in f:
            temp = line.strip().split('\t')
            if line_number < 10000:
                test_codes.append([i if i==1 else -1  for i in map(int, list(temp[0]))])
                list2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                list2[int(temp[1])] = 1
                test_groudTruth.append(list2) # get test ground truth(0-9)
            else:
                train_codes.append([i if i==1 else -1  for i in map(int, list(temp[0]))]) # change to -1, 1
                list2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                list2[int(temp[1])] = 1
                train_groudTruth.append(list2) # get test ground truth(0-9)

            line_number += 1
    print 'read data finish'

def getHammingDist(code_a,code_b):
    dist = 0
    for i in range(len(code_a)):
         if code_a[i]!=code_b[i]:
             dist += 1
    return dist 


if __name__ =='__main__':
    print getNowTime(),'start!'

    train_codes = []
    train_groudTruth =[]

    test_codes = []
    test_groudTruth = []
    # get g.t. and binary code
    getCode(train_codes,train_groudTruth,test_codes,test_groudTruth)
    train_codes = np.array(train_codes)
    train_groudTruth = np.array(train_groudTruth)
    test_codes = np.array(test_codes)
    test_groudTruth = np.array(test_groudTruth)
    numOfTest = 10000

    # generate hanmming martix, g.t. martix  10000*50000
    gt_martix = np.dot(test_groudTruth, np.transpose(train_groudTruth))
    print getNowTime(),'gt_martix finish!'
    ham_martix = np.dot(test_codes, np.transpose(train_codes)) # hanmming distance map to dot value 
    print 'ham_martix finish!'

    # sort hanmming martix,Returns the indices that would sort an array.
    sorted_ham_martix_index = np.argsort(ham_martix,axis=1)

    # calculate mAP
    print 'sort ham_matrix finished,start calculate mAP'

    apall = np.zeros((numOfTest,1),np.float64)
    for i in range(numOfTest):
        x = 0.0
        p = 0
        test_oneLine = sorted_ham_martix_index[i,:]
        length = test_oneLine.shape[0]
        num_return_NN = 5000 # top 1000
        for j in range(num_return_NN):
             if gt_martix[i][test_oneLine[length-j-1]] == 1: # reverse
                 x += 1
                 p += x/(j+1)
        if p == 0:
            apall[i]=0
        else:
            apall[i]=p/x

    mAP = np.mean(apall)
    print 'mAP:',mAP

我想使用张量操作(如tf.equal()tf.reduce_sum()等来重写上面的代码。

例如

我要计算图像的有效精度

logits = self._model(x_valid)
valid_preds = tf.argmax(logits, axis=1)
valid_preds = tf.to_int32(valid_preds)
self.valid_acc = tf.equal(valid_preds, y_valid)
self.valid_acc = tf.to_int32(self.valid_acc)
self.valid_acc = tf.to_float(tf.reduce_sum(self.valid_acc))/tf.to_float(self.batch_size)

我想用TensorFlow这样计算哈希码的平均平均精度(例如tf.XX操作)

我该怎么办?谢谢!

2 个答案:

答案 0 :(得分:0)

如果您只想基于验证集预测来计算平均精度,则可以在this scikit-learn function中使用预测概率向量和真标签向量。

如果您真的想使用张量流函数,则有一个张量流函数average_precision_at_k

有关平均精度的更多信息,请参见this article

答案 1 :(得分:0)

您可以只计算 y_score(或预测),然后使用 sklearn.metrics 计算平均精度:

from sklearn.metrics import average_precision_score

predictions = model.predict(x_test)
average_precision_score(y_test, predictions)