YOLO Функция потери убывающая
У меня возникли некоторые проблемы с реализацией функции потери YOLO. Каждый раз, когда я тренирую свою модель, моя потеря уменьшается, но моя точность также уменьшается. Это приводит меня к мысли, что моя функция потери не является правильной. И, учитывая, что газета YOLO довольно расплывчата, мне было интересно, сможет ли кто-нибудь мне помочь.
Вот функция потерь, которую я сейчас использую, пытаясь следовать функции бумаги. Я пытаюсь найти один объект класса, поэтому мой y_true = [P,w,h,x,y] объекта, без других ограничительных рамок.
def get_coord(X,Y,H,W):
x2 = X + W
y2 = Y + H
return x2,y2
def loss_function2(y_true,y_pred):
object_true = y_true[:,:,:,0]
object_pred = y_pred[:,:,:,0]
width_true = y_true[:,:,:,1]
width_pred = y_pred[:,:,:,1]
height_true = y_true[:,:,:,2]
height_pred =y_pred[:,:,:,2]
X_true = y_true[:,:,:,3]
X_pred =y_pred[:,:,:,3]
Y_true = y_true[:,:,:,4]
Y_pred = y_pred[:,:,:,4]
x2_true,y2_true = get_coord(X_true,Y_true,height_true,width_true)
x2_pred,y2_pred = get_coord(X_pred,Y_pred,height_pred,width_pred)
xi1 = tf.maximum(X_true,X_pred)
yi1 = tf.maximum(Y_true,X_true)
xi2 = tf.minimum(x2_true,x2_pred)
yi2 = tf.minimum(y2_true,y2_pred)
zeros = tf.zeros([10,19,19])
inter_area = tf.maximum(zeros,xi2-xi1)*tf.maximum(zeros,yi2-yi1)
box_area1 = (x2_true-X_true)*(y2_true-Y_true)
box_area2 = (x2_pred-X_pred)*(y2_pred-Y_pred)
union_area = box_area1 + box_area2 - inter_area
iou = inter_area/union_area
loss1 = tf.reduce_sum(tf.multiply(object_true,(tf.squared_difference(X_pred,X_true) + tf.squared_difference(Y_pred,Y_true))))
loss2 = tf.reduce_sum(tf.multiply(object_true,(tf.squared_difference(tf.sqrt(width_pred),tf.sqrt(width_true)) + tf.squared_difference(tf.sqrt(height_pred),tf.sqrt(height_true)))))
loss3 = tf.reduce_sum(tf.multiply(object_true,(tf.squared_difference(object_pred,iou))))
loss4 = tf.scalar_mul(0.5,(tf.reduce_sum(tf.multiply(((object_true*-1)+1),(tf.squared_difference(object_pred,object_true))))))
return loss1+loss2+loss3+loss4
Я разделил сетку изображений на 19x19, и поэтому мои прогнозы делятся на партии по 10x19x19x5 тензоров.
Я посмотрел код из других реализаций YOLO в python, и большинство функций потерь меня просто озадачивают. Они либо слишком сложны для меня, чтобы следовать, либо реализуют что-то совершенно иное, чем то, что было изложено в оригинальной статье.