variable subprograma que programacion procedimientos procedimiento paso función funciones funcion está entre ejercicios diferencia dentro declarada argumentos algoritmos tensorflow

subprograma - TensorFlow in_top_k argumentos de entrada de evaluación



paso de argumentos (1)

Estoy siguiendo el tutorial en este enlace e intento cambiar el método de evaluación para el modelo (en la parte inferior). Me gustaría obtener una evaluación de los 5 primeros y estoy tratando de utilizar el siguiente código:

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

Sin embargo, esto produce el siguiente error:

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

Por lo que puedo decir, el problema es que tf.nn.in_top_k() solo funciona para los datos tf.int32 o tf.int64 , pero mis datos están en formato tf.float32 . ¿Hay alguna solución para esto?


El argumento de los targets para tf.nn.in_top_k(predictions, targets, k) debe ser un vector de ID de clase (es decir, índices de columnas en la matriz de predictions ). Esto significa que solo funciona para problemas de clasificación de una sola clase.

Si su problema es de una sola clase, supongo que su tensor y_ es una codificación única de las etiquetas verdaderas para sus ejemplos (por ejemplo, porque también los pasa a una tf.nn.softmax_cross_entropy_with_logits() como tf.nn.softmax_cross_entropy_with_logits() . En ese caso, tienes dos opciones:

  • Si las etiquetas se almacenaron originalmente como etiquetas enteras, tf.nn.in_top_k() directamente a tf.nn.in_top_k() sin convertirlos a uno solo. (Además, considere usar tf.nn.sparse_softmax_cross_entropy_with_logits() como su función de pérdida, porque puede ser más eficiente).
  • Si las etiquetas se almacenaron originalmente en el formato único, puede convertirlas en enteros usando tf.argmax() :

    labels = tf.argmax(y_, 1) topFiver = tf.nn.in_top_k(y, labels, 5)