Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 张量流模型损失的近似周期跳跃_Python_Tensorflow_Machine Learning_Keras_Conv Neural Network - Fatal编程技术网

Python 张量流模型损失的近似周期跳跃

Python 张量流模型损失的近似周期跳跃,python,tensorflow,machine-learning,keras,conv-neural-network,Python,Tensorflow,Machine Learning,Keras,Conv Neural Network,我正在使用tensorflow.keras训练CNN解决图像识别问题,使用Adam minimiser最小化自定义损失(一些代码位于问题的底部)。我正在试验我需要在训练集中使用多少数据,我想我应该看看我的每个模型是否已经正确收敛。然而,当绘制不同训练集分数的损失与训练次数的对比图时,我注意到损失函数中近似周期性的峰值,如下图所示。在这里,不同的行显示不同的训练集大小,作为我的总数据集的一部分 随着我减小训练集的大小(蓝色->橙色->绿色),这些尖峰的频率似乎降低了,尽管振幅似乎增加了。直觉上,我

我正在使用
tensorflow.keras
训练CNN解决图像识别问题,使用Adam minimiser最小化自定义损失(一些代码位于问题的底部)。我正在试验我需要在训练集中使用多少数据,我想我应该看看我的每个模型是否已经正确收敛。然而,当绘制不同训练集分数的损失与训练次数的对比图时,我注意到损失函数中近似周期性的峰值,如下图所示。在这里,不同的行显示不同的训练集大小,作为我的总数据集的一部分

随着我减小训练集的大小(蓝色->橙色->绿色),这些尖峰的频率似乎降低了,尽管振幅似乎增加了。直觉上,我会将这种行为与从局部极小值跳出来的极小值关联起来,但我对TensorFlow/CNN的经验不足,不知道这是否是解释这种行为的正确方法。同样,我不能完全理解训练集大小的变化

有人能帮我理解这种行为吗?我应该关注这些特征吗

从quasarnet.models导入quasarnet,自定义
从tensorflow.keras.optimizers导入Adam
...
模型=拟ARNET(
X[0,:,无].形状,
nlines=len(参数行)+len(参数行)
)
损失=[]
对于args.line中的i:
丢失。追加(自定义\u丢失)
对于args.lines\u bal中的i:
丢失。追加(自定义\u丢失)
亚当=亚当(衰减=0。)
compile(优化器=adam,loss=loss,metrics=[])
框,样本重量=io.目标(z,Y,bal,线=参数线,
行数=参数行数)
打印(“起始配合”)
历史=model.fit(X[:,:,无],框,
epochs=args.epochs,
批次大小=256,
样品重量=样品重量)

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

您可以通过在初始化最小值器()时设置
amsgrad=True
来避免这种情况。这防止了学习速率以这种方式增加,从而导致更好的收敛。下面的(有些基本)图显示了正常设置的损失与训练次数的关系,如原始问题(
norm loss
)中所示,与在最小化器(
amsgrad loss
)中设置
amsgrad=True
时的损失相比

显然,使用
amsgrad=True
时,损失函数的表现要好得多,并且随着训练时间的延长,应该会导致稳定的收敛。

添加用于训练模型的代码,可能您使用的是循环学习率之类的similar@HitLuca我现在添加了一些代码-学习率是Adam Optimizer的默认值(我相信是0.001)。默认情况下,这是否具有循环行为?不,默认情况下,学习速率不是循环的,它不在代码中。你增加了lr衰减,所以这可能会影响你的跳跃损失。就像我经常做的那样,如果在某个时候你的项目开始通过烧蚀进行奇怪的东西测试,我的意思是移除对结果影响最大的组件,并用一个虚拟组件替换它。看看它是否修复了它,您可以确定问题就在那里。在这种情况下,尝试用单层NN替换QasarNET。如果它仍然跳转,尝试使用一个虚拟数据集来预测一个常数继续-继续?在项目将要运行的某个时刻,尝试删除优化器参数等。从那以后,你只需要一个接一个地恢复你的更改,直到没有奇怪的事情发生。我打赌QasarNET或数据集在某些方面是怪异的way@HitLuca谢谢你的想法,非常感谢。上图中的模型将衰减设置为零(我现在编辑了代码来显示这一点),所以我认为这不是原因。我认为逐渐解构事物的想法可能是最好的方法,我很快就会尝试。