pytorch fine tune 預訓練模型

2021-09-30 01:19:16 字數 1434 閱讀 2816

以 resnet18 為例:

from torchvision import models

from torch import nn

from torch import optim

resnet_model = models.resnet18(pretrained=true)

# 假設 我們的 分類任務只需要 分 100 類,那麼我們應該做的是

# 1. 檢視 resnet 的原始碼

# 2. 看最後一層的 名字是啥 (在 resnet 裡是 self.fc = nn.linear(512 * block.expansion, num_classes))

# 3. 在外面替換掉這個層

resnet_model.fc= nn.linear(in_features=..., out_features=100)

# 這樣就可以了,修改後的模型除了輸出層的引數是 隨機初始化的,其他層都是用預訓練的引數初始化的。

# 如果只想訓練最後一層,應該做的是:

# 1. 將其它層的引數 requires_grad 設定為 false

# 2. 構建乙個 optimizer, optimizer 管理的引數只有最後一層的引數

# 3. 然後 backward, step 就可以了

# 這一步可以節省大量的時間,因為多數的引數不需要計算梯度

for para in list(resnet_model.parameters())[:-1]:

para.requires_grad=false

optimizer = optim.sgd(params=[resnet_model.fc.weight,

resnet_model.fc.bias],

lr=1e-3)

這裡介紹下 執行resnet_model.fc= nn.linear(in_features=..., out_features=100)時 框架內發生了什麼

這時應該看nn.module原始碼的__setattr__部分,因為setattr時都會呼叫這個方法:

def __setattr__(self, name, value):

def remove_from(*dicts):

for d in dicts:

if name in d:

del d[name]

首先映入眼簾就是 remove_from 這個函式,這個函式的目的就是,如果出現了 同名的屬性,就將舊的屬性移除。 用剛才舉的例子就是:

預訓練的模型中 有個 名字叫fc 的 module。

在類定義外,我們 將另乙個 module 重新 賦值給了 fc。

類定義內的 fc 對應的 module 就會從 模型中 刪除。

預訓練模型

elmo elmo是一種是基於特徵的語言模型,用預訓練好的語言模型,生成更好的特徵。而elmo的主要做法是先訓練乙個完整的語言模型,再用這個語言模型去處理需要訓練的文字,生成相應的詞向量。文字分類實戰 九 elmo 預訓練模型 在nlp領域,使用預訓練模型或元件的監督學習任務被稱為下游任務 bert...

bert預訓練模型解讀 Bert 預訓練小結

最近正在預訓練乙個中文pytorch版本的bert,模型部分 是基於huggingface發布的版本,預訓練過程還是參考google的 值得吐槽的是huggingface之前發布的分支名叫pytorch pretrain bert,後來又加上了gpt2 xlnet一系列當紅模型,結果索性改了個名字叫...

TensorFlow Keras預訓練模型測試

densenet121 densenet169 densenet201 inceptionresnetv2 inceptionv3 mobilenet nasnetlarge nasnetmobile resnet50 vgg16 vgg19 xception 這些人工神經網路模型的類都有各自對應的...