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