本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
在pytorch模型应用中,我们往往需要对构建好的模型进行微小修改,
本节讲解pyroch中一些简单场景时如何往原有的模型中再添加一层
本节展示几种可以简单往pytorch模型里增加一层的场景及处理方法
pytorch模型-简单增加层-前言
模型要增加一层,意味着要在forward中使用这一层,这往往就涉及到修改forward中的代码
这种情况相对复杂些,请参考《》
但有些情况,并不需要修改forward代码,而只需要简单地修改模型结构就可以了
本文列举一些简单的、只增加层而不需要forward代码的场景
往Sequential里增加一层:直接增加一层
如果模型新增的层被包含在Sequential里,那此时是较简单的,只需要在Sequential里插入新增的层就可以了
示例如下:
from torch import nn
# --------------定义模型------------------------------
class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.stack = nn.Sequential(
nn.Linear(3,5)
# 想在这里增加一个ReLu层
,nn.Linear(5,5)
)
def forward(self, x):
y = self.stack(x)
return y
# -----------打印模型结构-------------------
model = ConvNet() # 初始化模型
print('\n原模型结构:',model) # 打印模型结构
# -------往模型中新增一层----------
newL = nn.ReLU(inplace=True) # 需要新增的层
model.stack.insert(1,newL) # 在Sequential中指定位置插入一层
print('\n修改后的模型结构:',model) # 打印修改后的模型结构
运行结果如下:
可以看到,已经在原模型中成功插入了ReLu层
往顺序模块增加一层-重新组装
如果模型的forward逻辑是顺序执行模型里的每一层,
那么可以把模型的所有层提取出来,与新增的层合并后再组装到Sequential中生成新的模型
具体示例如下:
from torch import nn
# --------------定义模型------------------------------
class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.L1 = nn.Linear(3,5)
# 想在这里增加一个ReLu层
self.L2 = nn.Linear(5,5)
def forward(self, x):
y = self.L1(x)
y = self.L2(x)
return y
# -----------打印模型结构-------------------
model = ConvNet() # 初始化模型
print('\n原模型结构:',model) # 打印模型结构
# -------往模型中新增一层----------
newL = nn.ReLU(inplace=True) # 需要新增的层
modules = list(model.children()) # 提取出模型原有所有层
modules.insert(1,newL) # 往模块列表中添加新增的层
model = nn.Sequential(*modules) # 将模块列表重新生成模型
print('\n修改后的模型结构:',model) # 打印修改后的模型结构
运行结果如下:
可以看到,已经在原模型中成功插入了ReLu层
某层前后执行-附加到该层
如果增加的层是直接在某层(不妨记为A层)之前或之后执行的,
那么可以将新增的层与A层封装在一起,再替换掉A层,就可以达到我们想要的效果
from torch import nn
# --------------定义模型------------------------------
class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.L1 = nn.Linear(3,5)
self.R1 = nn.ReLU(inplace=True)
self.L2 = nn.Linear(5,5)
self.R2 = nn.ReLU(inplace=True)
def forward(self, x):
y = self.R1(self.L1(x))
y = self.R2(self.L2(y))
return y
# -----------打印模型结构-------------------
model = ConvNet() # 初始化模型
print('\n原模型结构:',model) # 打印模型结构
# -------往模型中新增一层----------
# 需要新增的层
newL = nn.Sequential(
nn.Linear(5,5),
nn.ReLU(inplace=True)
)
# 将新增的层与模型已有层进行捆绑,再替换原来的层
model.R1 = nn.Sequential(
model.R1,
newL
)
print('\n修改后的模型结构:',model) # 打印修改后的模型结构
运行结果如下:
虽然在模型结构上并不是那么的优美,但的确能实现到我们想要的效果
End