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

Я пытался разработать функцию стоимости YOLO, которую я показал ниже.Это первый раз, когда я пытался разработать свою собственную функцию стоимости в Tensorflow и не уверен, правильно ли я к ней подхожу или нет.Например, моя модель использует несколько промежуточных шагов.Я не уверен, если это усложняет вычислительный граф каким-либо значительным разрушительным образом?Или я использую пресс.шаг значения и я не уверен, будет ли это иметь какое-то негативное влияние на мой backprop?Любая помощь будет полезна в отношении того, правильно ли я подхожу к этой проблеме.

Я могу ответить на любые вопросы о своей реализации.

Примечание. Z13 - это прогноз, y - истинные значения.В моей модели 49 ячеек (7x7), каждая из которых представлена ​​вектором 7x1: [вероятность чего-либо в ячейке, x средняя точка, y средняя точка, ширина блока, высота блока, prob dog, prob cat]. Ссылочная бумага: https://arxiv.org/pdf/1506.02640.pdf, которая подробно объясняет функцию стоимости.

Я считаю, что есть проблема с моей прямой опорой или с моей функцией стоимости, поскольку моя модель не изучает осмысленные представления.

YOLO cost function

def cost_function(Z13,y,coord=5,noobj=0.5):
    """
    Z13: shape (None,7,7,7)
    y: shape (None,7,7,7)
    """

    # Masks are used as classification score for box coords only applies to cell where actual bounding box is
    c_mask_true = y[:,:,:,0:1] > 0 # Mask which determines which cell has bounding box
    c_mask_false = y[:,:,:,0:1] < 1 # Mask for cells w/o bounding boxes

    # Confidence scores
    ci_guess_t = tf.boolean_mask(Z13[:,:,:,0:1],c_mask_true)
    ci_guess_f = tf.boolean_mask(Z13[:,:,:,0:1],c_mask_false)
    ci_act_t = tf.boolean_mask(y[:,:,:,0:1],c_mask_true)
    ci_act_f = tf.boolean_mask(y[:,:,:,0:1],c_mask_false)

    # Bounding box coordinated for ground truth box prediction
    xi_guess = tf.boolean_mask(Z13[:,:,:,1:2],c_mask_true) # Midpoint x position
    xi_act = tf.boolean_mask(y[:,:,:,1:2],c_mask_true)
    yi_guess = tf.boolean_mask(Z13[:,:,:,2:3],c_mask_true) # Midpoint y position
    yi_act = tf.boolean_mask(y[:,:,:,2:3],c_mask_true)
    # Width:
    wi_guess = tf.boolean_mask(Z13[:,:,:,3:4],c_mask_true) # Midpoint width pos.
    wi_guess = tf.minimum(tf.sqrt(tf.abs(wi_guess)),wi_guess) # prevent sqrt(neg) and increase cost for neg prediction
    wi_act = tf.sqrt(tf.boolean_mask(y[:,:,:,3:4],c_mask_true))
    # Height:
    hi_guess = tf.boolean_mask(Z13[:,:,:,4:5],c_mask_true) # Midpoint height pos.
    hi_guess = tf.minimum(tf.sqrt(tf.abs(hi_guess)),hi_guess) # prevent sqrt(neg) and increase cost for neg prediction
    hi_act = tf.sqrt(tf.boolean_mask(y[:,:,:,4:5],c_mask_true))   

    # Predicted classes: 
    class_g_dog = tf.boolean_mask(Z13[:,:,:,5:6],c_mask_true)
    class_t_dog = tf.boolean_mask(y[:,:,:,5:6],c_mask_true)
    class_g_cat = tf.boolean_mask(Z13[:,:,:,6:7],c_mask_true)
    class_t_cat = tf.boolean_mask(y[:,:,:,6:7],c_mask_true)

    # Parts correspond with the cost function equations above
    part1 = coord * tf.reduce_sum(tf.square(xi_act - xi_guess)+tf.square(yi_act - yi_guess))
    part2 = coord * tf.reduce_sum(tf.square(wi_act - wi_guess)+tf.square(hi_act - hi_guess))
    part3 = tf.reduce_sum(tf.square(ci_act_t - ci_guess_t))
    part4 = noobj * tf.reduce_sum(tf.square(ci_act_f - ci_guess_f))
    part5 = tf.reduce_sum(tf.square(class_t_dog - class_g_dog)+tf.square(class_t_cat - class_g_cat))
    total_cost = part1 + part2 + part3 + part4 + part5

    return total_cost
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...