7.pytorch训练技巧

tech2026-04-17  1

目录

1.模型加载与保存

1.1模型的加载与保存

1.2.断点续训练

2.模型微调

3.GPU的使用

4.pytorch常见问题


更多见深度学习.pytorch

1.模型加载与保存

1.1模型的加载与保存

path_model = "./model.pkl" path_state_dict = "./model_state_dict.pkl" # 保存整个模型 torch.save(net, path_model) # 保存模型参数 net_state_dict = net.state_dict() torch.save(net_state_dict, path_state_dict)

保存模型可以有两种方式:1.保存整个模型;2.保存模型参数;官网推荐第二种方式,保存模型参数。

模型加载也分两种方式:

1.如果是保存整个模型,则直接加载整个模型

# ================================== load net =========================== # flag = 1 flag = 0 if flag: path_model = "./model.pkl" net_load = torch.load(path_model) print(net_load)

 2.如果是保存模型参数,则加载模型参数,并更网络模型的模型参数

# ================================== load state_dict =========================== flag = 1 # flag = 0 if flag: path_state_dict = "./model_state_dict.pkl" state_dict_load = torch.load(path_state_dict) print(state_dict_load.keys()) # ================================== update state_dict =========================== flag = 1 # flag = 0 if flag: net_new = LeNet2(classes=2019) print("加载前: ", net_new.features[0].weight[0, ...]) net_new.load_state_dict(state_dict_load) print("加载后: ", net_new.features[0].weight[0, ...])

1.2.断点续训练

为什么要使用断点续训练?

因为在训练模型过程中可能会因为断电等意外中断,训练停止后,我们不想重新训练模型。可以通过保存断点的方式,重新接着上次停止的地方继续训练模型。

保存断点:

checkpoint = {"model_state_dict": net.state_dict(), "optimizer_state_dict": optimizer.state_dict(), "epoch": epoch} path_checkpoint = "./checkpoint_{}_epoch.pkl".format(epoch) torch.save(checkpoint, path_checkpoint)

断点恢复

# ============================ step 2/5 模型 ============================ net = LeNet(classes=2) net.initialize_weights() # ============================ step 3/5 损失函数 ============================ criterion = nn.CrossEntropyLoss() # 选择损失函数 # ============================ step 4/5 优化器 ============================ optimizer = optim.SGD(net.parameters(), lr=LR, momentum=0.9) # 选择优化器 scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=6, gamma=0.1) # 设置学习率下降策略 # ============================ step 5+/5 断点恢复 ============================ path_checkpoint = "./checkpoint_4_epoch.pkl" checkpoint = torch.load(path_checkpoint) net.load_state_dict(checkpoint['model_state_dict']) optimizer.load_state_dict(checkpoint['optimizer_state_dict']) start_epoch = checkpoint['epoch'] scheduler.last_epoch = start_epoch

2.模型微调

模型微调包括3个步骤:1.构建模型;2.加载参数;3.修改全连接fc层

# 3/3 替换fc层 num_ftrs = resnet18_ft.fc.in_features resnet18_ft.fc = nn.Linear(num_ftrs, classes)

模型微调方法包括两种:

1.固定预训练的参数(requres_grad=flase,lr=0)

2.Features Extractor较小学习率(params_group)

2.1.固定预训练的参数(requres_grad=flase,lr=0)

# ============================ step 2/5 模型 ============================ # 1/3 构建模型 resnet18_ft = models.resnet18() # 2/3 加载参数 # flag = 0 flag = 1 if flag: path_pretrained_model = os.path.join(BASEDIR, "..", "..", "data", "finetune_resnet18-5c106cde.pth") if not os.path.exists(path_pretrained_model): raise Exception("\n{} 不存在,请下载 07-02-数据-模型finetune.zip\n放到 {}下,并解压即可".format( path_pretrained_model, os.path.dirname(path_pretrained_model))) state_dict_load = torch.load(path_pretrained_model) resnet18_ft.load_state_dict(state_dict_load) # 法1 : 冻结卷积层 flag_m1 = 0 # flag_m1 = 1 if flag_m1: for param in resnet18_ft.parameters(): param.requires_grad = False print("conv1.weights[0, 0, ...]:\n {}".format(resnet18_ft.conv1.weight[0, 0, ...])) # 3/3 替换fc层 num_ftrs = resnet18_ft.fc.in_features resnet18_ft.fc = nn.Linear(num_ftrs, classes) resnet18_ft.to(device) # ============================ step 3/5 损失函数 ============================ criterion = nn.CrossEntropyLoss() # 选择损失函数 # ============================ step 4/5 优化器 ============================ optimizer = optim.SGD(resnet18_ft.parameters(), lr=LR, momentum=0.9) # 选择优化器 scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=lr_decay_step, gamma=0.1) # 设置学习率下降策略

2.2.Features Extractor较小学习率(params_group)

# ============================ step 2/5 模型 ============================ # 1/3 构建模型 resnet18_ft = models.resnet18() # 2/3 加载参数 # flag = 0 flag = 1 if flag: path_pretrained_model = os.path.join(BASEDIR, "..", "..", "data", "finetune_resnet18-5c106cde.pth") if not os.path.exists(path_pretrained_model): raise Exception("\n{} 不存在,请下载 07-02-数据-模型finetune.zip\n放到 {}下,并解压即可".format( path_pretrained_model, os.path.dirname(path_pretrained_model))) state_dict_load = torch.load(path_pretrained_model) resnet18_ft.load_state_dict(state_dict_load) # 3/3 替换fc层 num_ftrs = resnet18_ft.fc.in_features resnet18_ft.fc = nn.Linear(num_ftrs, classes) resnet18_ft.to(device) # ============================ step 3/5 损失函数 ============================ criterion = nn.CrossEntropyLoss() # 选择损失函数 # ============================ step 4/5 优化器 ============================ # 法2 : conv 小学习率 fc_params_id = list(map(id, resnet18_ft.fc.parameters())) # 返回的是parameters的 内存地址 base_params = filter(lambda p: id(p) not in fc_params_id, resnet18_ft.parameters()) optimizer = optim.SGD([ {'params': base_params, 'lr': LR*0}, # 0 {'params': resnet18_ft.fc.parameters(), 'lr': LR}], momentum=0.9) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=lr_decay_step, gamma=0.1) # 设置学习率下降策略

使用第二种方法更加灵活,

源代码地址:https://github.com/JansonYuan/Pytorch-Camp/blob/master/hello%20pytorch/lesson/lesson-29/finetune_resnet18.py 

3.GPU的使用

3.1CPU与GPU及数据在CPU与GPU间的迁移

pytorch有两种数据类型:tensor和module。data=tensor+module.

从CPU到GPU:data.to("cuda")

从GPU到CPU:data.to("cpu")

to()函数,数据类型转换或者设备转换。执行to函数是张量不执行replace,module执行replace。

 

 

3.2GPU并行运算

4.pytorch常见问题

最新回复(0)