Pytorch教程

【示例】pytorch模型-简单增加层

作者 : 老饼 发表日期 : 2024-03-12 01:40:13 更新日期 : 2024-03-24 17:19:28
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com



在pytorch模型应用中,我们往往需要对构建好的模型进行微小修改,

本节讲解pyroch中一些简单场景时如何往原有的模型中再添加一层




      01. pytorch模型-简单增加层     




本节展示几种可以简单往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 








联系老饼