2016-03-18 22 views
9

Tôi đang làm theo hướng dẫn trong this link và cố gắng thay đổi phương pháp đánh giá cho mô hình (ở dưới cùng). Tôi muốn để có được một đánh giá hàng đầu 5 và tôi đang cố gắng sử dụng để mã sau:TensorFlow in_top_k arguants đầu vào đánh giá đầu vào

topFiver=tf.nn.in_top_k(y, y_, 5, name=None) 

Tuy nhiên, điều này mang lại các lỗi sau:

File "AlexNet.py", line 111, in <module> 
    topFiver = tf.nn.in_top_k(pred, y, 5, name=None) 
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.py", line 346, in in_top_k 
    targets=targets, k=k, name=name) 
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 486, in apply_op 
    _Attr(op_def, input_arg.type_attr)) 
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 59, in _SatisfiesTypeConstraint 
    ", ".join(dtypes.as_dtype(x).name for x in allowed_list))) 
TypeError: DataType float32 for attr 'T' not in list of allowed values: int32, int64 

Theo như tôi có thể nói, vấn đề là tf.nn.in_top_k() chỉ hoạt động cho tf.int32 hoặc tf.int64 dữ liệu, nhưng dữ liệu của tôi ở định dạng tf.float32. Có cách giải quyết nào cho vấn đề này không?

Trả lời

19

Đối số targets đến tf.nn.in_top_k(predictions, targets, k) phải là một vectơ của ID lớp (tức là chỉ số cột trong ma trận predictions). Điều này có nghĩa là nó chỉ hoạt động đối với các vấn đề phân loại đơn lớp.

Nếu vấn đề của bạn là vấn đề một lớp, thì giả sử rằng y_ tensor của bạn là mã hóa một nóng của nhãn thực cho ví dụ của bạn (ví dụ: vì bạn cũng chuyển chúng sang dạng như tf.nn.softmax_cross_entropy_with_logits(). trường hợp, bạn có hai lựa chọn:.

  • Nếu nhãn ban đầu được lưu dưới dạng nhãn số nguyên, chuyển họ trực tiếp đến tf.nn.in_top_k() mà không cần chuyển đổi chúng sang một nóng (Ngoài ra, xem xét sử dụng tf.nn.sparse_softmax_cross_entropy_with_logits() như chức năng mất mát của bạn, bởi vì nó có thể hiệu quả hơn.)
  • Nếu nhãn ban đầu được lưu trữ trong một nóng định dạng, bạn có thể chuyển đổi chúng thành các số nguyên sử dụng tf.argmax():

    labels = tf.argmax(y_, 1) 
    topFiver = tf.nn.in_top_k(y, labels, 5) 
    
Các vấn đề liên quan