我是tensorflow的新手,想知道是否有任何有多个网络输出的多标签分类的教程或示例。
我问这个是因为我有一组图像,其中每个图像可以属于几个类,我的输出需要得到每个类的分数。
我也不知道张量流是否遵循图像和类的某些文件模式,所以如果有人有一些例子,它会有很大帮助。
谢谢。
答案 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)