pytorch的学习——迁移学习,模型微调

该博客介绍了如何运用迁移学习来优化ResNet50模型,用于肺部感染识别任务。首先,通过冻结预训练模型的参数,然后利用AdaptiveConcatPool2d替换原模型的avgpool层,并添加正则化、Dropout、线性层及LogSoftmax损失函数进行微调。AdaptiveConcatPool2d结合了两种不同大小的池化层的输出,增强了模型的表达能力。

一、概念

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表示维度,纵向的连接
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值