当pytorch提供的内置损失函数无法实现需求时,可以通过自定义损失函数来实现目标。内置损失函数定义在torch.nn中,常用的有MSELoss(),L1Loss(),CrossEntropyLoss()等。自定义损失函数常通过类实现,像自定义神经网络一样,继承nn.Module()并且实现__init__()和forward()函数,在使用时,直接实例化类对象即可,这样实现的好处是全程用pytorch内置的数据结构进行处理,规范统一。
动态调整学习率的目的是让减少网络训练中震荡,是loss继续下降,模型收敛的更优。在pytorch中学习率被称为scheduler,一个优化器有多个参数组(param_group),每个参数组中用字典结构存储着信息,其中神经网络的参数组中,键‘lr’对应的就是学习率。定义优化器在torch.optim中,常用的优化器有Adam等,优化器需要至少一个参数,该参数即为该优化器需要优化的网络结构,例如 optimizer = torch.optim.Adam(net.parameters()),学习率的设置为 scheduler1 = torch.optim.lr_scheduler. StepLR (optimizer, ,step_size = 30),在实际训练时,需要先调用优化器optimizer.step()再调用scheduler1.step()进行学习率的改变。自定义调整学习率,定义一个函数def adjust_lr_rate(optimizer,…),通过for param_group in optimizer.param_groups: param_group[‘lr] = adjust_lr_rate(optimizer,…)来实现。
模型微调为借鉴大模型提供了一个有效的方案:通过修改模型的部分层(例如输入层),并关闭其余层的梯度计算,仅开放新加网络层的梯度计算,在沿用大模型模型参数与知识的基础上,在自己小数据集上训练新的网络层,从而高效的实现网络模型。
模型微调实现方法:
https://github.com/datawhalechina/thorough-pytorch/blob/main/%E7%AC%AC%E5%85%AD%E7%AB%A0%20PyTorch%E8%BF%9B%E9%98%B6%E8%AE%AD%E7%BB%83%E6%8A%80%E5%B7%A7/6.3%20%E6%A8%A1%E5%9E%8B%E5%BE%AE%E8%B0%83.md
所谓半精度训练是指将torch默认的float32改成float16,这样在GPU上训练时,每一个batchSize能够节约一定的空间,将其放在cuda上计算时,就能够节约显存,GPU的性能主要有两个指标,分别为算力和显存,前者决定了显卡的计算速度,后者决定了同时可以放入多少数据用于计算,在显存数量一定的情况下,每次训练能够加载的数据越多(batchSize越大),则训练效率会越高,另外,当数据本身较大时,如3D图像或者视频时,显存甚至连BatchSize=1时都无法实现,则使用半精度训练意义更大。
半精度训练实现方法:
https://github.com/datawhalechina/thorough-pytorch/blob/main/%E7%AC%AC%E5%85%AD%E7%AB%A0%20PyTorch%E8%BF%9B%E9%98%B6%E8%AE%AD%E7%BB%83%E6%8A%80%E5%B7%A7/6.4%20%E5%8D%8A%E7%B2%BE%E5%BA%A6%E8%AE%AD%E7%BB%83.md