所以我在我创建的多标签数据集上训练了一个深度神经网络(大约20000个样本) . 我为sigmoid切换softmax并尝试最小化(使用Adam优化器):
tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y_, logits=y_pred)
我最终得到了这个预测之王(相当“恒定”):
Prediction for Im1 : [ 0.59275776 0.08751075 0.37567005 0.1636796 0.42361438 0.08701646 0.38991812 0.54468459 0.34593087 0.82790571]
Prediction for Im2 : [ 0.52609032 0.07885984 0.45780018 0.04995904 0.32828355 0.07349177 0.35400775 0.36479294 0.30002621 0.84438241]
Prediction for Im3 : [ 0.58714485 0.03258472 0.3349618 0.03199361 0.54665488 0.02271551 0.43719986 0.54638696 0.20344526 0.88144571]
起初,我以为我只是需要找到每个 class 的门槛值 .
但是我注意到,例如,在我的20000个样本中,第一类出现了大约10800,所以0.54比率,它是我每次预测的值 . 所以我认为我需要找到一种方法来解决tuis“不 balancer 数据集”问题 .
我想减少我的数据集(Undersampling)以使每个类的出现次数相同但只有26个样本对应于我的一个类......这会让我失去很多样本......
我读到了关于过度采样或者更多地惩罚那些罕见的类但却没有真正了解它是如何工作的类 .
有人可以分享一些关于这些方法的解释吗?
在实践中,在Tensorflow上,是否有帮助这样做的功能?
还有其他建议吗?
谢谢 :)
PS:Neural Network for Imbalanced Multi-Class Multi-Label Classification这篇文章提出了同样的问题,但没有答案!
2 回答
你的问题不是阶级不 balancer ,而只是缺乏数据 . 对于几乎任何真正的机器学习任务,26个样本被认为是非常小的数据集 . 通过确保每个小批量将至少有一个来自每个类别的样本(这导致某些样本将比另一个样本更频繁地使用,但是谁在乎)的情况,可以容易地处理类不 balancer .
然而,在仅存在26个样本的情况下,这种方法(以及任何其他方法)将很快导致过度拟合 . 这个问题可以通过某种形式的数据扩充来部分解决,但仍然有太少的样本来构建合理的东西 .
所以,我的建议是收集更多数据 .
那么,在一个 class 中拥有10000个样本而在罕见级别中只有26个样本确实是一个问题 .
然而,对我来说,你所经历的似乎更像是“输出甚至看不到输入”,因此网络只是学习你的输出分布 .
为了调试这个,我会创建一个简化集(仅用于此调试目的),每个类别有26个样本,然后尝试重度过度拟合 . 如果你得到正确的预测我的想法是错误的 . 但是,如果网络甚至无法检测到那些欠采样的过度采样样本,那么它确实是一个架构/实现问题,而不是由于示意图的分布(然后你需要修复它 . 但它不会像你当前的结果那么糟糕) .