pytorch中的pre-train函式模型或者舊的模型的引用及修改(增減網路層,修改某層引數等) finetune微調等
阿新 • • 發佈:2019-02-05
[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)
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)