当前位置:   article > 正文

pytorch的学习——迁移学习,模型微调_微调技术中未冻结的层在迁移任务中会消失吗

微调技术中未冻结的层在迁移任务中会消失吗

一、概念

1、迁移学习:把已经训练好的模型参数,迁移到新的模型,来帮助新的模型训练

步骤:网络→大数据集→模型→模型微调→新数据集→新模型。

2、冻结:被冻结的层可以前向传播,也可以反向传播,只是自己这一层的参数不更新,其他未冻结层的参数正常更新。

3、正则化:这里使用BatchNorm,对该层每个节点的这m个输出进行归一化再输出。

二、代码

肺部感染识别,使用resnet50模型

def get_model():
    model_pre = models.resnet50(pretrained=True) #获取预训练模型
    #冻结与训练模型中所有的参数
    for param in model_pre.parameters():
        param.requires_grad = False
    #微调模型:替换ResNet最后的两层网络,返回一个新的模型
    model_pre.avgpool = AdaptiveCancatPool2d()   #池化层的替换
    model_pre.fc = nn.Sequential(
        nn.Flatten(),      #所有维度拉平
        nn.BatchNorm1d(4096), #正则化 256X6X6
        nn.Dropout(0.5),      #丢掉一些神经元
        nn.Linear(4096,512),   #线性层的处理
        nn.ReLU(),
        nn.BatchNorm1d(512),
        nn.Linear(512,2),    #二分类
        nn.LogSoftmax(dim=1) #损失函数
    )
    return model_pre

#更改池化层
class AdaptiveCancatPool2d(nn.Module):
    def __init__(self,size=None):    #size表示卷积核大小
        super.__init__()
        size = size or (1,1)         #池化层卷积核的大小默认(1,1)
        self.pool_one = nn.AdaptiveAvgPool2d(size)       #池化层1
        self.pool_two = nn.AdaptiveAvgPool2d(size)       #池化层2

    def forward(self):
        # 返回两个池化层的连接
        return torch.cat([self.pool_one(x),self.pool_two(x),1])    # 1表示维度,纵向的连接
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/697823
推荐阅读
相关标签
  

闽ICP备14008679号