Возникли проблемы с пользовательской функцией потерь для YOLO с использованием кераса или тензорного потока - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь определить пользовательскую функцию потерь для YOLO, чтобы обнаруживать присутствие одного объекта класса и определять местонахождение его центра (своего рода обнаружение ориентира), как узнал Эндрю Н.Г.Каждая сетка из 49 сеток выдает вектор (7 * 7 * 3), имеющий глубину всего 3 единицы.Первый канал указывает на вероятность объекта в этой сетке, а два других предсказывают координаты центра моего объекта для обнаружения ориентира.В последнее время я пытался разобраться в тензорном исчислении, чтобы избежать ошибочной функции потерь, но у меня возникли проблемы с повышением точности.

Я просто вычитаю все три канала y_true из y_pred, но умножаюрезультат 2-го и 3-го каналов с матрицей 1-го канала y_true, поскольку мы не хотим учитывать координаты, предсказанные во 2-м и 3-м каналах, если 1-й канал не прогнозирует наличие самого объекта.

def yol_loss(y_true, y_pred):
    shape = tf.shape( y_true[:, :, :, 0] )
    a=tf.ones([shape[0], shape[1], shape[2] ], tf.float32)
    loss = K.mean((K.square(tf.multiply(y_true[:, :, :, 0], a) - tf.multiply(y_pred[:, :, :, 0],a ))),axis=(1,2)) + 64*K.mean((K.square(tf.multiply(y_true[:, :, :, 0], y_true[:, :, :, 1]) - tf.multiply(y_true[:, :, :, 0],y_pred[:, :, :, 1]))),axis=(1,2)) + 64*K.mean((K.square(tf.multiply(y_true[:, :, :, 0], y_true[:, :, :, 2]) - tf.multiply(y_true[:, :, :, 0],y_pred[:, :, :, 2]))),axis=(1,2))
    return loss
...