2016-06-10 107 views
13

我正在研究多標籤問題,並試圖確定我的模型的準確性。Tensorflow,多標籤準確性計算

我的模型:

NUM_CLASSES = 361 

x = tf.placeholder(tf.float32, [None, IMAGE_PIXELS]) 
y_ = tf.placeholder(tf.float32, [None, NUM_CLASSES]) 

# create the network 
pred = conv_net(x) 

# loss 
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(pred, y_)) 

# train step 
train_step = tf.train.AdamOptimizer().minimize(cost) 

我要計算在兩種不同的方式
精度 - 這是正確 預測的所有標籤% - 圖像%,所有標籤正確預測

不幸的是,我只能計算正確預測的所有標籤的百分比。

我想,所有的標籤都正確預測

correct_prediction = tf.equal(tf.round(pred), tf.round(y_)) 

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

和正確預測

pred_reshape = tf.reshape(pred, [ BATCH_SIZE * NUM_CLASSES, 1 ]) 
y_reshape = tf.reshape(y_, [ BATCH_SIZE * NUM_CLASSES, 1 ]) 

correct_prediction_all = tf.equal(tf.round(pred_reshape), tf.round(y_reshape)) 

accuracy_all = tf.reduce_mean(tf.cast(correct_prediction_all, tf.float32)) 

莫名其妙標籤的一致性所有標籤的這段代碼%這個代碼將計算出的圖像%屬於一個圖像丟失,我不知道爲什麼。

回答

18

我相信你的代碼中的錯誤在:correct_prediction = tf.equal(tf.round(pred), tf.round(y_))

pred應該是未換算的logits(即沒有最終sigmoid)。

這裏要比較的sigmoid(pred)y_輸出(無論是在間隔[0, 1]),所以你必須寫:

correct_prediction = tf.equal(tf.round(tf.nn.sigmoid(pred)), tf.round(y_)) 

然後計算:

  • 平均精度在所有標籤上:
accuracy1 = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
  • 精度,所有標籤必須是正確的:
all_labels_true = tf.reduce_min(tf.cast(correct_prediction), tf.float32), 1) 
accuracy2 = tf.reduce_mean(all_labels_true) 
+0

由於用得好好的,難道我理解正確的是reduce_min包一個圖像的所有標籤一起? – MaMiFreak

+0

這將對批次中的每個元素採用correct_prediction的最小值。如果所有的元素都是1(即所有的預測都是正確的),那麼這個最小值爲1,如果至少有一個元素是假的(並且等於0),那麼這個最小值爲1 –

+0

我試過這種方法,但是對於每個時期我都得到相同的準確度值:準確度:0.984375測試準確度:0.984375'。任何想法爲什麼發生這種情況https://stackoverflow.com/questions/49210520/cant-get-correct-acccuracy-for-multi-label-prediction – Peterdk