多标签图像分类

时间:2019-11-12 06:30:51

标签: python-3.x neural-network deep-learning conv-neural-network multilabel-classification

我尝试过自己,但无法达到最终目的,这就是为什么在此处发布内容,请指导我。

  • 我正在从事多标签图像分类,并且略有 不同的情况。其实我很困惑,如何将标签及其属性与ID等映射,以便我们可以用于培训和测试。
  • 这是我正在使用的代码

    if (mBlogWrapper != null && mBlogWrapper.isNotEmpty()) {
        character = mBlogWrapper as MutableList<ABCCharacters>
        mutableLiveData.value = character
    }
    
  

我已附加了一个图像文件Explaination,可以清楚地看到我的问题。

因为如果我们遵循这些

  1. https://machinelearningmastery.com/how-to-develop-a-convolutional-neural-network-to-classify-satellite-photos-of-the-amazon-rainforest/
  2. https://towardsdatascience.com/journey-to-the-center-of-multi-label-classification-384c40229bff
  3. https://www.analyticsvidhya.com/blog/2019/04/predicting-movie-genres-nlp-multi-label-classification/

等 它们在每个图像上都有多个标签,但就我而言,我有多个标签及其属性。

2 个答案:

答案 0 :(得分:0)

如果您的目标是预测' L ',' M '和' H ',则您使用的是不正确的损失函数。您应该使用binary_crossentropy。在这种情况下,目标的形状将为 batch ×3。

  • categorical_crossentropy假定输出为分类分布:一个值的矢量,这些值总和为1。换句话说,您有多种可能,但只有其中一种才是正确的。

  • binary_crossentropy假设输出向量中的每个数字都是(有条件的)独立的二进制分布,因此每个数字都在0到1之间,但它们不一定要加一,因为它可以碰巧他们都正确。

如果您的目标是为每个label1,...,label6预测值,则应为每个标签建模分类分布。您有六个标签,每个标签都有3个值,因此需要18个数字(登录)。在这种情况下,目标的形状将为 batch ×6×3。

model.add(Dense(18, activation='none'))

因为您不希望单个分布超过18个值,而是超过6×3个值,所以您需要首先重塑logit:

model.add(Reshape((6, 3))
model.add(Softmax())

答案 1 :(得分:0)

基于以上讨论。这是上述问题的解决方案。 正如我提到的,我们总共有5个标签,每个标签还有另外三个标签,例如(L,M,H)我们可以通过这种方式执行编码

# create a one hot encoding for one list of tags
def custom_encode(tags, mapping):
    # create empty vector
    encoding=[]
    for tag in tags:
        if tag == 'L':
            encoding.append([1,0,0])
        elif tag == 'M':
            encoding.append([0,1,0])
        else:
            encoding.append([0,0,1])
    return encoding

所以编码的y矢量看起来像

**Labels     Tags             Encoded Tags** 
Label1 ----> [L,L,L,M,H] ---> [ [1,0,0], [1,0,0], [1,0,0], [0,1,0], [0,0,1] ]
Label2 ----> [L,H,L,M,H] ---> [ [1,0,0], [0,0,1], [1,0,0], [0,1,0], [0,0,1] ]
Label3 ----> [L,M,L,M,H] ---> [ [1,0,0], [0,1,0], [1,0,0], [0,1,0], [0,0,1] ]
Label4 ----> [M,M,L,M,H] ---> [ [0,1,0], [0,1,0], [1,0,0], [0,1,0], [0,0,1] ]
Label5 ----> [M,L,L,M,H] ---> [ [0,1,0], [1,0,0], [1,0,0], [0,1,0], [0,0,1] ]


最后一层就像

 model.add(Dense(15)) #because we have total 5 labels and each has 3 tags so 15 neurons will be on final layer
 model.add(Reshape((5,3))) # each 5 have further 3 tags we need to reshape it
 model.add(Activation('softmax'))