VisualPytorch发布域名+双服务器以下:
http://nag.visualpytorch.top/static/ (对应114.115.148.27)
http://visualpytorch.top/static/ (对应39.97.209.22)python
共同贡献PyTorch常见错误与坑汇总文档:《PyTorch常见报错/坑汇总》服务器
net = LeNet2(classes=2019) # 法1: 保存整个Module,不只保存参数,也保存结构 torch.save(net, path) net_load = torch.load(path_model) # 网络名称、结构、模型参数、优化器参数均保留 # 法2: 保存模型参数(推荐,占用资源少) state_dict = net.state_dict() torch.save(state_dict , path) net_new = LeNet2(classes=2019) net_new.load_state_dict(state_dict_load)
保存:网络
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)
恢复:dom
# ============================ 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']) scheduler.last_epoch = checkpoint['epoch']
机器学习分支,研究源域(source domain)的知识如何应用到目标域(target domain)机器学习
模型微调步骤:函数
模型微调训练方法:学习
到蚂蚁-蜜蜂二分类任务,其中有114张训练,80张测试。能够看出来训练数据仍是至关小的,必须有已经训练好的模型。测试
模型搭建以下:优化
# ============================ step 2/5 模型 ============================ # 1/3 构建模型 resnet18_ft = models.resnet18() # 2/3 加载参数 !!! path_pretrained_model = "resnet18-5c106cde.pth" state_dict_load = torch.load(path_pretrained_model) resnet18_ft.load_state_dict(state_dict_load) # 法1 : 冻结卷积层,模型参数再也不更新 for param in resnet18_ft.parameters(): param.requires_grad = False # 3/3 替换fc层,将本来输出神经元个数改成 classes = 2 !!! num_ftrs = resnet18_ft.fc.in_features resnet18_ft.fc = nn.Linear(num_ftrs, classes)
若是不加载参数,训练了25个epoch仍只有70%正确率,最后Loss保持在0.5左右。而若是加载了参数,基本上第二个epoch就达到90%正确率。ui
更推荐的用优化器控制学习率方法:分组灵活控制LR
# ============================ 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.1}, # 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) # 设置学习率降低策略
CPU(Central Processing Unit, 中央处理器):主要包括控制器和运算器
GPU(Graphics Processing Unit, 图形处理器):处理统一的,无依赖的大规模数据运算
在模型训练/测试时必须使全部数据和模型参数都在同一类设备上,而且注意数据的to操做不是inplace操做。
通过实验,上面resnet18的迁移学习中,若是不采用GPU训练一个epoch耗时58.362s,而使用了GPU后仅须要6.626s!
区别:张量不执行inplace,模型执行inplace
x = torch.ones((3, 3)) x = x.to(torch.float64) # 数据类型 x = torch.ones((3, 3)) x = x.to("cuda") # 数据设备 linear = nn.Linear(2, 2) linear.to(torch.double) # 模型数据类型,不改变存储位置 gpu1 = torch.device("cuda") linear.to(gpu1) # 模型设备,不改变存储位置
torch.nn.DataParallel(module, # 须要包装分发的模型 device_ids=None, # 可分发的gpu,默认分发到全部可见可用gpu output_device=None, # 结果输出设备 dim=0 )
功能:包装模型,实现分发并行机制
查询当前gpu内存剩余:
def get_gpu_memory(): import os os.system('nvidia-smi -q -d Memory | grep -A4 GPU | grep Free > tmp.txt') memory_gpu = [int(x.split()[2]) for x in open('tmp.txt', 'r').readlines()] os.system('rm tmp.txt') return memory_gpu gpu_memory = get_gpu_memory() gpu_list = np.argsort(gpu_memory)[::-1] gpu_list_str = ','.join(map(str, gpu_list)) os.environ.setdefault("CUDA_VISIBLE_DEVICES", gpu_list_str) print("\ngpu free memory: {}".format(gpu_memory)) print("CUDA_VISIBLE_DEVICES :{}".format(os.environ["CUDA_VISIBLE_DEVICES"])) >>> gpu free memory: [10362, 10058, 9990, 9990] >>> CUDA_VISIBLE_DEVICES :0,1,3,2
gpu模型加载:
在没有GPU的机器上运行GPU代码:
RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False...
解决: torch.load(path_state_dict, map_location="cpu")
在单GPU机器上加载多GPU训练模型参数(在参数key中会含有module.
)
RuntimeError: Error(s) in loading state_dict for FooNet: Missing key(s) in state_dict: "linears.0.weight", "linears.1.weight", "linears.2.weight". Unexpected key(s) in state_dict: "module.linears.0.weight", "module.linears.1.weight", "module.linears.2.weight".
解决:
from collections import OrderedDict new_state_dict = OrderedDict() for k, v in state_dict_load.items (): namekey = k[7:] if k.startswith('module.') else k new_state_dict[namekey] =v