一文看尽图像分类问题

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

 

分类问题有哪些

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/

 

posted @ 2019-06-03 14:05  mashuai_191  阅读(475)  评论(0编辑  收藏  举报