gpt4 book ai didi

python - TensorFlow 模型损失的近似周期性跳跃

转载 作者:行者123 更新时间:2023-12-02 02:51:25 24 4
gpt4 key购买 nike

我正在使用 tensorflow.keras 在图像识别问题中训练 CNN,使用 Adam 最小化器来最小化自定义损失(一些代码位于问题的底部)。我正在试验我的训练集中需要使用多少数据,并认为我应该研究我的每个模型是否已正确收敛。然而,当绘制损失与不同训练集分数的训练时期数的关系时,我注意到损失函数中大约存在周期性尖峰,如下图所示。在这里,不同的线显示了不同的训练集大小,作为我的总数据集的一部分。

当我减小训练集的大小(蓝色 -> 橙色 -> 绿色)时,这些尖峰的频率似乎会减少,但幅度似乎会增加。直觉上,我会将这种行为与跳出局部最小值的最小化器联系起来,但我对 TensorFlow/CNN 的经验还不够,不知道这是否是解释这种行为的正确方法。同样,我不太理解训练集大小的变化。

任何人都可以帮助我理解这种行为吗?我应该关注这些功能吗?

enter image description here

from quasarnet.models import QuasarNET, custom_loss
from tensorflow.keras.optimizers import Adam

...

model = QuasarNET(
X[0,:,None].shape,
nlines=len(args.lines)+len(args.lines_bal)
)

loss = []
for i in args.lines:
loss.append(custom_loss)

for i in args.lines_bal:
loss.append(custom_loss)

adam = Adam(decay=0.)
model.compile(optimizer=adam, loss=loss, metrics=[])

box, sample_weight = io.objective(z,Y,bal,lines=args.lines,
lines_bal=args.lines_bal)

print( "starting fit")
history = model.fit(X[:,:,None], box,
epochs = args.epochs,
batch_size = 256,
sample_weight = sample_weight)

最佳答案

经过同事的一番讨论,我相信我们已经解决了这个问题。默认情况下,Adam 最小化器使用与其最近历史记录中的梯度方差成反比的自适应学习率。当损失开始趋于平缓时,梯度的方差减小,因此最小化器会增加学习率。这种情况可能会发生得非常剧烈,导致最小化器“跳”到参数空间中更高的损失点。

您可以通过在初始化最小化器 ( http://www.satyenkale.com/papers/amsgrad.pdf ) 时设置 amsgrad=True 来避免这种情况。这可以防止学习率以这种方式增加,从而实现更好的收敛。下面的(有点基本的)图显示了正常设置下的损失与训练周期数的关系,如原始问题(norm loss)与设置 amsgrad=True 时的损失相比> 在最小化器中(amsgrad loss)。

显然,使用 amsgrad=True 时损失函数的表现要好得多,并且经过更多轮次的训练,应该会产生稳定的收敛。 enter image description here

关于python - TensorFlow 模型损失的近似周期性跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61909828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com