在Keras中進行模型微調通常涉及以下步驟:
加載預訓練的模型:首先,您需要加載一個預訓練的模型,通常是一個在大規模數據集上訓練過的模型,如VGG、ResNet等。
凍結模型的部分層:為了保留預訓練模型學習到的特征,通常會凍結模型的一部分層,例如所有卷積層。這樣可以確保這些層的權重不會在微調過程中被更新。
添加新的全連接層:在模型的頂部添加一個或多個全連接層,用于將預訓練模型的輸出與您的任務進行聯系。
解凍一些層:選擇一些層解凍,允許它們在微調過程中更新其權重。通常建議解凍最后幾個卷積層和全連接層。
編譯模型:編譯模型并選擇優化器、損失函數和評估指標。
訓練模型:使用您的數據集對模型進行微調,調整模型的權重以適應您的特定任務。
以下是一個示例代碼,演示如何在Keras中微調預訓練模型:
from keras.applications import VGG16
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras.optimizers import SGD
# 加載預訓練的VGG模型
base_model = VGG16(weights='imagenet', include_top=False)
# 凍結模型的卷積層
for layer in base_model.layers:
layer.trainable = False
# 添加全局平均池化層
x = base_model.output
x = GlobalAveragePooling2D()(x)
# 添加全連接層
x = Dense(1024, activation='relu')(x)
predictions = Dense(num_classes, activation='softmax')(x)
# 構建模型
model = Model(inputs=base_model.input, outputs=predictions)
# 解凍最后的卷積層
for layer in model.layers[-4:]:
layer.trainable = True
# 編譯模型
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])
# 訓練模型
model.fit(train_data, train_labels, epochs=10, batch_size=32, validation_data=(val_data, val_labels))
在上面的代碼中,我們加載了預訓練的VGG模型,并在其頂部添加了全連接層。然后我們解凍了最后的卷積層,并編譯了模型。最后,我們使用fit
方法訓練模型。您可以根據實際情況調整代碼以適應您的任務和數據集。