tf中tf.metrics 坑


作者:知乎用戶
鏈接:https://www.zhihu.com/question/277184041/answer/480219663

其中第一份資料的PPT里有一張圖,我覺得很形象。看了這張圖,我算大概理解了AP的計算。

AP precision 不同的原因就是 AP 考慮了 recall 的因素,我理解的AP的概念就是同一個推薦系統內,針對不同的 recall (0.10--1.00)值記錄一個對應的 precision,然后計算所有 recall 值對應 precision的平均值。上圖的 AP值 即為 10個灰色部分的precision之和除以10,得到最終結果0.76。

mAP的計算,我是看到這張圖,才有點理解的。

扯了一堆,說回tf.metrics.sparse_average_precision_at_k,去Github上找了一下這個函數,然后發現在新的版本中,其實用的是average_precision_at_k 這個函數,然后它的主要參數如下:

labels, predictions, k, weights, metrics_ collections, updates_collections, name

我覺得就是重點關注 labels, predictions, k,給一個例子,這個例子是我搜遍整個谷歌,最后在

Github的issue找到的。

import tensorflow as tf import numpy as np y_true = np.array([[2], [1], [0], [3], [0], [1]]).astype(np.int64) y_true = tf.identity(y_true) y_pred = np.array([[0.1, 0.2, 0.6, 0.1], [0.8, 0.05, 0.1, 0.05], [0.3, 0.4, 0.1, 0.2], [0.6, 0.25, 0.1, 0.05], [0.1, 0.2, 0.6, 0.1], [0.9, 0.0, 0.03, 0.07]]).astype(np.float32) y_pred = tf.identity(y_pred) _, m_ap = tf.metrics.sparse_average_precision_at_k(y_true, y_pred, 2) sess = tf.Session() sess.run(tf.local_variables_initializer()) stream_vars = [i for i in tf.local_variables()] print((sess.run(stream_vars))) tf_map = sess.run(m_ap) print(tf_map) tmp_rank = tf.nn.top_k(y_pred,4) print(sess.run(tmp_rank))
  1. 簡單解釋一下,首先y_true代表標簽值(未經過one-hot)shape:(batch_size, num_labels) ,y_pred代表預測值(logit值) ,shape:(batch_size, num_classes)
  2. 其次,要注意的是tf.metrics.sparse_average_precision_at_k中會采用top_k根據不同的k值對y_pred進行排序操作 ,所以tmp_rank是為了幫助大噶理解究竟y_pred在函數中進行了怎樣的轉換。
  3. 然后,stream_vars = [i for i in tf.local_variables()]這一行是為了幫助大噶理解 tf.metrics.sparse_average_precision_at_k創建的tf.local_varibles 實際輸出值,進而可以更好地理解這個函數的用法。
  4. 具體看這個例子,當k=1時,只有第一個batch的預測輸出是和標簽匹配的 ,所以最終輸出為:1/6 = 0.166666 ;當k=2時,除了第一個batch的預測輸出,第三個batch的預測輸出也是和標簽匹配的,所以最終輸出為:(1+(1/2))/6 = 0.25


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM