2016-11-09 224 views
0

我正在尝试通过微调VGG16网络(预先在ImageNet上进行训练)在一个相当小的数据集(11000张图像,200个类别)上进行图像分类来进行转移学习。实际上我只是在修改VGG16网络的最后3个FC层。我在3个FC层中的两个上添加了丢失概率为0.5的丢失。损失与验证准确度之间的关系是什么?

所以,当我在这个网络上进行训练时,除了用原作者给出的VGG_MEAN值减去图像中的每个通道外,我没有做任何奇特的预处理。

因此,事情是培训似乎进行得很好,损失大幅下降并稳定在一定的价值附近,并且我正在监控网络对验证集(20%的数据)的预测准确性,具体数目为批次已经过培训。 我注意到平均验证的准确性没有显示出任何改进的趋势 - 并且平均验证准确性在整个培训过程中波动,当时我实际上希望它逐渐增加。在推断时,我确保不要拖动验证数据。

我试图降低学习速度,微调较少的层次,但无济于事。如果损失是代表模型是实际学习的代理人,那么为什么验证准确性的差异?

(1)这是因为我只有很少的训练数据开始? (2)最初的Imagenet数据集有1000个类,但是我的分类任务更加细化,并且具有原始数量的ImageNet类的1/5(考虑对鸟的种类或不同的灵长类进行分类)。这可能是一个问题吗? 我想从一些有这方面问题的工作经验的人员那里得到一些意见和反馈。

+0

如果我理解的很好,你的损失函数正在减少,但你的验证损失不再下降,这表明你正在过度适合你的训练集。如果是这种情况,请尝试惩罚您的参数以避免过度拟合。 – Feras

+0

向FC7和FC6层添加0.5的丢失不会改善任何事情。事实上,验证的准确性很差,我只是难倒了。 – user1050648

回答

0

事实证明,我面临着“细粒度”分类问题。鸟类的图像看起来非常相似,这给网络学习带来了问题。

+0

嗨,所以,在您看来,调整少量类并不是一个好主意。我也正在调整VGG16 50种布料。而且我看到损失不会下降,它只是在5000-4000平均7000-4000之间波动。我还没有运行任何验证。 – Rusty

+0

@Rusty,不完全......我的意思是在我的情况下,分类问题太细腻 - 来自不同类的图像看起来彼此非常相似。例如,区分树木和汽车比较难以区分两种树木,例如.. – user1050648

+0

没问题。那么损失是否具有任何意义,使得它总是小于某个值等,或者我应该只依赖验证的准确性? – Rusty

0

我知道(训练)损失的价值与训练准确性有很强的关系。如果训练时损失减少,训练的准确性会提高。但列车损失与验证准确性之间没有很强的关系。如果火车损失正在减少,验证准确性在增加,那么这就是我们所期望的。但是,如果列车损失正在减少,而验证准确度降至饱和,则可能会发生过度拟合。在这种情况下,应该停止训练并调整一些参数,例如正常化和辍学率的体重衰减。

所以验证的准确性不能直接替换为训练损失。如果可能的话,应该使用验证的准确性,而不是仅仅看到学习损失的曲线。以上是我的理解。

相关问题