Как бороться с растущими потерями и низкой точностью проверки в VGGNet? - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь создать модель, чтобы предсказать художественный стиль живописи.Для этого я использую набор данных, который Kaggle предоставляет для своего конкурса под названием Painter by Numbers.Хотя в наборе данных 137 стилей искусства, я использую только три из них.Эти три стиля, а именно - импрессионизм, экспрессионизм и сюрреализм.Я взял 3000 изображений из каждого класса, чтобы обучить модель.Кроме того, я использовал 300 изображений из каждого класса на общую сумму 900 изображений для проверки обучения.Я планировал использовать предварительно обученный VGGNet в качестве нижнего слоя моей модели.Я обучил модель в Google Colab.Теперь проблема в том, что, поскольку модель начала понимать, что потери постоянно растут, а точность проверки приближается к 0,33, что неприятно.Случайное угадывание также даст эту точность.

Я создал модель с базовым слоем предварительно обученной VGGNet.Я добавил несколько полностью связанных слоев с 1024 нейронами в первых двух слоях, 512 нейронами в третьем слое и 3 нейронами в последнем слое.Оптимизатором, который я использовал, был SGD со скоростью обучения 0,01, затуханием 1e-6, импульсом 0,9.Моя функция потери - "категорическая_кросентропия".Кроме того, форма входного изображения была (100,100,3).Для обучения я объявил выборки за эпоху 100. Число эпох было 30. Ниже я привел все коды.

model_vgg16_conv = VGG16(weights='imagenet', include_top=False)

input = Input(shape=(100,100,3), name='image_input')
output_vgg16_conv = model_vgg16_conv(input)

x = Flatten(name='flatten')(output_vgg16_conv) 
x = Dense( 1024, activation='relu', name='fc1')(x) 
x = Dense( 1024, activation='relu', name='fc2')(x)
x = Dense(  512, activation='relu', name='fc3')(x)
x = Dense(    3, activation='softmax', name='predictions')(x)

my_model = Model(input=input, output=x)

sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

my_model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.1, zoom_range=0.2, horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory(train_root, target_size=(100,100), batch_size=32, class_mode='categorical')
test_set = test_datagen.flow_from_directory(test_root, target_size=(100,100), batch_size=32, class_mode='categorical')

my_model.fit_generator(training_set, samples_per_epoch=100, nb_epoch=30, validation_data=test_set, nb_val_samples=300)

Это приводит к низкой точности проверки и постоянно увеличивающейся величине потерь.Даже значение потерь увеличивается до 10. Кроме того, это приводит к низкой точности проверки.Что нужно сделать, чтобы улучшить ситуацию?

...