当前位置: 首页 > news >正文

东营做网站建设的公司朱柏青建盏个人简介

东营做网站建设的公司,朱柏青建盏个人简介,泰安做网站建设的,浏阳做网站目录 0. 前言 1. 自调整学习率的常用方法 1.1 ExponentialLR 指数衰减方法 1.2 CosineAnnealingLR 余弦退火方法 1.3 ChainedScheduler 链式方法 2. 实例说明 3. 结果说明 3.1 余弦退火法训练过程 3.2 指数衰减法训练过程 3.3 恒定学习率训练过程 3.4 结果解读 4. …目录 0. 前言 1. 自调整学习率的常用方法 1.1  ExponentialLR 指数衰减方法 1.2 CosineAnnealingLR 余弦退火方法 1.3 ChainedScheduler 链式方法 2. 实例说明 3. 结果说明 3.1 余弦退火法训练过程 3.2 指数衰减法训练过程 3.3 恒定学习率训练过程 3.4 结果解读 4. 完整代码 0. 前言 按照国际惯例首先声明本文只是我自己学习的理解虽然参考了他人的宝贵见解及成果但是内容可能存在不准确的地方。如果发现文中错误希望批评指正共同进步。 本文介绍深度学习训练中经常能使用到的实用技巧——自调整学习率并基于PyTorch框架通过实例进行使用最后对比同样条件下以自调整学习率和固定学习率在模型训练上的表现。 在深度学习模型训练过程中经常会出现损失值不收敛的头疼情况令人怀疑自己设计的网络模型存在不合理或者错误之处但是导致这种情况的真正原因往往非常简单——就是学习率的设定不合理。 这就导致在深度学习模型训练的初期可能需要“摸索”一个比较合适的学习率在后期逐渐细化的过程可能还需要尝试其他的学习率进行“分段训练”。学习率的这种“摸索”费时费力因此自调整学习率的方法应运而生。 1. 自调整学习率的常用方法 自调整学习率是一种通用的方法通过在训练期间动态地更新学习率以使模型更好地收敛提高模型的精确度和稳定性。在PyTorch框架 torch.optim.lr_scheduler 中集成了大量的自调整学习率的方法 lr_scheduler.LambdaLR lr_scheduler.MultiplicativeLR lr_scheduler.StepLR lr_scheduler.MultiStepLR lr_scheduler.ConstantLR lr_scheduler.LinearLR lr_scheduler.ExponentialLR lr_scheduler.PolynomialLR lr_scheduler.CosineAnnealingLR lr_scheduler.ChainedScheduler lr_scheduler.SequentialLR lr_scheduler.ReduceLROnPlateau lr_scheduler.CyclicLR lr_scheduler.OneCycleLR lr_scheduler.CosineAnnealingWarmRestarts 这里具体方法虽然很多但是每种自动调整学习率的策略都比较简单本文仅介绍以下两种常见的方法其余可以查看PyTorch官网说明。 1.1  ExponentialLR 指数衰减方法 这种方法的学习率为 这里有两个参数 初始学习率衰减指数取值范围01一般来说取值要非常接近10.95甚至要0.99否则在动辄几百几千的迭代次数epoch条件下学习率很快会衰减到0 PyTorch调用代码为 torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch) optimizer训练该模型的优化算法gamma上面的衰减指数last_epoch不用理会默认-1即可 1.2 CosineAnnealingLR 余弦退火方法 首先我要吐槽下不知道是哪个大聪明给起的这个名字我学过《机械加工原理与工艺》但我不明白这个算法和退火有什么关系名字非常唬人方法并不复杂。 这个方法就是让学习率按余弦曲线进行震荡其震荡范围为[0, lr_initial]震荡周期为T_max PyTorch调用代码为 torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, last_epoch) 其参数同上说明不再赘述。 1.3 ChainedScheduler 链式方法 这个方法说白了就是多种自调节学习率方法进行组合使用例如以下 scheduler1 ConstantLR(self.opt, factor0.1, total_iters2) scheduler2 ExponentialLR(self.opt, gamma0.9) scheduler ChainedScheduler([scheduler1, scheduler2]) 最后再强调一下无论使用哪种方法在coding时别忘了每个epoch学习后加上 scheduler.step() 这样才能更新学习率。 2. 实例说明 本文目的是验证自调节学习率的作用选用一个简单的“平方网络”实例即期望输出为输入值的平方。 训练输入数据x_train输出数据y_train分别为 x_train torch.tensor([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1],dtypetorch.float32).unsqueeze(-1) y_train torch.tensor([0.01,0.04,0.09,0.16,0.25,0.36,0.49,0.64,0.81,1],dtypetorch.float32).unsqueeze(-1) 验证输入数据x_val为 x_val torch.tensor([0.15,0.25,0.35,0.45,0.55,0.65,0.75,0.85,0.95],dtypetorch.float32).unsqueeze(-1) 网络模型使用5层全连接网络对应这种简单问题足够用了 class Linear(torch.nn.Module):def __init__(self):super().__init__()self.layers torch.nn.Sequential(torch.nn.Linear(in_features1, out_features3),torch.nn.Sigmoid(),torch.nn.Linear(in_features3,out_features5),torch.nn.Sigmoid(),torch.nn.Linear(in_features5, out_features10),torch.nn.Sigmoid(),torch.nn.Linear(in_features10,out_features5),torch.nn.Sigmoid(),torch.nn.Linear(in_features5, out_features1),torch.nn.ReLU(),) 优化器选用Adam训练组及验证组的损失函数都选用MSE均方差。 3. 结果说明 对于本文对比的三种方法其训练参数设定如下表 学习率调整方法训练参数设定指数衰减迭代次数epoch2000初始学习率initial_lr0.0005衰减指数gamma0.99995余弦退火迭代次数epoch2000初始学习率initial_lr0.001因为学习率均值为初始值的一半公平起见给余弦退火方法初始学习率*2震荡周期T_max200恒定学习率学习率lr0.0005 各种方法的训练过程如下图 3.1 余弦退火法训练过程 3.2 指数衰减法训练过程 3.3 恒定学习率训练过程 3.4 结果解读 指数衰减方法的gamma真的要选择非常接近1才行理由我上面也解释了下面是gamma0.999时的loss下降情况可见其下降速度之慢 本实例中使用余弦退火方法训练的模型在验证组表现最好验证组损失值val0.0027其次是指数衰减法val0.0037最差是恒定学习率val0.0053但这个结果仅限本实例中并不是说哪种方法就比哪种方法好在不同模型上可能要因地制宜选择合适的方法目前这些所谓的“自调节学习率”我认为仅能算是“半自动调节”因为仍有超参数需要事前设定例如衰减指数gamma。而选择哪种方法最好以及这种方法的参数如何设定呢可能还是需要做一定的“摸索”但是相比恒定学习率肯定会节省很多时间 4. 完整代码 import torch import matplotlib.pyplot as plt from tqdm import tqdm import argparsetorch.manual_seed(25)x_train torch.tensor([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1],dtypetorch.float32).unsqueeze(-1) y_train torch.tensor([0.01,0.04,0.09,0.16,0.25,0.36,0.49,0.64,0.81,1],dtypetorch.float32).unsqueeze(-1) x_val torch.tensor([0.15,0.25,0.35,0.45,0.55,0.65,0.75,0.85,0.95],dtypetorch.float32).unsqueeze(-1)class Linear(torch.nn.Module):def __init__(self):super().__init__()self.layers torch.nn.Sequential(torch.nn.Linear(in_features1, out_features3),torch.nn.Sigmoid(),torch.nn.Linear(in_features3,out_features5),torch.nn.Sigmoid(),torch.nn.Linear(in_features5, out_features10),torch.nn.Sigmoid(),torch.nn.Linear(in_features10,out_features5),torch.nn.Sigmoid(),torch.nn.Linear(in_features5, out_features1),torch.nn.ReLU(),)def forward(self,x):return self.layers(x)criterion torch.nn.MSELoss()def train_with_CosinAnneal(epoch, initial_lr, T_max):linear1 Linear()opt torch.optim.Adam(linear1.parameters(), lrinitial_lr)scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizeropt, T_maxT_max, last_epoch-1)last_epoch_loss 0for i in tqdm(range(epoch)):opt.zero_grad()total_loss 0for j in range(len(x_train)):output linear1(x_train[j])loss criterion(output,y_train[j])total_loss total_loss loss.detach()loss.backward()opt.step()if i epoch-1:last_epoch_loss total_lossscheduler.step()cur_lr scheduler.get_lr() #查看学习率变化情况# plt.scatter(i, cur_lr, s2, cg) plt.scatter(i, total_loss,s2,cr)val 0for x in x_val:val val ((linear1(x) - x * x) / x * x)**2plt.title(CosinAnneal---val%f---last_epoch_loss%f%(val,last_epoch_loss))plt.xlabel(epoch)plt.ylabel(loss)plt.show()def train_with_ExponentialLR(epoch, initial_lr, gamma):linear2 Linear()opt torch.optim.Adam(linear2.parameters(), lrinitial_lr)scheduler torch.optim.lr_scheduler.ExponentialLR(optimizeropt, gammagamma, last_epoch-1)last_epoch_loss 0for i in tqdm(range(epoch)):opt.zero_grad()total_loss 0for j in range(len(x_train)):output linear2(x_train[j])loss criterion(output,y_train[j])total_loss total_loss loss.detach()loss.backward()opt.step()if i epoch-1:last_epoch_loss total_lossscheduler.step()cur_lr scheduler.get_lr()# plt.scatter(i, cur_lr, s2, cg)plt.scatter(i, total_loss,s2,cg)val 0for x in x_val:val val ((linear2(x) - x * x) / x * x)**2plt.title(ExponentialLR---val%f---last_epoch_loss%f%(val,last_epoch_loss))plt.xlabel(epoch)plt.ylabel(loss)plt.show()def train_without_lr_scheduler(epoch, initial_lr):linear3 Linear()opt torch.optim.Adam(linear3.parameters(), lrinitial_lr)last_epoch_loss 0for i in tqdm(range(epoch)):opt.zero_grad()total_loss 0for j in range(len(x_train)):output linear3(x_train[j])loss criterion(output, y_train[j])total_loss total_loss loss.detach()loss.backward()opt.step()if i epoch-1:last_epoch_loss total_lossplt.scatter(i, total_loss, s2, cb)val 0for x in x_val:val val ((linear3(x) - x * x) / x * x)**2plt.title(without_lr_scheduler---val%f---last_epoch_loss%f%(val,last_epoch_loss))plt.xlabel(epoch)plt.ylabel(loss)plt.show()if __name__ __main__ :epoch 2000initial_lr 0.0005gamma 0.99995T_max 200Cosine_Anneal_args [epoch,initial_lr*2,T_max]train_with_CosinAnneal(*Cosine_Anneal_args)# ExponentialLR_args [epoch, initial_lr, gamma]# train_with_ExponentialLR(*ExponentialLR_args)## without_scheduler_args [epoch, initial_lr]# train_without_lr_scheduler(*without_scheduler_args)
http://www.sczhlp.com/news/161795/

相关文章:

  • 网站开发人员的岗位职责微信公众平台账号注册
  • sql做网站wordpress分类详细信息
  • 陕西省建设工程协会网站贵州百度竞价网页设计
  • 网上书城网站开发的结论与不足个人 网站 备案
  • 网站正在建设中 给你带来金山网站安全检测
  • 洛阳兼职网站在线看mv视频网站入口软件下载
  • 律师网站建设 优帮云河南浪博网站开发
  • 网站建设电话销售工作总结行业网站系统
  • 高端品牌网站设计公司价格w78企业网站后台怎么做
  • 营销型网站建设公司哪家建设营做网站去哪里
  • ckplayer网站根目录网站建设钅金手指排名十五
  • 做网站开发的有哪些公司网站如何做更新
  • 上海网站制作建设多少钱做企业的网站都要准备什么手续
  • 青岛网站推广企业怎么做一个静态网页
  • 网站策划书的意义wordpress 邮箱激活
  • 普洱做网站的报价容桂顺德网站建设
  • 万网网站发布十大网站建设公司
  • 韶关网站建设墨子静态页面生成器
  • 公司企业网站建设步骤网站运营者
  • 公司网站制作步骤网页设计与制作招聘
  • 石家庄快速建站公司计算科学与学习网站建设与实施
  • 将GitHub项目克隆后在本地修改好后如何同时提交到GitHub和Gitee
  • jellyfine-code1008播放器无法实例化错误、群晖系统分区空间不足解决办法
  • 是什么网站建设怎么开平台
  • 网络购物网站备案辽宁省建设工程信息网32位浏览器
  • 销售产品单页面网站模板准备php和易语言混编做网站
  • 龙岗做网站哪里找黄冈论坛黄冈论坛
  • 栾城seo整站排名温州建设公司网站
  • 手机版网站开发公司直播小程序源码
  • 公司网站公司网站济宁建设局网站招聘会