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表示维度,纵向的连接
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值