что заставляет мою модель обнаружения предсказывать NaN? - PullRequest
0 голосов
/ 05 августа 2020

Я строю модель для обнаружения некоторой информации из изображений. На самом деле эта проблема возникла из-за Kaggle: Глобальное обнаружение пшеницы. Я пытаюсь создать модель, вдохновленную Йоло, но в этом случае есть только класс, и я хочу использовать по одному ящику на сетку, чтобы упростить задачу. Итак, я создал модель, которая возвращает и предсказывает тензор (16,16,5). 16,16 - ячейки сетки. 5 - это (c, x, y, w, h), который падает от 0 до 1 по нормализации. loss_function сделан по порядку бумаги Yolo, но OBJ_SCALE и NOOBJ_SCALE настроены на 0,005, 0,0005, потому что я догадался, что причина появления nans в том, что потеря слишком велика. Фактически, когда я устанавливаю их как 5 и 0,5, как написано на бумаге, из первой партии выходит nan. Но это не очень помогает.

Как я могу решить эту проблему и что я упускаю или ошибаюсь?

def loss_function(y_true, y_pred):
    
    tf.print('\n y_pred' , y_pred[0,0,0])
    tf.print('y_true',y_true[0,0,0])
    
    OBJ_SCALE = 0.005
    NO_OBJ_SCALE = 0.0005
    
    true_conf = y_true[...,0:1]
    true_xy   = y_true[...,1:3]
    true_wh   = y_true[...,3:]
    
    pred_conf = y_pred[...,0:1]
    pred_xy   = y_pred[...,1:3]
    pred_wh   = y_pred[...,3:]

    obj_mask = tf.expand_dims(y_true[..., 0], axis = -1) * OBJ_SCALE
    noobj_mask = (1 - obj_mask) * NO_OBJ_SCALE
    
    loss_xy    = tf.reduce_sum(tf.square((true_xy - pred_xy) * obj_mask))
    loss_wh    = tf.reduce_sum(tf.square((tf.sqrt(true_wh) - tf.sqrt(pred_wh)) * obj_mask))
    loss_obj   = tf.reduce_sum(tf.square((true_conf - pred_conf) * obj_mask))
    loss_noobj = tf.reduce_sum(tf.square((true_conf - pred_conf) * noobj_mask))
    loss = loss_xy + loss_wh + loss_obj + loss_noobj
    
    tf.print('loss_xy', loss_xy)
    tf.print('loss_xy', loss_xy)
    tf.print('loss_obj', loss_obj)
    tf.print('loss_noobj', loss_noobj) 
    tf.print('loss', loss)

    return loss    

когда я тренирую эту модель. Он показывает

y_pred [0.2299328 0.604008436 0.498961449 1.22923946 0]
y_true [0 0 0 0 0]
loss_xy 0.00649014302
loss_xy 0.00649014302
loss_obj 0.00952909887
loss_noobj 0.000192464562
loss 0.0197582766
  1/334 [..............................] - ETA: 0s - loss: 0.0198 - accuracy: 0.2285
y_pred [-nan -nan -nan -nan -nan]
y_true [0 0 0 0 0]
loss_xy -nan
loss_xy -nan
loss_obj -nan
loss_noobj -nan
loss -nan
  2/334 [..............................] - ETA: 13:52 - loss: nan - accuracy: 0.6143
y_pred [-nan -nan -nan -nan -nan]
y_true [0 0 0 0 0]
loss_xy -nan
loss_xy -nan
loss_obj -nan
loss_noobj -nan
loss -nan

модель

inputs = tf.keras.Input(shape=(256,256,3)) #inputs.shape is (None, 256, 256, 3)

x = tf.keras.layers.Conv2D(32, (16, 16), strides = (1, 1), padding='same')(inputs)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.MaxPooling2D((2, 2), strides = (2, 2))(x)

x = tf.keras.layers.Conv2D(64, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.MaxPooling2D((2, 2), strides = (2, 2))(x)

x = tf.keras.layers.Conv2D(128, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(64, (1, 1), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(128, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.MaxPooling2D((2, 2), strides = (2, 2))(x)

x = tf.keras.layers.Conv2D(256, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(128, (1, 1), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(256, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.MaxPooling2D((2, 2), strides = (2, 2))(x)

x = tf.keras.layers.Conv2D(512, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(256, (1, 1), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(512, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(256, (1, 1), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(512, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.MaxPooling2D((2, 2), strides = (2, 2))(x)

x = tf.keras.layers.Conv2D(1024, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(512, (1, 1), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(1024, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(512, (1, 1), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(256, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
x = tf.keras.layers.Conv2D(128, (3, 3), strides = (1, 1), padding = 'same')(x)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)

x = tf.keras.layers.AveragePooling2D((2,2), strides = (2,2))(x)

x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(1280, activation = 'relu')(x)
#x = tf.keras.layers.LeakyReLU(alpha = 0.1)(x)
#outputs = tf.keras.layers.Dense(10, activation = 'sigmoid')(x)
outputs = tf.keras.layers.Reshape((16,16,5))(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)

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