多标签分类要用什么损失函数？
最近正好做了个关于这方面的比赛，看了些这方面的论文： 就是将最后分类层的每个输出节点使用sigmoid激活函数激活，然后对每个输出节点和对应的标签计算交叉熵损失函数，具体图示如下所示： 左上角就是对应的输出矩阵（batch_size x num_classes）, 然后经过sigmoid激活后再与绿色标签计算交叉熵损失，计算过程如右方所示。 但是其实可以拓展思路，标签与预测结果可以看作两张图片，然后当作图像分割问题来优化，这样就可以使用dice，lovase损失来优化。 具体代码如下： 输出结果一致，因此训练时使用BCEWithLogitsLoss()和MultiLabelSoftMarginLoss()都可。 2.使用序列模型解决依赖性（CNN_RNN）： 一般而言，多标签存在依赖性，比如一张图片中“大海”和“轮船”同时出现的机率很高，但是上述的损失函数却没有考虑到这一问题，为此有学者提出使用RNN来解决co-occurence问题： 基本思想就是通过CNN获取图像的特征，然后和获取的label的embedding拼接一起然后再预测，接下来的标签预测，根据上一个输出单元的隐藏状态，图像特征，label embedding继续预测。这种方法一定程度上解决了标签依赖关系。 2.使用图网络解决依赖性（ML_GCN）： 还是先上图，照图解释： 这个相对于普通的CNN网络，多了个GCN分支，构成了一个端到端的网络。GCN主要的作用是通过标签之间的拓扑结构，为不同标签学习不同的分类器（embedding-to-classifiers）,然后CNN输出的特征与这些分类器相乘，最后的loss函数就是普通的BCE loss了。这是CVPR2019的文章，实验结果看起来说是SOTA模型。  参考文献 1.Wang, J., et al. (2016). Cnn-rnn: A unified framework for multi-label image classification. Proceedings of the IEEE conference on computer vision and pattern recognition. 2.Chen, Z.-M., et al. (2019). Multi-Label Image Recognition with Graph Convolutional Networks. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition.