本文介绍对加载的网络的层进行增删改
, 以alexnet网络为例进行介绍。
import torchvision.models as models
alexnet =models.alexnet(weights=models.AlexNet_Weights.DEFAULT)
print(alexnet)
在做迁移学习的时候,我们通常是在分类网络的基础上进行修改的。一般会把网络最后的几层删除掉,主要是全局平均池化层、全连接层。只留前面的网络部分作为特征提取器,再次基础上进行其他的任务。
classifier
这一部分全删除掉del alexnet.classifer
print(alexnet)
删除classifer
模块后,打印结果如下:
可以看到只剩下features
和avgpool
这两个模块了。刚才的classifier
就已经被我们删除掉了。
classifier
模块中的某一层如果不想把classifier
这一模块整体删除,只想删除classifier
中比如第6
个层
# del alexnet.classifier
del alexnet.classifier[6]
print(alexnet)
如果想把网络的连续几层给删除掉,比如classifier
中最后的几层删除掉
#------------------删除网络的最后多层--------------------------#
alexnet.classifier = alexnet.classifier[:-2]
print(alexnet)
#-------------------------------------------------------------#
classifier
看出最后2层(5,6)被删除掉了可以使用切片的方式,保留不需要被删除的层重新赋给classifier
模块,没有保留的就被删除了。
1000
。1024
。此时,你只需要重新定义这层全连接层。#-----------------修改网络的某一层-----------------------------#
alexnet.classifier[6] = nn.Linear(in_features=4096,out_features=1024)
print(alexnet)
#-------------------------------------------------------------#
打印后,可以看到最后一层的输出由原来的4096改为了1024
假设我们想在网络最后输出中,再添加两层,分别为ReLU
和nn.Linear
层
#-----------------修改网络的某一层-----------------------------#
alexnet.classifier[6] = nn.Linear(in_features=4096,out_features=1024)
# print(alexnet)
#-------------------------------------------------------------#
#-------------网络添加层,每次添加一层--------------------------#
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
来添加层,第一个参数为层名称,第二个参数为定义layer的内容如果觉得一层层的添加层比较麻烦,比如我们可以一次性添加一个大的模块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
网络中新增了new_block
,该block中包括2层,分别是ReLU层以及Linear层。以上就是对Pytorch网络增删改的方法,完整的代码如下:
import torchvision.models as models
import torch.nn as nn
alexnet =models.alexnet(weights=models.AlexNet_Weights.DEFAULT)
# print(alexnet)
#1.-----------------删除网络的最后一层-------------------------#
# del alexnet.classifier
# del alexnet.classifier[6]
# print(alexnet)
#-------------------------------------------------------------#
#------------------删除网络的最后多层--------------------------#
# alexnet.classifier = alexnet.classifier[:-2]
# print(alexnet)
#-------------------------------------------------------------#
#-----------------修改网络的某一层-----------------------------#
alexnet.classifier[6] = nn.Linear(in_features=4096,out_features=1024)
# print(alexnet)
#-------------------------------------------------------------#
#-------------网络添加层,每次添加一层--------------------------#
# alexnet.classifier.add_module('7',nn.ReLU(inplace=True))
# alexnet.classifier.add_module('8',nn.Linear(in_features=1024,out_features=20))
# print(alexnet)
#-------------------------------------------------------------#
#-----------------------网络添加层,一次性添加多层--------------#
block = nn.Sequential(
nn.ReLU(inplace=True),
nn.Linear(in_features=1024,out_features=20)
)
alexnet.add_module('new_block',block)
print(alexnet)
#-------------------------------------------------------------#