多标签分类指同一个实例可以有多个标签,或者被分为多个类。和多分类的区别是,多分类中每个实例只有一个标签。
多标签分类的方法分为两种,一种是将问题转化为传统的分类问题,二是调整现有的算法来适应多标签的分类。
转化方法
(1)对每个实例确定或随机的分配一个标签,或只保留只有一个标签的训练样本,然后用传统的多分类方法去训练。但是这种方法会导致训练样本损失。
(2)将训练样本按每个标签构造一个训练集,每个样本属于或不属于这个标签,对每个标签单独训练一个分类器,然后将多个分类器的结果合成。
(3)将每个多标签单独看做一个新标签,在一个更多的标签集上做多分类。
(4)对每个有多个标签的样本,复制该样本,每个样本具有不同的标签,加入训练集后使用覆盖分类法。
之后再通过调整boost kNN SVM等实现多分类
如何用Pytorch进行多标签分类?
调用函数:
1. Pytorch使用torch.nn.BCEloss
2. Tensorflow使用tf.losses.sigmoid_cross_entropy
3. Caffe使用SigmoidCrossEntropyLoss
在output和target之间构建binary cross entropy,其中i为每一个类。
以pytorch为例:Caffe,TensorFlow版本类比,输入均为相同形式的向量
m = nn.Sigmoid()
loss = nn.BCELoss()
input = autograd.Variable(torch.randn(3), requires_grad=True)
target = autograd.Variable(torch.FloatTensor(3).random_(2))
output = loss(m(input), target)
output.backward()
注意target的形式,要写成01编码形式,eg:如果同时为第一类和第三类则,[1, 0, 1]
主要是结合sigmoid来使用,经过classifier分类过后的输出为(batch_size,num_class)为每个数据的标签, 标签不是one-hot的主要体现在sigmoid输出之后,仍然为(batch_size,num_class),对于一个实例,它的各个label的分数加起来不一定等于1,bceloss在每个类维度上求cross entropy loss然后加和求平均得到,这里就体现了多标签的思想。