Почему точность при обучении VGG-16 сильно не меняется? - PullRequest
0 голосов
/ 19 мая 2019

В настоящее время я пытаюсь обучить набор данных на модели VGG-16.Проблема в том, что точность не сильно меняется, но она не придерживается фиксированной точности.Рисунок сюжета можно увидеть ниже.Любые предположения, почему это происходит?

Я следовал нескольким инструкциям, чтобы исправить эту проблему, которая о точности застрял, но они не работают.

Figure of accuracy plot

РЕДАКТИРОВАТЬ:

200 эпох

200 Epoch Plot

50 эпох с весами Imagenet

50 Epochs with Imagenet Weights

Код

Входной размер для модели составляет 600 изображений 224x224x3.Более того, две метки собака и кошка (0,1).

Свойства

imageSize = (224,224,3)
epochs = 25
batch_size = 32

Модель

from keras.applications.vgg16 import VGG16
vgg = VGG16(input_shape=imageSize,weights=None,include_top=False)

x = Flatten()(vgg.output)
prediction = Dense(1,activation='sigmoid')(x)

model = Model(inputs=vgg.input,outputs=prediction)
model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['accuracy'])

Генератор изображений

from keras.applications.vgg16 import preprocess_input
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator

imgGen = ImageDataGenerator(rotation_range=20,
                            width_shift_range=0.1,
                            height_shift_range=0.1,
                            shear_range=0.1,
                            zoom_range=0.2,
                            horizontal_flip=True,
                            vertical_flip=True,
                            preprocessing_function = preprocess_input)

Подходящая модель

r = model.fit_generator(imgGen.flow(trainX, trainY, batch_size=batch_size),
                        validation_data = imgGen.flow(testX, testY, batch_size=batch_size),
                        epochs=epochs,
                        steps_per_epoch=len(trainX)//batch_size,
                        validation_steps=len(testX)//batch_size,
                        verbose = 1,
                       )


Ответы [ 3 ]

0 голосов
/ 19 мая 2019

Не используйте оптимизатор adam для обучения VGG, хорошо известно, что он выходит из строя из-за большого количества параметров в сети VGG.Просто используйте sgd и настройте скорость обучения, скажем, начиная с 0,01, увеличивая ее в 10 или 0,1 раза, пока потери тренировки не уменьшатся.

0 голосов
/ 19 мая 2019

Я бы посоветовал вам точно настроить предварительно обученную модель и зафиксировать веса первых нескольких слоев.как:

vgg = VGG16(input_shape=imageSize,weights='imagenet',include_top=False)
for layer in vgg.layers[0:-10]:
    layer.trainable = false
0 голосов
/ 19 мая 2019

25 эпох недостаточно, попробуйте 100 или 200 эпох

def model(self):
    inputs = keras.layers.Input(shape=self.input_Shape)
    x = keras.layers.Conv2D(16, (3,3), activation='relu')(inputs)
    x = keras.layers.MaxPooling2D(2,2)(x)
    x = keras.layers.Conv2D(32,(3,3),activation='relu')(x)
    x = keras.layers.MaxPooling2D(2,2)(x)
    x = keras.layers.Conv2D(64,(3,3),activation='relu')(x)
    x = keras.layers.MaxPooling2D(2,2)(x)
    x = keras.layers.Flatten()(x)
    x = keras.layers.Dense(512,activation='relu')(x)
    outputs = keras.layers.Dense(1,activation='sigmoid')(x)

    model = keras.models.Model(inputs, outputs)
    model.summary()
    model.compile(optimizer=RMSprop(lr=0.001),
                  loss='binary_crossentropy',
                  metrics = ['acc'])

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