我不确定如何在以下情况下解释Keras的默认行为:
我的Y(基本事实)是使用scikit-learn 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会自动执行多标签分类吗?评分指标的解释有何不同?
答案 0 :(得分:73)
请勿使用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