Потеря валидации не может улучшиться в начале с MobileV2 в Керасе - PullRequest
0 голосов
/ 26 мая 2020

Я использовал две разные модели для своего случая. Случай представляет собой классификацию по типу дефекта поверхности. Форма ввода - (200, 200, 1), всего 6 классов. Количество обучающих данных - 1440 (240 для 1 класса), а количество данных проверки - 360 (60 для 1 класса).

Процесс обучения очень хороший с первой моделью. И потери в обучении, и в проверке очень быстро снижаются. После этого хочу использовать MobileNetV2 от keras для сравнения результата обучения. Потери при обучении и точность в MobileV2 улучшились, но точность проверки застряла на уровне 0,1667 (потеря неровная).

Интересно, что вызывает этот результат. Могу ли я назвать эту ситуацию «чрезмерной подгонкой»? Или просто эта модель слишком глубока для моего случая?

Первая модель:

from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization
import parameter

input_shape = (parameter.IMAGE_SIZE_Y, parameter.IMAGE_SIZE_X, parameter.channel)

def MyModel():    

    model = Sequential()

    model.add(Conv2D(16, (3, 3), input_shape = input_shape, padding='same', activation='relu'))

    model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2)))

    model.add(Conv2D(32, (3, 3), padding='same', activation='relu'))

    model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2)))

    model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))

    model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2)))

    model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))

    model.add(MaxPooling2D(pool_size = (2, 2), strides = (2, 2)))

    model.add(Flatten())   

    model.add(Dense(256, activation = 'relu'))

    model.add(Dropout(0.5))

    model.add(Dense(6, activation = 'softmax'))

    model.summary()

    return model

Вторая модель:

from keras.models import Sequential, Model
from keras.layers import Dense, Activation, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, GlobalAveragePooling2D
from keras.optimizers import Adam
from keras.applications import MobileNetV2
import parameter

def MyMobileNetV2():

    input_shape = (parameter.IMAGE_SIZE_X, parameter.IMAGE_SIZE_Y, parameter.channel)

    model = MobileNetV2(input_shape = input_shape,
                        include_top = False,
                        weights = 'imagenet')

    x = model.output
    x = GlobalAveragePooling2D()(x)
    x = BatchNormalization()(x)
    x = Dense(1280, activation='relu')(x)
    x = BatchNormalization()(x)
    predictions = Dense(6, activation='softmax', kernel_initializer='random_uniform', bias_initializer='zeros')(x)

    model = Model(inputs = model.input, outputs = predictions)

    optimizer = Adam(lr=0.01)

    loss = "categorical_crossentropy"

    for layer in model.layers:
        layer.trainable = True

    model.compile(optimizer=optimizer,    
                  loss=loss,
                  metrics=["accuracy"])

    model.summary()

    for i, layer in enumerate(model.layers):
        print(i, layer.name, layer.trainable)



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