2017-05-24 31 views
20

Tôi không chắc chắn cách diễn giải hành vi mặc định của Keras trong tình huống sau:Keras xử lý phân loại nhiều nhãn như thế nào?

Y của tôi (được thiết lập) sử dụng scikit-learn's MultilabelBinarizer().

Do đó, để đưa ra một ví dụ ngẫu nhiên, một hàng của cột y của tôi được mã hóa một nóng như sau: [0,0,0,1,0,1,0,0,0,0,1].

Vì vậy, tôi có 11 lớp học có thể được dự đoán và nhiều lớp có thể đúng; do đó bản chất đa nhãn của vấn đề. Có ba nhãn cho mẫu cụ thể này.

Tôi đào tạo mô hình như tôi sẽ cho một vấn đề không đa nhãn (kinh doanh như bình thường) và tôi không nhận được lỗi.

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 

không Keras làm gì khi nó gặp y_train của tôi và thấy rằng nó là "đa" một nóng được mã hóa, có nghĩa là có nhiều hơn một 'một' hiện diện trong mỗi hàng của y_train? Về cơ bản, Keras có tự động thực hiện phân loại nhiều nhãn không? Bất kỳ sự khác biệt trong việc giải thích các số liệu chấm điểm?

Trả lời

29

Trong ngắn

Không sử dụng softmax.

Sử dụng sigmoid để kích hoạt lớp đầu ra của bạn.

Sử dụng binary_crossentropy cho chức năng mất.

Sử dụng predict để đánh giá.

Tại sao

Trong softmax khi tăng điểm cho một nhãn, tất cả những người khác được hạ xuống (đó là một phân bố xác suất). Bạn không muốn điều đó khi bạn có nhiều nhãn.

Hoàn Mã

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

Cảm ơn, vì vậy bạn đang nói để phân hủy vấn đề multilabel tôi vào nhiều vấn đề phân loại nhị phân? Làm thế nào để Keras biết rằng tôi đang cho nó một nhiệm vụ phân loại đa nhãn hiệu? – user798719

+1

Vâng, đúng vậy. Keras không thực sự phải biết. Bằng cách sử dụng 'sigmoid' và' binary_crossentropy', các nhãn sẽ được cải thiện riêng lẻ, và đó là cách bạn muốn cho tác vụ đa nhãn, phải không? – frankyjuang

+0

làm thế nào bạn sẽ có được các lớp học có 1 –

Các vấn đề liên quan