2017-05-24 171 views
20

我不确定如何解释在下列情况下Keras的默认行为:Keras如何处理多标签分类?

我的Y(地面实况)已设置使用scikit学习的MultilabelBinarizer()。

因此,给一个随机的例子,我的y列的一行是一个热门编码,如: [0,0,0,1,0,1,0,0,0,0,1]

所以我有11类,可以预测,而且不止一个可能是真的;因此问题的多标签性质。这个特定样本有三个标签。

我训练模型,我会为一个非多标记问题(照旧)和我没有得到任何错误。

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='softmax')) 

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='categorical_crossentropy', 
       optimizer=sgd, 
       metrics=['accuracy',]) 

model.fit(X_train, y_train,epochs=5,batch_size=2000) 

score = model.evaluate(X_test, y_test, batch_size=2000) 
score 

是什么Keras做,当它遇到我y_train,并认为这是“多”独热编码,这意味着有一个以上的“一”目前y_train每一行?基本上,Keras是否会自动执行多标签分类?评分指标的解释有何不同?

回答

29

总之

不要使用softmax

使用sigmoid为输出层的激活。

使用binary_crossentropy损失功能。

评估使用predict

为什么

softmax一个标签增加分数时,所有其他被降低(这是一个概率分布)。当你有多个标签时你不需要这个。

完整代码

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 
+1

谢谢你,所以你说的分解我多标记问题分成许多二元分类问题? Keras如何知道我正在给它一个多标签分类任务? – user798719

+1

是的,那是对的。凯拉斯并不需要知道。通过使用'sigmoid'和'binary_crossentropy',标签将单独提高,这就是你想要的多标任务,对不对? – frankyjuang

+0

你将如何获得1级的课程 –