Lý do cho sự khác biệt hiệu suất rõ ràng này giữa entropy chéo phân loại & nhị phân là những gì người dùng xtof54 đã báo cáo trong câu trả lời của mình dưới đây , nghĩa là:
độ chính xác được tính toán bằng phương pháp Keras evaluate
hoàn toàn sai khi sử dụng binary_crossentropy với hơn 2 nhãn
Tôi muốn giải thích thêm về vấn đề này, chứng minh vấn đề thực tế tiềm ẩn, giải thích nó và đưa ra một biện pháp khắc phục.
Hành vi này không phải là một lỗi; lý do cơ bản là một vấn đề khá tinh tế & không có giấy tờ về cách Keras thực sự đoán độ chính xác sẽ sử dụng, tùy thuộc vào chức năng mất mà bạn đã chọn, khi bạn đưa đơn giản metrics=['accuracy']
vào trình biên dịch mô hình của mình. Nói cách khác, trong khi tùy chọn biên dịch đầu tiên của bạn
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
là hợp lệ, cái thứ hai của bạn:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
sẽ không tạo ra những gì bạn mong đợi, nhưng lý do không phải là việc sử dụng entropy chéo nhị phân (mà, ít nhất là về nguyên tắc, là một hàm mất hoàn toàn hợp lệ).
Tại sao vậy? Nếu bạn kiểm tra mã nguồn số liệu , Keras không xác định một số liệu chính xác duy nhất, nhưng một số chỉ số khác nhau, trong số đó binary_accuracy
và categorical_accuracy
. Điều xảy ra dưới mui xe là vì bạn đã chọn entropy chéo nhị phân làm hàm mất mát của mình và chưa chỉ định một số liệu chính xác cụ thể, Keras (sai ...) cho rằng bạn quan tâm đến binary_accuracy
, và đây là những gì nó trả về - trong khi trên thực tế bạn đang quan tâm đến categorical_accuracy
.
Hãy xác minh rằng đây là trường hợp, sử dụng ví dụ MNIST CNN trong Keras, với sửa đổi sau:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # WRONG way
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=2, # only 2 epochs, for demonstration purposes
verbose=1,
validation_data=(x_test, y_test))
# Keras reported accuracy:
score = model.evaluate(x_test, y_test, verbose=0)
score[1]
# 0.9975801164627075
# Actual accuracy calculated manually:
import numpy as np
y_pred = model.predict(x_test)
acc = sum([np.argmax(y_test[i])==np.argmax(y_pred[i]) for i in range(10000)])/10000
acc
# 0.98780000000000001
score[1]==acc
# False
Để khắc phục điều này, tức là sử dụng entropy thực nhị phân chéo như chức năng mất mát của bạn (như tôi đã nói, không có gì sai với điều này, ít nhất là về nguyên tắc) trong khi vẫn nhận được phân loại chính xác theo yêu cầu của vấn đề trong tầm tay, bạn nên yêu cầu một cách rõ ràng cho categorical_accuracy
trong tổng hợp mô hình như sau:
from keras.metrics import categorical_accuracy
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[categorical_accuracy])
Trong ví dụ của MNIST, sau khi đào tạo, ghi điểm và dự đoán bộ kiểm tra như tôi trình bày ở trên, hai số liệu bây giờ giống nhau, như chúng phải là:
# Keras reported accuracy:
score = model.evaluate(x_test, y_test, verbose=0)
score[1]
# 0.98580000000000001
# Actual accuracy calculated manually:
y_pred = model.predict(x_test)
acc = sum([np.argmax(y_test[i])==np.argmax(y_pred[i]) for i in range(10000)])/10000
acc
# 0.98580000000000001
score[1]==acc
# True
Thiết lập hệ thống:
Python version 3.5.3
Tensorflow version 1.2.1
Keras version 2.0.4
CẬP NHẬT : Sau bài viết của tôi, tôi phát hiện ra rằng vấn đề này đã được xác định trong câu trả lời này .
categorical_crossentropy
. Ngoài ra các nhãn cần phải chuyển đổi sang định dạng phân loại. Xemto_categorical
để làm điều này. Cũng xem định nghĩa của crossentropies phân loại và nhị phân ở đây .