Как правильно тренировать VGG16 Keras

Я пытаюсь переобучить VGG16 на классификацию изображений Lego. Однако моя модель имеет низкую точность (от 20%). Что я делаю неправильно? Может быть, номер FC неправильный, или мой ImageDataGenerator. У меня ок. 2k изображений на класс и всего 6 классов.

Как я создаю модель:

def vgg16Model(self,image_shape,num_classes):
    model_VGG16 = VGG16(include_top = False, weights = None)
    model_input = Input(shape = image_shape, name = 'input_layer')
    output_VGG16_conv = model_VGG16(model_input)
    #Init of FC layers
    x = Flatten(name='flatten')(output_VGG16_conv)
    x = Dense(256, activation = 'relu', name = 'fc1')(x)
    output_layer = Dense(num_classes,activation='softmax',name='output_layer')(x)
    vgg16 = Model(inputs = model_input, outputs = output_layer)
    vgg16.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
    vgg16.summary()
    return vgg16

Я создаю ImageDataGenerator и тренируюсь:

path = "real_Legos_images/trainable_classes"
evaluate_path = "real_Legos_images/evaluation"
NN = NeuralNetwork()
gen = ImageDataGenerator(rotation_range=40, width_shift_range=0.02, shear_range=0.02,height_shift_range=0.02, horizontal_flip=True, fill_mode='nearest')

train_generator = gen.flow_from_directory(os.path.abspath(os.path.join(path)), 
                target_size = (224,224), color_mode = "rgb", batch_size = 16, class_mode='categorical')

validation_generator = gen.flow_from_directory(os.path.abspath(os.path.join(evaluate_path)),
                target_size = (224,224), color_mode = "rgb", batch_size = 16, class_mode='categorical')

STEP_SIZE_TRAIN = train_generator.n//train_generator.batch_size
num_classes = len(os.listdir(os.path.abspath(os.path.join(path))))
VGG16 = NN.vgg16Model((224, 224, 3), num_classes)

VGG16.save_weights('weights.h5')
VGG16.fit_generator(train_generator, validation_data = validation_generator, validation_steps = validation_generator.n//validation_generator.batch_size,
                steps_per_epoch = STEP_SIZE_TRAIN, epochs = 50)

person Raphael Cardoso Fernandes    schedule 14.04.2019    source источник


Ответы (2)


Модель VGG16 с параметром include_top = False вернет карты объектов с 512 размерами. Обычно мы должны сначала добавить слой GlobalAveragePooling2D или GlobalMaxPooling2D после него, а затем преобразовать его в одномерный массив. В противном случае вы получите слишком длинный массив.

person hhz    schedule 14.04.2019

Вы установили для свойства веса значение «Нет» для VGG, что означает, что ваши сети инициализируются случайными весами. Это означает, что вы не используете предварительно натренированные веса. Итак, я бы посоветовал попробовать установить веса на 'imagenet', чтобы вы могли использовать сети VGG, веса которых предварительно обучены в наборе данных imagenet:

model_VGG16 = VGG16(include_top=False, weights='imagenet')
person Rane    schedule 15.04.2019
comment
Это было намеренно, я хочу обучить сеть совершенно другому набору данных предметной области, и мне действительно не нужны предварительно обученные веса. - person Raphael Cardoso Fernandes; 15.04.2019
comment
Спасибо за комментарий. Понятно. Но я бы посоветовал установить веса на imagenet и установить обучаемые слои, взятые из VGG16, на false. Классифицируйте свои данные с помощью функций, извлеченных такой сетью, и посмотрите, получите ли вы лучшую точность. VGG может по-прежнему давать отличную точность для совершенно разных наборов данных изображений. - person Rane; 16.04.2019