Функциональная модель Keras, дающая высокую точность проверки, но неверный прогноз - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь выполнить трансферное обучение для архитектуры VGG16 с предварительно подготовленными весами 'ImageNet' в наборе данных PASCAL VOC 2012. PASCAL VOC - это набор данных изображений с несколькими метками с 20 классами, поэтому я изменил встроенную модель VGG16 следующим образом:

def VGG16_modified():
    base_model = vgg16.VGG16(include_top=True,weights='imagenet',input_shape=(224,224,3))
    print(base_model.summary())
    x = base_model.get_layer('block5_pool').output
    x = (GlobalAveragePooling2D())(x)
    predictions = Dense(20,activation='sigmoid')(x)

    final_model = Model(input = base_model.input, output = predictions)
    print(final_model.summary())
    return final_model

, и моя предварительная обработка входного изображения выглядит следующим образом:

img_val = []
for i in tqdm(range(dfval.shape[0])):
        img = image.load_img(train_images+y_val[0][i],target_size=(224,224))
        img = image.img_to_array(img)
        img_val.append(img)
x_val = np.array(img_val

Я конвертировал категориальные метки, подобные этой, с помощью pd.get_dummies для 20 классов [[0 0 0 0 1 0 0 0 0 1 0 .... ]], и соответствующие метки имеют форму (number of image samples, 20). Входные изображения имеют форму (number of image samples, 224,224, 3)

Когда я обучал модель в течение нескольких эпох, я вижу очень хорошую точность проверки (около 90%), но когда я использовал один и тот же набор данных проверки для прогнозирования изображений, этодает один и тот же вывод класса для каждого изображения.

Я обучил модель следующим образом:

model = VGG16_modified()
model.summary()
model.compile(optimizer=Adam(),loss='binary_crossentropy',metrics = ['accuracy'])
model.fit(x_train, y_train, epochs=100, validation_data=(x_val, yval), batch_size=4)
model.save('CAMVGG16trainall.h5')
model.save_weights('CAMVGG16weightstrainall.h5')

Позже я загрузил модель и попытался предсказать метки для того же набора данных проверки.

model = load_model(model)
preds = model.predict(image)

Но я получаю одинаковый вывод для каждого изображения. Выходные данные имеют форму [[0 0 0 ......1 0 0 0...]] Я пробовал с большим количеством эпох, меньшим количеством эпох, установив несколько не обучаемых слоев, установив все обучаемые слои, изменив скорость обучения, используя другой оптимизатор (SGD), не используя Imagenetвеса и тренировки с нуля, но ни один из них не дает мне правильных результатов. Может кто-нибудь сказать мне, где я ошибся.

...