徐州建站服務(wù)av手機在線精品
本文介紹對加載的網(wǎng)絡(luò)的層進行增刪改
, 以alexnet網(wǎng)絡(luò)為例進行介紹。
1. 加載網(wǎng)絡(luò)
import torchvision.models as models alexnet =models.alexnet(weights=models.AlexNet_Weights.DEFAULT)
print(alexnet)
2. 刪除網(wǎng)絡(luò)
在做遷移學習的時候,我們通常是在分類網(wǎng)絡(luò)的基礎(chǔ)上進行修改的。一般會把網(wǎng)絡(luò)最后的幾層刪除掉,主要是全局平均池化層、全連接層。只留前面的網(wǎng)絡(luò)部分作為特征提取器,再次基礎(chǔ)上進行其他的任務(wù)。
2.1 刪除網(wǎng)絡(luò)任意層
- 將alexnet的
classifier
這一部分全刪除掉
del alexnet.classifer
print(alexnet)
刪除classifer
模塊后,打印結(jié)果如下:
可以看到只剩下features
和avgpool
這兩個模塊了。剛才的classifier
就已經(jīng)被我們刪除掉了。
- 刪除
classifier
模塊中的某一層
如果不想把classifier
這一模塊整體刪除,只想刪除classifier
中比如第6
個層
# del alexnet.classifier
del alexnet.classifier[6]
print(alexnet)
可以看到classifier
中第6層就已經(jīng)被刪除掉了。
2.2 刪除網(wǎng)絡(luò)的最后多層
如果想把網(wǎng)絡(luò)的連續(xù)幾層給刪除掉,比如classifier
中最后的幾層刪除掉
#------------------刪除網(wǎng)絡(luò)的最后多層--------------------------#
alexnet.classifier = alexnet.classifier[:-2]
print(alexnet)
#-------------------------------------------------------------#
打印信息如下:
- 可以看出
classifier
看出最后2層(5,6)被刪除掉了
可以使用切片的方式,保留不需要被刪除的層重新賦給classifier
模塊,沒有保留的就被刪除了。
3. 修改網(wǎng)絡(luò)的某一層
- 沒有修改之前alexnet.classifier的第6層是個全連接層,輸入通道為4096, 輸出通道為
1000
。
- 假設(shè)此時,我們想最后一層全連接層的輸出,改為
1024
。此時,你只需要重新定義這層全連接層。
#-----------------修改網(wǎng)絡(luò)的某一層-----------------------------#
alexnet.classifier[6] = nn.Linear(in_features=4096,out_features=1024)
print(alexnet)
#-------------------------------------------------------------#
打印后,可以看到最后一層的輸出由原來的4096改為了1024
4. 在網(wǎng)絡(luò)中添加某一層
4.1 每次添加一層
假設(shè)我們想在網(wǎng)絡(luò)最后輸出中,再添加兩層,分別為ReLU
和nn.Linear
層
#-----------------修改網(wǎng)絡(luò)的某一層-----------------------------#
alexnet.classifier[6] = nn.Linear(in_features=4096,out_features=1024)
# print(alexnet)
#-------------------------------------------------------------##-------------網(wǎng)絡(luò)添加層,每次添加一層--------------------------#
alexnet.classifier.add_module('7',nn.ReLU(inplace=True))
alexnet.classifier.add_module('8',nn.Linear(in_features=1024,out_features=20))
print(alexnet)
#-------------------------------------------------------------#
- 利用
add_module
來添加層,第一個參數(shù)為層名稱,第二個參數(shù)為定義layer的內(nèi)容 - 我們在alexnet.classifier這個block中進行添加的,添加后打印網(wǎng)絡(luò)結(jié)構(gòu)如下:
- 可以看到成功的添加了最后2層。
4.2 一次添加多層
如果覺得一層層的添加層比較麻煩,比如我們可以一次性添加一個大的模塊new_block
。
block = nn.Sequential(nn.ReLU(inplace=True),nn.Linear(in_features=1024,out_features=20)
)alexnet.add_module('new_block',block)
print(alexnet)
- 可以看到在
alexnet
網(wǎng)絡(luò)中新增了new_block
,該block中包括2層,分別是ReLU層以及Linear層。
以上就是對Pytorch網(wǎng)絡(luò)增刪改的方法,完整的代碼如下:
import torchvision.models as models
import torch.nn as nn alexnet =models.alexnet(weights=models.AlexNet_Weights.DEFAULT)
# print(alexnet)#1.-----------------刪除網(wǎng)絡(luò)的最后一層-------------------------#
# del alexnet.classifier
# del alexnet.classifier[6]
# print(alexnet)
#-------------------------------------------------------------##------------------刪除網(wǎng)絡(luò)的最后多層--------------------------#
# alexnet.classifier = alexnet.classifier[:-2]
# print(alexnet)
#-------------------------------------------------------------##-----------------修改網(wǎng)絡(luò)的某一層-----------------------------#
alexnet.classifier[6] = nn.Linear(in_features=4096,out_features=1024)
# print(alexnet)
#-------------------------------------------------------------##-------------網(wǎng)絡(luò)添加層,每次添加一層--------------------------#
# alexnet.classifier.add_module('7',nn.ReLU(inplace=True))
# alexnet.classifier.add_module('8',nn.Linear(in_features=1024,out_features=20))
# print(alexnet)
#-------------------------------------------------------------##-----------------------網(wǎng)絡(luò)添加層,一次性添加多層--------------#
block = nn.Sequential(nn.ReLU(inplace=True),nn.Linear(in_features=1024,out_features=20)
)alexnet.add_module('new_block',block)
print(alexnet)
#-------------------------------------------------------------#