Làm cách nào để có được các dự đoán với dự đoán_generator khi truyền dữ liệu thử nghiệm trong Keras?


16

Trong blog Keras về đào tạo convnets từ đầu , mã chỉ hiển thị mạng chạy trên dữ liệu đào tạo và xác thực. Còn dữ liệu kiểm tra thì sao? Là dữ liệu xác nhận giống như dữ liệu thử nghiệm (tôi nghĩ là không). Nếu có một thư mục kiểm tra riêng trên các dòng tương tự như thư mục xác thực và xác thực, làm thế nào để chúng ta có được ma trận nhầm lẫn cho dữ liệu kiểm tra. Tôi biết rằng chúng ta phải sử dụng scikit learn hoặc một số gói khác để làm điều này, nhưng làm thế nào để tôi có được thứ gì đó theo dòng xác suất khôn ngoan của lớp cho dữ liệu thử nghiệm? Tôi hy vọng sẽ sử dụng điều này cho ma trận nhầm lẫn.


1
Bạn có thể gọi hàm model.predict_generator (...) bằng một trình tạo đọc dữ liệu từ một thư mục chứa tập kiểm tra. Nó trả về các dự đoán mà bạn có thể sử dụng để tính toán ma trận nhầm lẫn. Có phải đó là những gì bạn đang tìm kiếm? Xem ở đây để tìm tài liệu: keras.io/models/ resultential
stmax

1
Vâng, tôi đã thấy điều đó. dự đoán_generator trả về một danh sách các dự đoán là danh sách các giá trị float giữa 0 và 1. Làm thế nào để tôi diễn giải điều này? Nó không thể được sử dụng trực tiếp với ma trận nhầm lẫn.
Raghuram

2
Tôi chưa thử dự đoán_generator (nó khá mới), nhưng nó dường như trả về xác suất của lớp. Cố gắng chuyển đổi các giá trị <= 0,5 thành 0 và> 0,5 thành 1. Khi bạn có một danh sách gồm 0 và 1, bạn có thể đưa nó vào hàm để tính ma trận nhầm lẫn.
stmax

2
Bên cạnh đó, điều này sẽ hoạt động tốt cho hai vấn đề của lớp, nhưng nếu có nhiều hơn hai lớp thì sao?
Raghuram

1
Nếu có nhiều hơn hai lớp, mạng của bạn cần nhiều hơn một đầu ra. Đối với n lớp bạn có n đầu ra và bạn dự đoán lớp có đầu ra cao nhất. Hãy xem chức năng softmax ( en.wikipedia.org/wiki/Softmax_feft ).
stmax

Câu trả lời:


15

Để có được ma trận nhầm lẫn từ dữ liệu thử nghiệm, bạn nên thực hiện hai bước:

  1. Đưa ra dự đoán cho dữ liệu thử nghiệm

Ví dụ: sử dụng model.predict_generatorđể dự đoán 2000 xác suất đầu tiên từ trình tạo thử nghiệm.

generator = datagen.flow_from_directory(
        'data/test',
        target_size=(150, 150),
        batch_size=16,
        class_mode=None,  # only data, no labels
        shuffle=False)  # keep data in same order as labels

probabilities = model.predict_generator(generator, 2000)
  1. Tính toán ma trận nhầm lẫn dựa trên dự đoán nhãn

Ví dụ, so sánh xác suất với trường hợp có 1000 con mèo và 1000 con chó tương ứng.

from sklearn.metrics import confusion_matrix

y_true = np.array([0] * 1000 + [1] * 1000)
y_pred = probabilities > 0.5

confusion_matrix(y_true, y_pred)

Lưu ý bổ sung về dữ liệu kiểm tra và xác nhận

Tài liệu Keras sử dụng ba bộ dữ liệu khác nhau: dữ liệu huấn luyện, dữ liệu xác nhận và dữ liệu thử nghiệm. Dữ liệu đào tạo được sử dụng để tối ưu hóa các tham số mô hình. Dữ liệu xác nhận được sử dụng để đưa ra lựa chọn về các tham số meta, ví dụ: số lượng kỷ nguyên. Sau khi tối ưu hóa một mô hình với các tham số meta tối ưu, dữ liệu thử nghiệm được sử dụng để có được ước tính hợp lý về hiệu suất của mô hình.


2
Cảm ơn các đoạn mã. Bạn có thể liên kết hai? Trong ví dụ của bạn, y_true dường như được điền với dữ liệu giả. Bạn có thể sử dụng trình tạo. Các lớp để điền vào mảng không?
Gegenwind

Tôi không chắc chắn, nhưng tôi nghĩ thay vì np.array([0] * 1000 + [1] * 1000)bạn có thể có được cùng một mảng bằng cách thực hiệngenerator.classes
Mehdi Nellen

2

Đây là một số mã tôi đã thử và làm việc cho tôi:

pred= model.predict_generator(validation_generator, nb_validation_samples // batch_size)
predicted_class_indices=np.argmax(pred,axis=1)
labels = (validation_generator.class_indices)
labels2 = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
print(predicted_class_indices)
print (labels)
print (predictions)

Sau đó bạn có thể sử dụng:

print (confusion matrix(predicted_class_indices,labels)

Hãy chắc chắn rằng bạn sử dụng shuffle=Falsetrong trình tạo thử nghiệm của mình (trong trường hợp của tôi là trình tạo xác thực) và đặt lại nó bằng cách sử dụng validation_generator.reset()trước khi bạn đưa ra dự đoán của mình.


0

Đối với ma trận nhầm lẫn, bạn phải sử dụng gói sklearn. Tôi không nghĩ Keras có thể cung cấp một ma trận nhầm lẫn. Để dự đoán các giá trị trên tập kiểm thử, chỉ cần gọi phương thức model.predict () để tạo dự đoán cho tập kiểm thử. Loại giá trị đầu ra phụ thuộc vào loại mô hình của bạn, nghĩa là rời rạc hoặc xác suất.


Cảm ơn câu trả lời. Tôi biết rằng Keras không có gói ma trận nhầm lẫn của riêng mình. Câu hỏi của tôi là model.predict_generator trả về một danh sách các giá trị float không thể được sử dụng để tính toán ma trận nhầm lẫn.
Raghuram

Bạn đang thử nghiệm loại dữ liệu nào?
enterML

Tôi đang làm việc trên hình ảnh.
Raghuram
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.