Я пытаюсь выполнить трансферное обучение для архитектуры 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веса и тренировки с нуля, но ни один из них не дает мне правильных результатов. Может кто-нибудь сказать мне, где я ошибся.