Расчет точности в многослойной классификации - PullRequest
0 голосов
/ 29 апреля 2018

Я использую тензор потока в наборе данных MSCOCO, который имеет 80 различных классов, и каждое изображение может содержать более одного класса (несколько меток), это смоделировано в моих входных данных как список из 80 элементов для каждого изображения, содержащий 1 с справа классы и нули у него неправильные классы.

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

Использование tf.equal(logits , truelabels) неприменимо, поскольку существует 80 классов с большим количеством нулей, которые предсказаны правильно. Таким образом, я получаю высокую точность и неверные прогнозы.

Я пытался использовать tf.map_fn, чтобы разбить тензор на элементы, но, очевидно, я не могу использовать переменную типа счетчика внутри функции, чтобы выбрать текущие истинные метки из пакета истинных меток (Y_).

вот мой код:

rounded = tf.round(Y)
C = 0
V = 0
sumseen = 0.
sumtrue = 0.
avgg = 0.

def avgfunc(elm):
  global C
  global V
  global sumseen
  global sumtrue
  global avgg
  tru = Y_[C]
  ***tf.add(V,1)***
  cond1 = tf.count_nonzero(tf.cast(tf.equal(elm,tf.constant(1.,tf.float32)),tf.float32))
  cond2 = tf.count_nonzero(tf.cast(tf.equal(elm,tru[V]),tf.float32))
  if(cond1 == 1):
      sumseen+=1
      if(cond2 == 1):
          sumtrue+=1
  ***if(V >= 79):
      V = 0
      avgg = ((sumtrue/sumseen)*100) if sumseen !=0 else 0***
  return sumseen

def _comparefunc(elem_probs):
  global C
  tru = Y_[C]
  mapout = tf.map_fn(avgfunc, elem_probs)
  ***C = C+1
  if(C == 49):
      C = 0***
  return avgg

outputafter = tf.map_fn(_comparefunc, rounded)
accuracyofbatch = tf.reduce_mean(outputafter)
...