Python 具有';楼梯=真';甚至在培训生效之前就改变了培训行为

Python 具有';楼梯=真';甚至在培训生效之前就改变了培训行为,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,当向我的优化器添加学习率计划时,它甚至在应该生效之前就改变了培训行为。我在计划中使用了以下定义: lr_schedule=tf.keras.optimizers.schedules.ExponentialDecay( 1e-3,衰变阶梯=25,衰变率=0.95,楼梯=True) 由于我使用的是stairway=True,所以前25个时期与使用相同值的静态学习率应该没有区别。因此,以下两个优化器应在前25个阶段产生相同的训练结果: optimizer=tf.keras.optimizers.Ad

当向我的优化器添加学习率计划时,它甚至在应该生效之前就改变了培训行为。我在计划中使用了以下定义:

lr_schedule=tf.keras.optimizers.schedules.ExponentialDecay(
1e-3,衰变阶梯=25,衰变率=0.95,楼梯=True)
由于我使用的是
stairway=True
,所以前25个时期与使用相同值的静态学习率应该没有区别。因此,以下两个优化器应在前25个阶段产生相同的训练结果:

optimizer=tf.keras.optimizers.Adam(学习率=1e-3)
optimizer=tf.keras.optimizers.Adam(学习率=lr计划)
然而,我观察到,之前的行为已经不同了:

这是我使用的测试代码:

导入matplotlib.pyplot作为plt
将numpy作为np导入
导入tensorflow作为tf
从tensorflow.keras.layers导入稠密、脱落
np.random.seed(0)
x_数据=2*np.random.random(大小=(1000,1))
y_数据=np.随机.正常(loc=x_数据**2,标度=0.05)
lr_schedule=tf.keras.optimizers.schedules.ExponentialDecay(
1e-3,衰变阶梯=25,衰变率=0.95,楼梯=True)
历史=[]
学习率=[1e-3,学习进度表]
对于学习中的lr费用:
tf.random.set_种子(0)
模型=tf.keras.models.Sequential([
密集型(10,激活=tanh',输入尺寸=1),衰减型(0.2),
致密(10,活化度为tanh'),脱落(0.2),
密度(1)
])
优化器=tf.keras.optimizers.Adam(学习率=lr)
compile(优化器=优化器,loss='mse')
历史=model.fit(x_数据,y_数据,历代=50)
history.append(history.history['loss']))
图,ax=plt.子批次()
ax.set(xlabel='Epoch',ylabel='Loss')
ax.plot(历史[0],label='Static learning rate')
ax.plot(历史[1],label='Learning rate schedule')
ax.图例()
plt.show()
我正在使用Python 3.7.9和Tensorflow的以下安装:

$conda list| grep tensorflow
tensorflow 2.1.0 mkl_py37h80a91df_0
tensorflow底座2.1.0 mkl_py37h6d63fb7_0
张量流量估计器2.1.0 pyhd54b08b_0

当使用
指数衰减时,基本上你要做的是使学习速度衰减,如:

def衰减学习速率(步骤):
返回初始学习率*衰减率^(步骤/衰减步骤)
设置
stairway=True
时,发生的情况是
step/decation\u steps
是一个整数除法,并且速率遵循阶梯函数。 现在,让我们看一下源代码:

#…步进功能的设置。。。
全局_step_recomp=math_ops.cast(step,dtype)#step是当前的步长计数
p=全局步骤重新映射/衰减步骤
如果是自动楼梯:
p=数学运算层(p)
返回数学运算乘法(初始学习速率,数学运算功率(衰减速率,p),name=name)
我们可以看到,我们有一个变量
p
,它在每多个
衰变步骤中更新,所以在步骤25、50、75等等。。。基本上,每25个步骤的学习率是恒定的,而不是每个时代的学习率-这就是为什么它在前25个时代之前更新。有关差异的详细说明,请访问