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

так или иначе согласованность ярлыков, принадлежащих одному изображению, теряется, и я не уверен, почему.

Ответ 1

Я считаю, что ошибка в вашем коде: correct_prediction = tf.equal( tf.round( pred), tf.round( y_ ) ).

pred должны быть немасштабированными логитами (т.е. без окончательного сигмоида).

Здесь вы хотите сравнить выходные данные 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)

Ответ 2

# to get the mean accuracy over all labels, prediction_tensor are scaled logits (i.e. with final sigmoid layer)
correct_prediction = tf.equal( tf.round( prediction_tensor ), tf.round( ground_truth_tensor ) )
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# to get the mean accuracy where all labels need to be correct
all_labels_true = tf.reduce_min(tf.cast(correct_prediction, tf.float32), 1)
accuracy2 = tf.reduce_mean(all_labels_true)

ссылка: https://gist.github.com/sbrodehl/2120a95d57963a289cc23bcfb24bee1b