SegNet. Почему точность обучения высока, а точность проверки низкая? - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь обучить SegNet-Basic, реализованный в Keras, на наборе данных Berkeley DeepDrive .Но после обучения точность проверки достигает примерно 50-60%, а точность обучения достигает более 90%.

Я пытался использовать разные оптимизаторы и размеры изображений.маски набора данных представлены в виде изображения в градациях серого, и я разделил их в соответствии с предоставленными метками в массив с кучей изображений [img_height, img_width, num_classes] на изображение.

Моя реализация SegNet_Basic выглядит следующим образом: функции _encode и _decode являются реализациями Unpool с индексами, которые paper заявляет.

def SegNet_Basic(n_labels,input_shape= (480,352,3)):
    kernel = 3
    filter_size = 64
    inputs = Input(shape=input_shape)

    c1 = Conv2D(filter_size, (3,3),activation='relu',padding='same')(inputs)
    c1 = BatchNormalization()(c1)

    pool_1, mask_1 = _encode(c1)

    c2 = Dropout(0.2)(pool_1)
    c2 = Conv2D(128, (3,3),activation='relu', padding='same')(c2)
    c2 = BatchNormalization()(c2)

    pool_2, mask_2 = _encode(c2)

    c3 = Conv2D(256, (3,3),activation='relu', padding='same')(pool_2)
    c3 = BatchNormalization()(c3)

    pool_3, mask_3 = _encode(c3)

    c4 = Dropout(0.2)(pool_3)
    c4 = Conv2D(512, (3,3),activation='relu', padding='same')(c4)
    c4 = BatchNormalization()(c4)

    c5 = Conv2D(512, (3,3), activation='relu',padding='same')(c4)
    c5 = BatchNormalization()(c5)

    c6 = Conv2D(256, (3, 3), activation='relu', padding='same')(c5)
    unpool_1 = _decode(c6,mask_3)

    c6 = Dropout(0.2)(unpool_1)
    c6 = Conv2D(256, (3,3),activation='relu', padding='same')(c6)
    c6 = BatchNormalization()(c6)

    c7 = Conv2D(128, (3, 3), activation='relu', padding='same')(c6)
    unpool_2 = _decode(c7,mask_2)

    c7 = Dropout(0.2)(unpool_2)
    c7 = Conv2D(128,(3,3), activation='relu',padding='same')(c7)
    c7 = BatchNormalization()(c7)

    c8 = Conv2D(64, (3, 3), activation='relu', padding='same')(c7)
    unpool_3 = _decode(c8,mask_1)

    c8 = Conv2D(filter_size,(3,3),activation='relu', padding='same')(unpool_3)
    c8 = BatchNormalization()(c8)
    output = Conv2D(n_labels, (1, 1), activation='softmax')(c8)

    model = Model(inputs=[inputs], output=[output], name='SegNet_Basic')

    return model

Im использует размер изображенияиз (480,352), поскольку я не могу использовать большие размеры, потому что мой ноутбук не может обрабатывать их на графическом процессоре.Я также вижу, что такие классы, как небо и деревья, распознаются довольно хорошо, как видно на первой добавленной мной картинке, но точность других классов довольно ужасна.

Я также могу предоставить другие части своего кодаесли необходимо!

Спасибо за любую помощь заранее !!

прогнозируемый результат на класс

точность модели после тренировки

потеря модели после тренировки

Вывод тренировочной картинки после тренировки 100 эпох

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...