CNN上有什么快速收益收敛?

时间:2017-12-05 09:09:54

标签: batch-file tensorflow deep-learning caffe loss

我正在两个不同的DL库(Caffe e Tensorflow)中训练两个CNN(AlexNet e GoogLeNet)。这些网络由每个图书馆的开发团队(herehere

实施

我将原始Imagenet数据集缩减为1024个1类别的图像 - 但设置了1000个类别以在网络上进行分类。

因此,我训练了CNN,不同的处理单元(CPU / GPU)和批量大小,我观察到损失快速收敛到接近零(大部分时间在1个纪元之前完成),如此图(Alexnet on Tensorflow):

葡萄牙语中,'Épocas'是时代,'Perda'是亏损。键中的数字表示批量大小。

重量衰减和初始学习率与我下载的模型上使用的相同,我只更改了数据集和批量大小。

为什么我的网络会以这种方式融合,而不是像this way

1 个答案:

答案 0 :(得分:2)

损耗函数比平常噪声小,并且由于某些原因不会振荡。

主要原因是你只有一个类别,所以(为了简化一点)网络在每一步都很容易改进,只需在所有输入上提高该类别的得分。

看看下面的(漂亮的!)图片:如果你有几个课程,一个样本的好步骤通常是另一个样本的一个好的步骤(因为它们有不同的类别),这就是为什么损失增加的原因当地有时。对类别1的样本进行的网络更新对于cat 2的所有样本来说是一个不好的步骤,相反,但是两种类型的更新的总和是朝着正确的方向进行的(它们补偿了它们的不良部分,只有有用的部分。步骤仍然存在)。如果你有1个班级,那么你将直接快速地进入"总是预测1类和#34;而对于2个或更多类别,你将曲折并慢慢收敛到"总是正确预测"。

还有一些其他影响,例如您的数据集相对较小(因此它更容易学习),您不经常测试,也许您有一些平滑(是您的损失是在整个数据集上还是在批处理上计算出来的?通常它是批处理的,它参与通常的损失函数图。)

曲线之间的差异也是正常的,但仍然表明数据集中实际只有1个类。首先注意CPU和GPU具有相同的行为,因为它们完全相同,只是速度不同。当批量大小> 1时,网络中完成的更新是您单独使用样本完成的所有更新的平均值(再次简化一点)。因此,通常情况下,您可以获得更智能的更新(更有可能朝着#34;始终正确预测"),因此您需要更少的更新才能获得良好的效果。在这种更快的收敛与更大的批次为每次更新使用更多数据这一事实之间存在权衡,因此很难预先确定哪条曲线应该更快地收敛。人们普遍认为你应该使用尺寸> gt的小批量1(但也不是太大)。现在,当数据集中只有一个实际存在的类时,所有更新大致在同一方向上#34;始终预测1",因此小批量平均值基本相同,但消耗更多数据以获得大致相同更新。由于您仍然需要相同数量的这些更新,因此您将在相同步数后收敛,因此您将为相同的结果消耗更多数据。