【问题标题】:Multi Label Classification : How to learn threshold values?多标签分类:如何学习阈值?
【发布时间】:2017-05-31 17:15:29
【问题描述】:

我有一个深度 CNN,可以很好地用于多类分类。我想“升级”挑战并在多标签分类问题上对其进行训练。

为此,我用 sigmoid 替换了我的 softmax,并尝试训练我的网络以最小化:

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 Im1 : [ 0.52609032  0.07885984  0.45780018  0.04995904  0.32828355  0.07349177

0.35400775 0.36479294 0.30002621 0.84438241]

Prediction for Im1 : [ 0.58714485  0.03258472  0.3349618   0.03199361  0.54665488  0.02271551

0.43719986 0.54638696 0.20344526 0.88144571]

所以我想我尝试让我的网络学习每个类的阈值,以确定样本是否属于该类。

所以我将它添加到我的代码中:

initial = tf.truncated_normal([numberOfClasses], stddev=0.1)
W_thresh = tf.Variable(initial)

y_predict_thresh = int(y_predict > W_thresh)

但我有一个错误:

TypeError: int() argument must be a string or a number, not 'Tensor'.

任何人有任何想法可以帮助我前进(如何避免这个错误?,我的数据集真的不平衡的事实是否会导致这种“恒定”预测?关于多标签分类的其他建议?,...) ?

谢谢

编辑:我刚刚意识到对反向传播进行阈值处理可能不是很酷:/

【问题讨论】:

    标签: python tensorflow deep-learning


    【解决方案1】:

    不知道你是否还需要它,但是你可以使用tensorflow转换函数tf.to_int32, tf.to_int64。在评估之前,您的表达式是 python 的对象,因此它不能简单地将其转换为 int()

    这可以满足您的需要:

    with tf.Session() as sess:
        check = sess.run([tf.to_int64(W1 > W2)])
    

    【讨论】:

    • 谢谢你的回答。我实际上意识到我的问题的解决方案不是阈值,而是解决我有一个不平衡的数据集的事实。但你的回答对我的“门槛”问题很好。再次感谢你:)
    猜你喜欢
    • 2019-09-24
    • 2017-09-01
    • 2020-03-09
    • 2015-08-26
    • 2018-11-13
    • 2017-08-18
    • 2016-12-06
    • 2018-07-20
    • 2017-08-30
    相关资源
    最近更新 更多