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 atf.nn.in_top_k()
sin convertirlos a uno solo. (Además, considere usartf.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)