Как правильно тренировать VGG16 Keras - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь переобучить VGG16 для классификации изображений Lego. Тем не менее, моя модель имеет низкую точность (между 20%). Что я делаю неправильно? Возможно, номер FC неверен, или мой ImageDataGenerator. У меня ок. 2 тыс. Изображений в классе и всего 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)

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

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

model_VGG16 = VGG16(include_top=False, weights='imagenet')
0 голосов
/ 14 апреля 2019

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

...