ResNet50 модель не учится с трансферным обучением в керасе - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь выполнить трансферное обучение на модели ResNet50, предварительно обученной на весах Imagenet для набора данных PASCAL VOC 2012. Поскольку это набор данных с несколькими метками, я использую функцию активации sigmoid в последнем слое и потерю binary_crossentropy. Метрики precision,recall and accuracy. Ниже приведен код, который я использовал для построения модели для 20 классов (у PASCAL VOC есть 20 классов).

img_height,img_width = 128,128
num_classes = 20
#If imagenet weights are being loaded,
#input must have a static square shape (one of (128, 128), (160, 160), (192, 192), or (224, 224))
base_model = applications.resnet50.ResNet50(weights= 'imagenet', include_top=False, input_shape= (img_height,img_width,3))
x = base_model.output
x = GlobalAveragePooling2D()(x)
#x = Dropout(0.7)(x)
predictions = Dense(num_classes, activation= 'sigmoid')(x)
model = Model(inputs = base_model.input, outputs = predictions)
for layer in model.layers[-2:]:
        layer.trainable=True
for layer in model.layers[:-3]:
        layer.trainable=False

adam = Adam(lr=0.0001)
model.compile(optimizer= adam, loss='binary_crossentropy', metrics=['accuracy',precision_m,recall_m])
#print(model.summary())

X_train, X_test, Y_train, Y_test = train_test_split(x_train, y, random_state=42, test_size=0.2)
savingcheckpoint = ModelCheckpoint('ResnetTL.h5',monitor='val_loss',verbose=1,save_best_only=True,mode='min')
earlystopcheckpoint = EarlyStopping(monitor='val_loss',patience=10,verbose=1,mode='min',restore_best_weights=True)
model.fit(X_train, Y_train, epochs=epochs, validation_data=(X_test,Y_test), batch_size=batch_size,callbacks=[savingcheckpoint,earlystopcheckpoint],shuffle=True)
model.save_weights('ResnetTLweights.h5')

Он работал в течение 35 эпох до раннего останова, а показатели следующие (без слоя Dropout):

loss: 0.1195 - accuracy: 0.9551 - precision_m: 0.8200 - recall_m: 0.5420 - val_loss: 0.3535 - val_accuracy: 0.8358 - val_precision_m: 0.0583 - val_recall_m: 0.0757

Даже со слоем Dropout я не вижу большой разницы.

loss: 0.1584 - accuracy: 0.9428 - precision_m: 0.7212 - recall_m: 0.4333 - val_loss: 0.3508 - val_accuracy: 0.8783 - val_precision_m: 0.0595 - val_recall_m: 0.0403

С выпадением, в течение нескольких эпох, модель достигает точности валидации и точности 0,2но не выше этого.

Я вижу, что точность и отзыв набора проверки достаточно низки по сравнению с набором тренировок с выпадающим слоем и без него. Как я должен интерпретировать это? Означает ли это, что модель переоснащается? Если так, что я должен сделать? На данный момент предсказания модели довольно случайны (абсолютно неверны). Размер набора данных составляет 11000 изображений.

...