К какой структуре сети глубокого обучения мне следует обратиться?

#python #tensorflow #keras #deep-learning

Вопрос:

Я создаю сеть глубокого обучения, которая находит несколько точек в 3d-пространстве.

Вход представляет собой стопку 1024 x 1024 изображений в оттенках серого (количество изображений варьируется от 5 до 20 ), а выход- 64 x 64 x 64 пробел. Каждый выходной воксель имеет 0 или 1, но в моем наборе данных всего 2000 1, поэтому трудно сказать, хорошо ли обучается моя сеть, наблюдая потери при обучении.

Например, если бы моя сеть выдавала np.zeros((64,64,64)) только выходные данные, точность все равно была бы такой 1-2000/(64x64x64)~=99.9% .

Поэтому я хочу спросить, какую сеть глубокого обучения мне следует выбрать для поиска очень небольшого количества ответов из 3d-пространства. Размер ввода становится ( 1024 x 1024 x #img ) и размером вывода (64 x 64 x 64) . Сейчас я провожу эксперименты с использованием 2D Unet-подобной сети / 3D Unet-подобной сети с активацией конца ReLU с потолком.

Пожалуйста, кто-нибудь порекомендуйте что-нибудь, на что можно сослаться, и большое вам спасибо.

Ответ №1:

Сети, подобные Unet, кажутся хорошей идеей. Ваша проблема возникает не из-за самой сети, а из-за потерь и показателей, которые вы используете. Indead, если вы используете двоичную потерю перекрестной энтропии и точность для показателей, из-за несбалансированного характера ваших классов ваш результат все равно будет близок к 100%.

Я предлагаю вам использовать коэффициент Dice или Jaccard для показателей и/или потерь (в данном случае потеря равна 1-Dicecoef), и вы рассчитываете его только по интересующим вас предметам, а не на фоне.

В зависимости от используемой вами платформы вы должны легко найти существующую реализацию этих показателей. Затем измените код, чтобы избежать вычислений в фоновом режиме.

Например, для python/tensorflow, используя ваши тома:

 def dice_coef(y_true, y_pred, smooth=1):  y_true_f = K.flatten(y_true)  y_pred_f = K.flatten(y_pred)  y_true_f = K.one_hot(K.cast(y_true_f, np.uint8), 2)  y_pred_f = K.one_hot(K.cast(y_pred_f, np.uint8), 2)  intersection = K.sum(y_true_f[:,1:]* y_pred_f[:,1:], axis=[-1])  union = K.sum(y_true_f[:,1:], axis=[-1])   K.sum(y_pred_f[:,1:], axis=[-1])  dice = K.mean((2. * intersection   smooth)/(union   smooth), axis=0)  return dice