如何使用tensorflow执行多标签分类?

时间:2017-02-13 15:40:58

标签: tensorflow deep-learning multilabel-classification

我是tensorflow的新手,想知道是否有任何有多个网络输出的多标签分类的教程或示例。

我问这个是因为我有一组图像,其中每个图像可以属于几个类,我的输出需要得到每个类的分数。

我也不知道张量流是否遵循图像和类的某些文件模式,所以如果有人有一些例子,它会有很大帮助。

谢谢。

3 个答案:

答案 0 :(得分:3)

您还可以尝试使用Label Powerset方法将问题从多标签转换为多类别。 Label Powerset转换将训练集中证明的每个标签组合视为不同的类,并构造多类分类器的一个实例 - 并在预测后将指定的类转换回多标签的情况。它在scikit-multilearn和scikit兼容性包装器中通过tensorflow Estimator提供,或通过input_fn或使用skflow提供。然后将其插入LabelPowerset的实例中。

代码可以如下:

from skmultilearn.problem_transform import LabelPowerset
import tensorflow.contrib.learn as skflow

# assume data is loaded using
# and is available in X_train/X_test, y_train/y_test

# initialize LabelPowerset multi-label classifier
# with tensor flow DNN base classifier
classifier = LabelPowerset(skflow.TensorFlowDNNClassifier(OPTIONS))

# train
classifier.fit(X_train, y_train)

# predict
predictions = classifier.predict(X_test)

答案 1 :(得分:2)

最天真(和合理)的方法是训练分类网络,并移除softmax层并用sigmoids矢量替换它。这样,您可以将多个单元激活为1。

您可以查看分类网络的on TF-slim示例。在路径datasets下,您将找到有关如何准备TFExample"文件模式的示例"用于图像和类

答案 2 :(得分:0)

大多数解决方案都是指sigmoid丢失,而sigmoid在我的情况下通过张量流中的tf.nn.sigmoid_cross_entropy_with_logits(labels,logits)很好地解决了多标签分类。

然而,当我处理类不平衡问题时,负面情况远远超过正面情况,我发现我编辑的softsign损失比sigmoid好得多。调整系数gamma被添加到标签以将负级别的梯度降低3/4。

def unbalance_softsign_loss(labels, logits):
    gamma = 1.25 *labels - 0.25 
    res = 1 - tf.log1p( gamma*logits/(1+ tf.abs(logits)) )

    return res 

其中标签是多热编码向量,如[0,1,0,1,0],logits~(-inf,inf)