引言:在网络训练过程中,学习率扮演着重要的角色,类似于爬山过程中你所迈的步长,根据不同的地理环境,相应改变自己的步长跨度,例如挡在比较平缓的山地,你可能迈步相对跨度较大,而在崎岖的山路上,下坡路迈步可能很小。在训练网络的过程中,网络同样需要寻求找到全局最优解,如果步长太大可能在错过了最优解、或者在一个小山谷中来回折腾,当步长太小的话,浪费训练时间(类似于在平原中迈小步)。说了这么多就是希望大家能够更好地理解学习率,以及发挥的作用。(终于说完了,替你捏了把汗)
首先看一下在网络中的学习率调整源码,然后再谈:
代码:
lf = lambda x: ((1 + math.cos(x * math.pi / epochs)) / 2) * (1 - hyp['lrf']) + hyp['lrf'] # cosine scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf)是不是感觉之前被我吓到了,一看代码,这么少,不会吧!!! 在此之前小琼一直搞不懂,那个、这个啥玩意?直到做了个梦,突然有了灵感。(算了不多说了)
1.正题开始:
首先先看一下学习率可视化的图像吧:
学习率参数调整图
分析:
(和这篇文章分析的结果一样)学习率的值不断地在减少,这是因为在最开始训练网络时,步长较大,相当于还在山坡的半山腰上,随着逐步走向山谷,步长逐渐减少,避免错过山谷的最低端(认为是梯度为0的地方,是网络的全局或者局部最优解),因此在训练网络结束时,步长一般很小,或者等于初始化时你设定的值。(如果不太懂请移步这里)。
代码实现:
import math import numpy as np import matplotlib.pyplot as plt lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3) lrf: 0.2 # final oneCycleLR learning rate (lr0 * lrf) epochs=100 lf = lambda x: ((1 + math.cos(x * math.pi / epochs)) / 2) * (1 - 0.2) + 0.2 # cosine list_lf=[] for i in range(epochs): value=lf(i) list_lf.append(value) x=np.linspace(0,102,100) plt.title('yolov5-s leaning rate line show ') plt.figure(1,figsize=(8,6)) plt.plot(x,list_lf,color='blue',lw=2,linestyle='--') plt.show()解析:
1》代码1:
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3) lrf: 0.2 # final oneCycleLR learning rate (lr0 * lrf)关于这个是源码中设置的超参数,(好像是硬性规定,可能是源码作者在多次不同尝试下得到的最好的调整学习率超参数)
2》在上述代码中,小琼设置的网络迭代次数为100次,这个参数你可以随意设置,一般在100-300之间,如果数据量较大,数据量较小时一般在1000-5000次左右,小琼总结就是一般基于迁移学习的网络训练最低训练时间是10个小时,你可以根据自己训练一次数据的时间,计算。
2.结束:
GAME OVER
相遇总是美好的开始,感谢小伙伴梦能够看完、坚持到最后 并且能够理解小琼的思路,以及想要表达的话语。
如果感觉不错的话,点个小赞呗!!!
欢迎和小伙伴梦一起探讨学习,共同进步,努力加油!!!
爱你们每一天!!!
附上女神图:



