Моя модель всегда предсказывает с вероятностью 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)