Смешение тензора с 0 и 1 с другим тензором, имеющим действительные значения, дает значения Nan во время функции потерь - PullRequest
0 голосов
/ 07 октября 2019

в прилагаемом коде ниже вычисляется потеря для заданного выхода из йоло и истинности земли. Но пока я тренирую модель, я теряю Нан. Отладка функции показала, что в первый раз потери наночастиц происходят при потере объекта. Способ расчета потери объекта: x = (IOU (pred_localisation, ground_localisation) - сигмоид (pred_conf)) ** 2 y = маска * x ....... где маска имеет ту же форму, что и x, и равна 1, если существуетявляется объектом для этой сетки, иначе 0. Отладка далее, потери нанопокрытия происходят впервые, когда я пытаюсь умножить маску на x. Что оставляет меня в замешательстве, так как причина в том, что после проверки обоих входов умножения маска и x не содержат значений nan перед умножением. И маска имеет только 1 или 0 .. Так как же возможно, что когда я умножаю маску (0 или 1) на x (некоторые реальные значения), это приводит к значениям NaN. Это код, который я написал для расчета потерь.:

def yolo_loss(net_out , ground_truth):   #g_t shape = 1,13,13,5,7
    gt_conf = ground_truth[... , :1]
    gt_loc = ground_truth[... , 1:5]
    gt_classes = ground_truth[... , 5:]
    pred_conf , pred_loc , pred_classes = get_conf_loc_classes(net_out)

    #get the mask
    condition = tf.equal(gt_conf , tf.constant(1 , dtype = tf.float32))
    mask = tf.where(condition , tf.ones_like(gt_conf) , tf.zeros_like(gt_conf))

    #no_ojbect_loss
    no_object_loss = tf.reduce_sum((1 - mask) * (tf.square(0 - tf.nn.sigmoid(pred_conf))))
    no_object_loss = tf.multiply(no_object_loss , no_object_scale)

    #object_loss
    object_loss_init = tf.square(IOU(gt_loc , pred_loc) - tf.nn.sigmoid(pred_conf))
    is_nan = tf.is_nan(object_loss_init)
    is_nan_m = tf.math.is_nan(mask)
    is_nan_index = tf.where(is_nan)
    is_nan_m_index = tf.where(is_nan_m)
    init_print = tf.print("nan is present in object_loss_init :" , is_nan_index , output_stream = "file:///home/yogeesh/yogeesh/yolo_v2/nan.txt")
    mask_nan_print = tf.print("nan is present in mask :" , is_nan_m_index , output_stream = "file:///home/yogeesh/yogeesh/yolo_v2/mask_nan.txt")
    with tf.control_dependencies([init_print , mask_nan_print]):
        object_loss_masked = tf.multiply(mask , object_loss_init)


    zero_mask = tf.constant(0 , tf.float32)
    where = tf.not_equal(object_loss_masked , zero_mask)
    indexes = tf.where(where)
    is_nan_masked = tf.math.is_nan(object_loss_masked)
    is_nan_masked_index = tf.where(is_nan_masked)
    print_op_2 = tf.print("mask multiply_non_zero_indexes : " , indexes , output_stream = "file:///home/yogeesh/yogeesh/yolo_v2/log.txt")
    print_op_3 = tf.print("mask multiply_nan_index : " , is_nan_masked_index , output_stream = "file:///home/yogeesh/yogeesh/yolo_v2/nan_2.txt")
    with tf.control_dependencies([print_op_2,  print_op_3]):
        object_loss = tf.reduce_sum(object_loss_masked)

    print_op_object_loss = tf.print("reduce sum: " , object_loss)
    with tf.control_dependencies([print_op_object_loss]):
        object_loss_final = tf.multiply(object_loss , object_scale)

    #class_loss
    class_loss = tf.reduce_sum(mask * tf.square(gt_classes - tf.nn.softmax(pred_classes , axis = -1)))
    class_loss = tf.multiply(class_loss , class_scale)

    #localization_loss
    loc_loss = tf.reduce_sum(mask * tf.square((gt_loc - pred_loc)))
    loc_loss = tf.multiply(loc_loss , coord_scale)

    print_op = tf.print("losses : " , no_object_loss , object_loss_final , class_loss , loc_loss , output_stream = sys.stdout)
    with tf.control_dependencies([print_op]):
        total_loss = tf.math.add_n([no_object_loss , object_loss_final , class_loss , loc_loss])

    return total_loss

Операторы печати - это то, как я отлаживаю происхождение значений NaN. get_conf_loc_classes просто возвращает отдельные значения из исходного вывода.

может кто-нибудь, пожалуйста, помогите

...