Задача обнаружения корабля Airbus Kaggle. Как бороться с дисбалансом класса? - PullRequest
0 голосов
/ 28 сентября 2018

Моя модель всегда предсказывает с вероятностью 0,5 для всех пикселей.
Я отбросил все изображения без кораблей и попробовал потерю фокуса, потерю, взвешенную потерю, чтобы справиться с дисбалансом.
Но результат тот же. После несколькихПакеты масок, которые я предсказал, постепенно стали всеми нулями.
Вот моя записная книжка: введите описание ссылки здесь Обсуждение Kaggle: введите описание ссылки здесь

В блокнотев основном то, что я сделал:
(1) отменить все выборки, когда нет корабля
(2) построить простую сеть u
(3) определить три пользовательские функции потерь (iouloss, focal_binarycrossentropy, biased_crossentropy), все из которых я пробовал.
(4) обучаем и отправляем

#define different losses to try
def iouloss(y_true,y_pred):
    intersection = K.sum(y_true * y_pred, axis=-1)
    sum_ = K.sum(y_true + y_pred, axis=-1)
    jac = intersection / (sum_ - intersection)
    return 1 - jac
def focal_binarycrossentropy(y_true,y_pred):
    #focal loss with gamma 8
    t1=K.binary_crossentropy(y_true, y_pred)
    t2=tf.where(tf.equal(y_true,0),t1*(y_pred**8),t1*((1-y_pred)**8))
    return t2
def biased_crossentropy(y_true,y_pred):
    #apply 1000 times heavier punishment to ship pixels
    t1=K.binary_crossentropy(y_true, y_pred)
    t2=tf.where(tf.equal(y_true,0),t1*1000,t1)
    return t2
...
#try different loss function
unet.compile(loss=iouloss, optimizer="adam", metrics=[ioumetric])
or
unet.compile(loss=focal_binarycrossentropy, optimizer="adam", metrics=[ioumetric])
or
unet.compile(loss=biased_crossentropy, optimizer="adam", metrics=[ioumetric])
...
#start training
unet.train_on_batch(x=image_batch,y=mask_batch)

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Я слышал использование коэффициента Dice для этой проблемы, хотя у меня нет личного опыта, чтобы это сделать.Возможно, вы могли бы попробовать это?Это связано с Жакаром, но, как ни странно, я слышал, что его легче тренировать.Извините, что не предложил ничего более конкретного.

0 голосов
/ 28 сентября 2018

Одна опция, которую предоставляет Keras, - это параметр class_weight в fit из документации :

class_weight: необязательный словарь, отображающий индексы класса (целые числа) в вес (с плавающей запятой)) значение, используемое для взвешивания функции потерь (только во время тренировки).Это может быть полезно для того, чтобы сказать модели «уделять больше внимания» выборкам из недопредставленного класса.

Это позволит вам в некоторой степени противостоять дисбалансу.

...