【发布时间】:2017-07-01 16:00:41
【问题描述】:
我是 tensorflow 新手,想知道是否有任何关于具有多个网络输出的多标签分类的教程或示例。
我问这个是因为我有一个图像集合,其中每个图像可以属于几个类,我的输出需要每个类的分数。
我也不知道张量流是否遵循图像和类的某些文件模式,所以如果有人有一些例子,它会很方便。
谢谢。
【问题讨论】:
标签: tensorflow deep-learning multilabel-classification
我是 tensorflow 新手,想知道是否有任何关于具有多个网络输出的多标签分类的教程或示例。
我问这个是因为我有一个图像集合,其中每个图像可以属于几个类,我的输出需要每个类的分数。
我也不知道张量流是否遵循图像和类的某些文件模式,所以如果有人有一些例子,它会很方便。
谢谢。
【问题讨论】:
标签: tensorflow deep-learning multilabel-classification
最简单(也是合理)的方法是训练一个分类网络,然后移除 softmax 层并用 sigmoid 向量替换它。这样您就可以拥有多个激活值为 1 的单位。
您可以查看on TF-slim 分类网络的示例。在datasets 路径下,您将找到有关如何为图像和类准备TFExample“文件模式”的示例
【讨论】:
您还可以尝试使用 Label Powerset 方法将问题从多标签分类转换为多类分类。标签 Powerset 转换将训练集中证明的每个标签组合视为不同的类,并构造一个多类分类器的实例 - 并在预测之后将分配的类转换回多标签案例。它在 tensorflow Estimator 上的 scikit-multilearn 和 scikit-compatibility 包装器中提供,或者通过 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)
【讨论】:
大多数解决方案是指 sigmoid 损失,而 sigmoid 在我的情况下确实可以通过 tensorflow 中的tf.nn.sigmoid_cross_entropy_with_logits(labels,logits) 很好地解决多标签分类问题。
但是,当我处理类不平衡问题时,负面案例远多于正面案例,我发现我编辑的软符号损失比 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)
【讨论】: