zoukankan      html  css  js  c++  java
  • 一文看尽图像分类问题

    图像分类问题,初看比较简单,但是还是有些东西的. 本文也仅谈图像分类.

    分类问题有哪些

    1. 最简单的分类就是二分类 binary classification, 比如对癌症组织切片图像的分类,看有没有癌症。

    2. 再就是多分类问题,类型之间是互斥的,只能是其中一种,叫 mult-class classification, 比如对 猫,狗,鸡,鸭... 等等分类,是这种就不能是另一种.

    3. 然后另一种多分类,类型之间可以多选,叫 multi-label classification, 比如,婚礼现场的图片可能会有多种风格,一张图片同时具有 "西式",“唯美” 等标签. 

    4. 还拿婚礼图片举例,图片可能不仅有风格标签,还可能有另一个环境标签,比如"室内",“室外”,“草坪”,“教堂”等, 这样我们的问题就变成了不仅要对风格分类,还要对环境分类. 这种问题我暂且叫它叫multi-output,严格说来 muti-output 是一种解决思路,不像multi-lable/multi-class是一种问题形式

    5. 树形结构的分类,叫 hierarchical classification 比如,对 猫,狗,树木,花朵,动物,植物...分类, 显然,猫狗都属于动物,树木花朵都属于植物,也就是一旦预测出是猫,那也得预测出是动物.

      

    解决方案是什么

    1. 第1种简单,activation 用 sigmoid ,cost 用 binary_cross_entropy. 聪明的你一定已经想到了,就不多说了.

    2. 第2种也简单, activation 用 softmax, cost 用 categorical_cross_entropy. 聪明的你一定也想到了, 也不多说了.

    3. 第3种,可以用下面的方法去做。activation 用 sigmoid ,cost 用 binary_cross_entropy, 有点意思吧,虽然输出可能是>2维的,但是还是用sigmoid. 其实从理论上讲就是每种类型只关心自己是不是该有的类型,不关心其他和其他类型的互斥性,Andrew Ng 在它大名鼎鼎的<Machine Learning> 课程里讲过,这种好像叫 One-vs-All. 

    In short

    Don't use softmax.

    Use sigmoid for activation of your output layer.

    Use binary_crossentropy for loss function.

    Use predict for evaluation.

    Why

    In softmax when increasing score for one label, all others are lowered (it's a probability distribution). You don't want that when you have multiple labels.

    Complete Code

    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Activation
    from keras.optimizers import SGD
    
    model = Sequential()
    model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
    model.add(Dropout(0.1))
    model.add(Dense(600, activation='relu'))
    model.add(Dropout(0.1))
    model.add(Dense(y_train.shape[1], activation='sigmoid'))
    
    sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(loss='binary_crossentropy',
                  optimizer=sgd)
    
    model.fit(X_train, y_train, epochs=5, batch_size=2000)
    
    preds = model.predict(X_test)
    preds[preds>=0.5] = 1
    preds[preds<0.5] = 0
    # score = compare preds and y_test

    4. 这种问题仍然可以用第3种方法解决,但是呢,有些特殊情况不适用,那就是如果在训练集里没有的 风格/环境 组合,在测试集上同样预测不出来. 比如,中式/室外 这个组合如果在train set里没有,那么在test set即使出现也不能预测出这个组合. 基于这种情况,可以用更高级的 multi-output classification 来做, 参考[5],代码可以看我github上 https://github.com/mashuai191/machine_learning/tree/master/computer_vision/multi-output-classification. 觉得代码有帮助的记得去点个星星哈!

    5. 树形结构这种,在看YOLO9000 的时候有提到大概怎么做,可以去看看,就是在树形结构中的每一个节点node做softmax, 预测的时候用条件概率从根节点到子节点往下相乘, 就是贝叶斯概率公式. 代码可以参考这里

    https://github.com/mashuai191/machine_learning/blob/master/computer_vision/hierarchical_classification/hierarchical-classification-cifar10.ipynb, 我fork 的一个日本人的代码.

    这些类型应该cover了常见的图像分类情况了,如果有遗漏的,麻烦给我留言.

    人懒,码字不易啊。。。

    Ref:

    1. https://medium.com/@vijayabhaskar96/multi-label-image-classification-tutorial-with-keras-imagedatagenerator-cd541f8eaf24
    2. How does Keras handle multilabel classification?
    3. Guide To Multi-Class Multi-Label Classification With Neural Networks In Python
    4. Multi-label classification with Keras
    5. Keras: Multiple outputs and multiple losses, https://www.pyimagesearch.com/2018/06/04/keras-multiple-outputs-and-multiple-losses/
    转载请注明出处 http://www.cnblogs.com/mashuai-191/
  • 相关阅读:
    hdu 1402 大数A*B模板(FFT)
    ccpc 哈尔滨L题 LRU Algorithm
    今年得慢慢学的
    Codeforces Round #629 (Div. 3) E. Tree Queries(LCA)
    Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version) -- manacher
    hdu 3068 (manacher算法)
    用Socket API建立简易tcp服务端和客户端
    Win下建立Socket时注意事项
    线段树(Segment Tree)
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/mashuai-191/p/10967236.html
Copyright © 2011-2022 走看看