簡體   English   中英

ResNet50 Model 沒有在 keras 中使用遷移學習進行學習

[英]ResNet50 Model is not learning with transfer learning in keras

我正在嘗試在 ResNet50 model 上執行遷移學習,該 ResNet50 model 在 PASCAL VOC 2012 數據集的 Imag.net 權重上進行了預訓練。 因為它是一個多 label 數據集,所以我在最后一層使用sigmoid激活 function 和binary_crossentropy損失。 指標是precision,recall and accuracy 下面是我用來為 20 個類構建 model 的代碼(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 個 epochs 直到 earlystopping,指標如下(沒有 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

使用 dropout,在幾個時期內,model 達到了 0.2 的驗證精度和准確度,但不超過該值。

我發現與有和沒有 dropout 層的訓練集相比,驗證集的精度和召回率都非常低。 我應該如何解釋這個? 這是否意味着 model 過擬合。 如果是這樣,我該怎么辦? 到目前為止,model 的預測是相當隨機的(完全不正確)。 數據集大小為 11000 張圖像。

請您修改如下代碼並嘗試執行

從:

predictions = Dense(num_classes, activation= 'sigmoid')(x)

至:

predictions = Dense(num_classes, activation= 'softmax')(x)

從:

model.compile(optimizer= adam, loss='binary_crossentropy', metrics=['accuracy',precision_m,recall_m])

至:

model.compile(optimizer= adam, loss='categorical_crossentropy', metrics=['accuracy',precision_m,recall_m])

這個問題很老了,但我會回答它以防它對其他人有幫助:

在此示例中,您凍結了除最后兩個層(全局平均池化層和最后一個密集層)之外的所有層。 有一種更簡潔的方法可以實現相同的 state:

rn50 = applications.resnet50.ResNet50(weights='imagenet', include_top=False, 
input_shape=(img_height, img_width, 3))

x = rn50.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(num_classes, activation= 'sigmoid')(x)
model = Model(inputs = base_model.input, outputs = predictions)

rn50.trainable = False  # <- this

model.compile(...)

在這種情況下,正在從 ResNet50.network 中提取特征並將其饋送到線性 softmax 分類器,但未訓練 ResNet50 的權重。 這稱為特征提取,而不是微調。

唯一被訓練的權重來自你的分類器,它是用從隨機分布中抽取的權重實例化的,因此應該完全訓練。 您應該使用默認學習率的 Adam:

model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.001))

所以你可以訓練它幾個時期,一旦完成,你就解凍骨干並“微調”它:

backbone.trainable = False
model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.001))
model.fit(epochs=50)

backbone.trainable = True
model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.00001))
model.fit(epochs=60, initial_epoch=50)

Keras 網站上有一篇關於此的好文章: https://keras.io/guides/transfer_learning/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM