网络结构层出不穷,但经典网络总是大家工程上的最爱。有的时候需要对网络进行微操,直接该源码一是工作量太大;二是破坏了原来的网络结构会导致预训练权重无法加载。因此,可以在加载预训练权重后对模型进行微操。
本博文实现了模型中module的删除、修改与添加、以及模型forward流程的修改(重定义),后续将会以模型库中预定义的AlexNet为例子进行实操。
1、module的添加
该操作通过model.add_module实现,具体可见下列代码示意。且通过该操作添加的模块,其参数和可以被model.named_parameters、model.parameters等方法获取到的。
import torch
from torch import nn
import torch.nn.functional as F
from torchvision.models import alexnet
# 以AlexNet为例子
model = alexnet(pretrained=False)
model.eval()
##通过该方法可以实现模块的新增,新增模块并不会被加入到forward流程。
model.add_module('external_bn1',nn.BatchNorm2d(num_features=256))#该模块,不会被加入到模型的forward流程中
#model.add_module('features.external_bn1',