У меня очень несбалансированный 3D-набор данных, где около 80% объема составляют фоновые данные, меня интересуют только элементы переднего плана, которые составляют около 20% от общего объема в случайных местах.Эти местоположения отмечены в тензор метки, данной сети.Целевой тензор является двоичным, где 0 представляет фон, а 1 представляет области, которые мы заинтересованы или хотим сегментировать.
Размер каждого тома равен [30,512,1024]
.Я перебираю каждый том, используя блоки размером [30,64,64]
.Таким образом, большинство моих блоков имеют только 0 значений в целевом тензоре.
Я читал, что DiceLoss
идеально подходит для таких задач и успешно используется при сегментировании 3D МРТ-сканов.Вот одна простая реализация: https://github.com/pytorch/pytorch/issues/1249#issuecomment-305088398
def dice_loss(input, target):
smooth = 1.
iflat = input.view(-1)
tflat = target.view(-1)
intersection = (iflat * tflat).sum()
return 1 - ((2. * intersection + smooth) /
(iflat.sum() + tflat.sum() + smooth))
Это не работает для меня, я имею в виду для патча, где все, что у меня есть, это фон tflat.sum()
будет 0
.Это также составит intersection
0
, поэтому для большинства моих патчей или блоков я получу возврат 1
.
Это правильно?Это не так, как это должно работать.Но я борюсь с этим, так как это мой сетевой вывод:
idx: 0 of 312 - Training Loss: 1.0 - Training Accuracy: 3.204042239857152e-11
idx: 5 of 312 - Training Loss: 0.9876335859298706 - Training Accuracy: 0.0119545953348279
idx: 10 of 312 - Training Loss: 1.0 - Training Accuracy: 7.269467666715101e-11
idx: 15 of 312 - Training Loss: 0.7320756912231445 - Training Accuracy: 0.22638492286205292
idx: 20 of 312 - Training Loss: 0.3599294424057007 - Training Accuracy: 0.49074622988700867
idx: 25 of 312 - Training Loss: 1.0 - Training Accuracy: 1.0720428988975073e-09
idx: 30 of 312 - Training Loss: 1.0 - Training Accuracy: 1.19782361807097e-09
idx: 35 of 312 - Training Loss: 1.0 - Training Accuracy: 1.956790285362331e-09
idx: 40 of 312 - Training Loss: 1.0 - Training Accuracy: 1.6055999862985004e-09
idx: 45 of 312 - Training Loss: 1.0 - Training Accuracy: 7.580232552761856e-10
idx: 50 of 312 - Training Loss: 1.0 - Training Accuracy: 9.510597864803572e-10
idx: 55 of 312 - Training Loss: 1.0 - Training Accuracy: 1.341515676323013e-09
idx: 60 of 312 - Training Loss: 0.7165247797966003 - Training Accuracy: 0.02658153884112835
idx: 65 of 312 - Training Loss: 1.0 - Training Accuracy: 4.528208030762926e-09
idx: 70 of 312 - Training Loss: 0.3205708861351013 - Training Accuracy: 0.6673439145088196
idx: 75 of 312 - Training Loss: 0.9305377006530762 - Training Accuracy: 2.3437689378624782e-05
idx: 80 of 312 - Training Loss: 1.0 - Training Accuracy: 5.305786885401176e-07
idx: 85 of 312 - Training Loss: 1.0 - Training Accuracy: 4.0612556517771736e-07
idx: 90 of 312 - Training Loss: 0.8207412362098694 - Training Accuracy: 0.0344742126762867
idx: 95 of 312 - Training Loss: 0.7463213205337524 - Training Accuracy: 0.19459737837314606
idx: 100 of 312 - Training Loss: 1.0 - Training Accuracy: 4.863646818620282e-09
idx: 105 of 312 - Training Loss: 0.35790306329727173 - Training Accuracy: 0.608722984790802
idx: 110 of 312 - Training Loss: 1.0 - Training Accuracy: 3.3852198821904267e-09
idx: 115 of 312 - Training Loss: 1.0 - Training Accuracy: 1.5268487585373691e-09
idx: 120 of 312 - Training Loss: 1.0 - Training Accuracy: 3.46353523639209e-09
idx: 125 of 312 - Training Loss: 1.0 - Training Accuracy: 2.5878148582347826e-11
idx: 130 of 312 - Training Loss: 1.0 - Training Accuracy: 2.3601216467272756e-11
idx: 135 of 312 - Training Loss: 1.0 - Training Accuracy: 1.1504343033763575e-09
idx: 140 of 312 - Training Loss: 0.4516671299934387 - Training Accuracy: 0.13879922032356262
Я не думаю, что сеть чему-то научится из этого ..
Теперь я запутался, поскольку моя проблема должнаНе будь слишком сложным, так как я уверен, что у МРТ также есть целевые тензоры, где большинство из них указывают на фон .. Что я делаю не так?
Спасибо