我正在两个不同的DL库(Caffe e Tensorflow)中训练两个CNN(AlexNet e GoogLeNet)。网络由每个图书馆的开发团队实施(此处和此处)
我减少了原来……
损耗函数比平时噪声小,并且由于某些原因不会振荡。
主要原因是因为你只有一个类别,所以(为了简化一点)网络在每一步都很容易改进,只需通过改善所有输入的类别得分。
看看下面的(漂亮!)图片:如果你有几个课程,一个样本的好步骤通常是另一个样本的一个好的步骤(因为它们有不同的类别),这就是为什么损失在本地有时会上升。对类别1的样本进行的网络更新对于cat 2的所有样本来说是一个不好的步骤,相反,但是两种类型的更新的总和是朝着正确的方向进行的(它们补偿了它们的不良部分,只有有用的部分。步骤仍然存在)。如果你有1个课程,你会直接快速地“始终预测第1类”,而对于2个或更多类别,你将曲折并慢慢收敛到“总是正确预测”。
还有一些其他的影响,例如你的数据集相对较小(因此它更容易学习),你不经常测试,也许你有一些平滑(你的损失是在整个数据集上或在批处理?通常是批处理,参与通常的损失函数图表)。
曲线之间的差异也是正常的,但仍然表明数据集中实际只有1个类。首先注意CPU和GPU具有相同的行为,因为它们完全相同,只是速度不同。当批量大小> 1时,网络中完成的更新是您单独使用样本完成的所有更新的平均值(再次简化一点)。所以通常你会得到更聪明的更新(更有可能朝“总是正确预测”的方向发展),所以你需要更少的更新来达到良好的表现。在这种更快的收敛与更大批量为每次更新使用更多数据这一事实之间存在权衡,因此很难预先确定哪条曲线应该更快收敛。人们普遍认为你应该使用尺寸> gt的小批量1(但也不是太大)。现在,当数据集中只有一个实际存在的类时,所有更新大致在“始终预测1”的相同方向,因此小批量平均值基本相同,但消耗更多数据以获得大致相同的更新。由于您仍然需要相同数量的这些更新,因此您将在相同步数后收敛,因此您将为相同的结果消耗更多数据。