微調:若所有層的參數不凍結就表示所有特征提取的層用預訓練的模型參數代替本應該的隨機初始化,修改過的最后一層還是保持隨機初始化,這樣訓練時前面大量特征層的參數和我們自己數據集上理想的參數已很接近,只需在訓練過程中自動微調即可
凍結某些層方式一:遍歷模型中的層的參數,凍結需要凍結的
# 查看模型一級子層個數
count = 0
for layer in resnet_18.children():
count = count + 1
print(count) # 共10個一級子層
# 遷移學習凍結部分參數
count = 0
for layer in resnet_18.children():
count = count + 1
if count < 10:
for param in layer.parameters():
param.requires_grad = False # 前9個一級子層無需參數更新
# 最后一個(第10個)調整過輸出的全連接層不凍住參數
# 將需要優化的參數傳入優化器,不需要傳入的參數過濾掉
optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, resnet_18.parameters()), lr=LR)
凍結某些層方式二:先凍結模型的所有層參數,然后在修改模型的某一層,則修改的層的參數不會被凍結
model = torchvision.models.resnet34(pretrained=True)
# 凍結參數
for param in model.parameters():
param.requires_grad = False
model.fc = torch.nn.Sequential(
torch.nn.Linear(in_features=model.fc.in_features, out_features=classes_num)) # 修改模型最后一層(第10層)
查看模型中每層的參數凍結情況:
for k, v in model.named_parameters():
print("{}:參數需要計算梯度並更新嗎?{}".format(k, v.requires_grad)) # False表示凍結了,True表示沒有凍結