打破局部最小值的 pytorch CNN 分类器训练过程

问题描述 投票:0回答:0

我正在 PyTorch 中训练一个图像分类器,它应该将图像分类为 32 个具有相似大小的不同组。输出是一个单热向量,其中第 1 个条目代表所选组,其他条目为 0。这是我的损失函数:

favor_one_or_zero = torch.mean(-1 * torch.pow((chooser * 2) - 1, 4) + 1)
should_be_one = torch.square(1 - torch.sum(chooser))
cat = torch.cat(previous, dim=0)
sm = torch.sum(cat, dim=0)
low_variance, _ = torch.var_mean(sm)
loss = favor_one_or_zero + should_be_one + low_variance

favor_on_or_zero
项对任何非 1 或 0 的项进行惩罚。如果这些项加起来不等于 1,则
should_be_one
项进行惩罚。如果 1s 在先前迭代中的分布不均匀,则
low_variance
项会受到惩罚(
previous
包含过去 64 次迭代的预测,并且由于批量大小为 16,它将包含 1024 个预测)。

我遇到的问题是模型总是以1的损失到达,而1是因为它学会了输出0的向量。

favor_one_or_zero
为 0,
low_variance
为 0,
should_be_one
为 1。如果我在损失函数中增加
should_be_one
的权重(例如将其乘以 10 倍),它仍然会遇到这个问题,但它收敛于该因子(即 10)而不是 1.

数据集很大(1000万张图片),收敛总是发生在24万张图片左右。

在极少数情况下,它会突破这个局部最小值并探索解决方案空间的更好部分。但是,这种情况非常罕见,我不能指望它。所以,我想知道是否有更好的损失函数可以使用或我可以做其他事情来改进学习?谢谢!

python deep-learning pytorch
© www.soinside.com 2019 - 2024. All rights reserved.