Jam*_*mes 2 python machine-learning conv-neural-network keras tensorflow
我用于tensorflow.keras在图像识别问题中训练 CNN,使用 Adam 最小化器来最小化自定义损失(一些代码位于问题的底部)。我正在试验我的训练集中需要使用多少数据,并认为我应该研究我的每个模型是否已正确收敛。然而,当绘制损失与不同训练集分数的训练时期数的关系时,我注意到损失函数中大约存在周期性尖峰,如下图所示。在这里,不同的线显示了不同的训练集大小作为我的总数据集的一部分。
当我减小训练集的大小(蓝色 -> 橙色 -> 绿色)时,这些尖峰的频率似乎减少,但幅度似乎增加。直觉上,我会将这种行为与跳出局部最小值的最小化器联系起来,但我对 TensorFlow/CNN 的经验还不够,不知道这是否是解释这种行为的正确方法。同样,我不太理解训练集大小的变化。
谁能帮助我理解这种行为?我应该关注这些功能吗?
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)
Run Code Online (Sandbox Code Playgroud)
经过同事的一番讨论,我相信我们已经解决了这个问题。默认情况下,Adam 最小化器使用与其最近历史记录中的梯度方差成反比的自适应学习率。当损失开始趋于平缓时,梯度的方差减小,因此最小化器会增加学习率。这种情况可能会发生得非常剧烈,导致最小化器“跳”到参数空间中更高的损失点。
您可以通过amsgrad=True在初始化最小化器时进行设置来避免这种情况(http://www.satyenkale.com/papers/amsgrad.pdf)。这可以防止学习率以这种方式增加,从而实现更好的收敛。下面的(有点基本的)图显示了正常设置的损失与训练时期数的关系,如原始问题 ( ) 中与最小化器 ( ) 中norm loss设置时的损失相比。amsgrad=Trueamsgrad loss
显然,损失函数在 的情况下表现得更好amsgrad=True,并且随着训练次数的增多,应该会产生稳定的收敛。

| 归档时间: |
|
| 查看次数: |
1060 次 |
| 最近记录: |