2016-06-10 19 views
13

Tôi đang làm việc trên một vấn đề đa nhãn và tôi đang cố gắng để xác định tính chính xác của mô hình của tôi.Tensorflow, tính toán độ chính xác đa nhãn

mô hình của tôi:

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) 

tôi muốn để tính toán chính xác theo hai cách khác nhau
-% của tất cả các nhãn được dự đoán một cách chính xác -% hình ảnh nơi tất cả các nhãn được dự đoán một cách chính xác

tiếc là tôi chỉ có thể tính% của tất cả các nhãn được dự đoán chính xác.

Tôi nghĩ mã này sẽ tính toán% các hình ảnh mà tất cả các nhãn được dự đoán một cách chính xác

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

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

và mã% này của tất cả các nhãn được dự đoán một cách chính xác

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)) 

bằng cách nào đó xã hội dân sự của các nhãn thuộc về một hình ảnh bị mất và tôi không chắc chắn tại sao.

Trả lời

18

Tôi tin rằng lỗi trong mã của bạn là: correct_prediction = tf.equal(tf.round(pred), tf.round(y_)).

pred phải là nhật ký chưa được đánh số (nghĩa là không có hình sigmoid cuối cùng).

Ở đây bạn muốn so sánh đầu ra của sigmoid(pred)y_ (cả trong khoảng [0, 1]) vì vậy bạn phải viết:

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

Sau đó, để tính toán:

  • trung bình chính xác trên tất cả các nhãn:
accuracy1 = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
  • Độ chính xác nơi tất cả các nhãn cần phải chính xác:
all_labels_true = tf.reduce_min(tf.cast(correct_prediction), tf.float32), 1) 
accuracy2 = tf.reduce_mean(all_labels_true) 
+0

Nhờ hoạt động giống như một nét duyên dáng, để tôi hiểu một cách chính xác rằng reduce_min gói tất cả các nhãn của một hình ảnh lại với nhau? – MaMiFreak

+0

Nó sẽ tối thiểu là correct_prediction cho mỗi phần tử của lô. Mức tối thiểu này là 1 nếu tất cả các phần tử là 1 (nghĩa là tất cả các dự đoán là chính xác) và 0 nếu ít nhất một phần tử là False (và bằng 0) –

+0

Tôi đã thử phương pháp này, nhưng tôi nhận được cùng một giá trị chính xác cho mỗi kỷ nguyên: độ chính xác: 0.984375 Độ chính xác kiểm tra: 0.984375'. Bất kỳ ý tưởng tại sao điều này xảy ra? https://stackoverflow.com/questions/49210520/cant-get-correct-acccuracy-for-multi-label-prediction – Peterdk

Các vấn đề liên quan