【发布时间】:2017-11-01 07:17:27
【问题描述】:
所以我在我创建的多标签数据集(大约 20000 个样本)上训练了一个深度神经网络。我将 softmax 切换为 sigmoid 并尝试最小化(使用 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]
起初,我以为我只需要为每个类找到一个阈值。
但我注意到,例如,在我的 20000 个样本中,第一类出现大约 10800 个,因此比率为 0.54,它是我每次预测的值。所以我认为我需要找到一种方法来解决 tuis“不平衡数据集”问题。
我考虑减少我的数据集(欠采样)以使每个类的出现次数大致相同,但只有 26 个样本对应于我的一个类...这会让我丢失很多样本...
我读到过关于过采样或惩罚更多罕见但并没有真正理解其工作原理的类。
有人可以分享一些关于这些方法的解释吗?
在实践中,在 Tensorflow 上,是否有函数可以帮助做到这一点?
还有其他建议吗?
谢谢你:)
PS:Neural Network for Imbalanced Multi-Class Multi-Label Classification这个帖子提出了同样的问题,但没有答案!
【问题讨论】:
-
为什么不使用您拥有的所有样本并使用不平衡数据来使用异常检测算法?
-
如果我理解得很好,你的建议是在我的 (9) 个类上训练我的网络(在我的数据集中“很好”表示),然后在我的“表现不佳”的类上训练另一个网络(比如在这个类上做二元分类)?
-
没有。我建议使用算法来检测非常小的少数,你的绝大多数数据的差异。它们通常被称为异常检测算法,因为通常当您尝试检测异常时,您有很多“好”样本但很少有“异常”样本。然而,这些算法通常用于在两个类别之间进行分类。所以也许这对你不好,但它可能是更复杂的分类过程的一部分
-
好的,谢谢你的想法(和你的额外解释)!
标签: tensorflow deep-learning multilabel-classification