Объединение пользовательской функции потерь с предопределенной функцией потерь (Dice и Focal) для обучения DeeplabV3PlusPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Объединение пользовательской функции потерь с предопределенной функцией потерь (Dice и Focal) для обучения DeeplabV3Plus

Сообщение Anonymous »


Я обучаю DeeplabV3+ семантической сегментации изображений дистанционного зондирования. Я создаю модель после урока по keras ( https://keras.io/examples/vision/deeplabv3_plus/ ), и она отлично работает, когда я использую для обучения фокусную потерю (предустановленную в Keras/tf). Маски имеют горячее кодирование и имеют вид (размер пакета, высота, ширина, каналы). На следующем этапе я хотел протестировать потерю кубиков (я реализовал это после правильной реализации потери кубиков в Tensorflow/Keras), что тоже, казалось, работало нормально, но приводило к снижению IoU. Вот как я реализовал потерю и обучил модель:
импортировать numpy как np импортировать тензорный поток как tf из бэкэнда tensorflow.keras импортировать как K def dice_coef(y_true, y_pred, Smooth=100): # вычисляем коэффициент кубика для одного класса y_true_f = K.flatten(y_true) y_pred_f = K.flatten(y_pred) пересечение = K.sum(y_true_f * y_pred_f) кубик = (2. * пересечение + сглаживание) / (K.sum(y_true_f) + K.sum(y_pred_f) + сглаживание) вернуть кости def dice_coef_loss(y_true, y_pred, Smooth=100): return -dice_coef(y_true, y_pred, Smooth) # превращаем коэффициент кубика в проигрыш #вычислите коэффициент кубика для нескольких классов и вычислите простое среднее значение def dice_coef_multilabel(y_true, y_pred, M=10, Smooth=100): кубик = 0 для индекса в диапазоне (M): #M — количество классов dice += dice_coef(y_true[:,:,:,index], y_pred[:,:,:,index], Smooth) возврат кубика/М def dice_coef_multi_loss(y_true, y_pred, M=number_classes, Smooth=100): return -dice_coef_multilabel(y_true, y_pred, M=number_classes, Smooth=100) из Seg_Models_own импортировать DeeplabV3Plus DeeplabV3Plus = DeeplabV3Plus(image_size=256,image_channels = 4, num_classes= 10) DeeplabV3Plus.compile(оптимизатор = Адам(learning_rate = 1e-4), потеря =dice_coef_multi_loss,metrics= ['categorical_accuracy',tf.keras.metrics.MeanIoU(num_classes=10,sparse_y_true=False, sparse_y_pred=False)]) History2 = DeeplabV3Plus.fit(train_img_gen, # используйте генератор для получения данных обучения шаги_за_эпоху = шаги_за_эпоху, эпохи = 35, подробный = 2, validation_data = val_img_gen, # используйте генератор для получения данных проверки validation_steps = val_steps_per_epoch, пакетный_размер= 64)
Я хотел бы объединить потери Focal с потерями Dice, поскольку это может улучшить производительность модели. Я попытался объединить потери следующим образом (и еще несколькими подобными способами):

def dice_coef_multi_loss(y_true, y_pred, M=10, Smooth=100): return -dice_coef_multilabel(y_true, y_pred, M=10, Smooth=100)+ tf.keras.losses.CategoricalFocalCrossentropy(y_true, y_pred) Но, к сожалению, я всегда получаю следующую ошибку:

"TypeError: не удалось преобразовать элементы объекта в Tensor. Рассмотрите возможность приведения элементов к поддерживаемому типу. См. https://www.tensorflow.org/api_docs/python/tf /dtypes для поддерживаемых типов TF."

Я также попытался привести тип данных потерь и y_true,y_test к float32. Что мне здесь не хватает? Я думал, что каждая потеря возвращает одно число, и сложение выполняется просто... Нужно ли мне также реализовать в моем сценарии потерю фокуса (аналогично потере кости)? Мне очень приятно читать, что вы об этом думаете!

см. выше, где я объяснил всю проблему
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»