Я использую тензор потока в наборе данных 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)