Потеря валидации модели Keras не соответствует выходным данным функции потерь - PullRequest
0 голосов
/ 17 июня 2020

Я работаю над проектом сегментации биомедицинских изображений. Для работы я использую модель U- net. Проблема в том, что когда я обучаю модель, потеря валидации кажется непрактичной.

Я использовал dice_coef_loss в качестве функции потерь, а также в metri c. Результат обучения - график ниже. График ясно показывает, что потеря проверки не соответствует моей функции потерь, потому что эти два графика различимы. Тем не менее, потеря поезда соответствует значениям поезда dice_coef_loss.

(Первое изображение слева - это потеря обучения и проверки, третье - обучение и проверка dice_coef_loss как metri c)

График истории обучения

(Извините, я еще не могу встроить изображение, проверьте ссылку)

Вот моя модель

def unet(input_size=(256,256,1)):
    inputs = Input(input_size)

    conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
    conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)

    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

    conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2)
    conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)
    pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)

    conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3)
    conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv4)
    pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)

    conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4)
    conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)

    up6 = concatenate([Conv2DTranspose(256, (2, 2), strides=(2, 2), padding='same')(conv5), conv4], axis=3)
    conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6)
    conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6)

    up7 = concatenate([Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(conv6), conv3], axis=3)
    conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7)
    conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7)

    up8 = concatenate([Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(conv7), conv2], axis=3)
    conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8)
    conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8)

    up9 = concatenate([Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(conv8), conv1], axis=3)
    conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(up9)
    conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv9)

    conv10 = Conv2D(1, (1, 1), activation='sigmoid')(conv9)

    return Model(inputs=[inputs], outputs=[conv10])

Вот функция потерь

import keras.backend as K
smooth=100

def dice_coef(y_true, y_pred):
    y_truef=K.flatten(y_true)
    y_predf=K.flatten(y_pred)
    And=K.sum(y_truef* y_predf)
    return((2* And + smooth) / (K.sum(y_truef) + K.sum(y_predf) + smooth))

def dice_coef_loss(y_true, y_pred):
    return -dice_coef(y_true, y_pred)

Компиляция

model.compile(optimizer=Adam(lr=1e-5), loss=dice_coef_loss, metrics=["binary_accuracy", dice_coef_loss, iou])

Примечание

Я пробовал:

  • настройка скорости обучения
  • настройка размера пакета
  • увеличение данных
  • изменение функции потерь

Если кто-то хочет посмотреть на код здесь - ссылка на ядро ​​kaggle

Примечание к дополнению

Чтобы прояснить себе:

Был создан 1-й и 2-й графики из той же функции с использованием того же набора данных (либо из времени поезда, либо из времени проверки), поэтому я хочу, чтобы кривая train_loss с 1-го графика была равна train_dice_coef_loss с 3-го участка т. И кривая val_loss с 1-го графика равна val_dice_coef_loss с 3-го графика.

Но, к сожалению, кривая val_loss не соответствует кривой val_dice_coef_loss.

PS Я здесь новичок. Любые предложения по улучшению моего вопроса приветствуются. Спасибо.

1 Ответ

0 голосов
/ 29 июня 2020

Как, ZabirAlNazi предположил, что это проблема используемой библиотеки. Изменение импорта с keras на tenorflow.keras решило эту проблему.

from tensorflow.keras.models import Model, load_model, save_model
from tensorflow.keras.layers import Input, Activation, BatchNormalization, Dropout, Lambda, Dense, Conv2D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...