1. 程式人生 > >pytorch中的pre-train函式模型或者舊的模型的引用及修改(增減網路層,修改某層引數等) finetune微調等

pytorch中的pre-train函式模型或者舊的模型的引用及修改(增減網路層,修改某層引數等) finetune微調等

[python] view plain copy import torchvision import torch.optim as optim
import torch.nn as nn
# 區域性微調
# 有時候我們載入了訓練模型後,只想調節最後的幾層,
# 其他層不訓練。其實不訓練也就意味著不進行梯度計算,PyTorch中提供的requires_grad使得對訓練的控制變得非常簡單
model = torchvision.models.resnet18(pretrained=True)
for param in model.parameters():
    param.requires_grad = False

# 替換最後的全連線層, 改為訓練100類
# 新構造的模組的引數預設requires_grad為True

model.fc = nn.Linear(512, 100)


# 只優化最後的分類層

optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)
###########################################################################################
# 全域性微調
# 有時候我們需要對全域性都進行finetune,只不過我們希望改換過的層和其他層的學習速率不一樣,

# 這時候我們可以把其他層和新層在optimizer中單獨賦予不同的學習速率。比如:



ignored_params = list(map(id, model.fc.parameters()))
base_params = filter(lambda p: id(p) not in ignored_params,model.parameters())
#this is the new way to use Optimd
optimizer = optim.SGD([
            {'params': base_params},
            {'params': model.fc.parameters(), 'lr': 1e-3}

            ], lr=1e-2, momentum=0.9)