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表示维度,纵向的连接

你可能感兴趣的:(pytorch,笔记,python)