Keras의 스트리밍 테스트 데이터에서 predict_generator로 예측을 얻는 방법은 무엇입니까?


16

에서 Keras 처음부터 훈련 convnets에 블로그 , 코드 쇼는 네트워크 교육 및 검증 데이터를 실행할 수 있습니다. 테스트 데이터는 어떻습니까? 유효성 검사 데이터가 테스트 데이터와 동일합니까? train 및 validation 폴더와 비슷한 줄에 별도의 테스트 폴더가있는 경우 테스트 데이터에 대한 혼동 행렬을 얻는 방법은 무엇입니까? 나는 이것을하기 위해 scikit learn 또는 다른 패키지를 사용해야한다는 것을 알고 있지만 테스트 데이터에 대한 클래스 현명한 확률 라인을 따라 무언가를 얻는 방법은 무엇입니까? 혼란 매트릭스에 이것을 사용하기를 희망합니다.


1
테스트 세트가 포함 된 디렉토리에서 데이터를 읽는 생성기로 model.predict_generator (...) 함수를 호출 할 수 있습니다. 혼동 행렬을 계산하는 데 사용할 수있는 예측을 반환합니다. 찾고 계십니까? 문서를 보려면 여기를 참조하십시오 : keras.io/models/sequential
stmax

1
그렇습니다. predict_generator는 0과 1 사이의 부동 소수점 값 목록 인 예측 목록을 반환합니다. 이것을 어떻게 해석합니까? 혼동 행렬과 함께 직접 사용할 수 없습니다.
Raghuram

2
아직 predict_generator를 시도하지 않았지만 (새로운 것이지만) 클래스 확률을 반환하는 것 같습니다. <= 0.5에서 0으로 및> 0.5에서 1로 값을 변환 해보십시오. 0과 1로 구성된 목록이 있으면 혼동 행렬 계산 기능에이를 제공 할 수 있습니다.
stmax

2
제쳐두고, 이것은 두 개의 클래스 문제에 대해 잘 작동하지만 두 개 이상의 클래스가 있으면 어떻게 될까요?
Raghuram

1
클래스가 두 개 이상인 경우 네트워크에 둘 이상의 출력이 필요합니다. n 개의 클래스에는 n 개의 출력이 있으며 가장 높은 출력을 가진 클래스를 예측합니다. softmax 기능 ( en.wikipedia.org/wiki/Softmax_function )을 살펴보십시오 .
stmax

답변:


15

테스트 데이터에서 혼동 행렬을 얻으려면 다음 두 단계를 거쳐야합니다.

  1. 테스트 데이터 예측

예를 들어, model.predict_generator테스트 생성기에서 처음 2000 개의 확률을 예측하는 데 사용 하십시오.

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. 라벨 예측을 기반으로 혼동 행렬 계산

예를 들어, 각각 1000 마리의 고양이와 1000 마리의 개가있는 경우와 확률을 비교하십시오.

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)

테스트 및 검증 데이터에 대한 추가 참고 사항

Keras 문서는 훈련 데이터, 검증 데이터 및 테스트 데이터의 세 가지 데이터 세트를 사용합니다. 교육 데이터는 모델 매개 변수를 최적화하는 데 사용됩니다. 유효성 검사 데이터는 메타 매개 변수 (예 : 에포크 수)를 선택하는 데 사용됩니다. 메타 매개 변수가 최적 인 모델을 최적화 한 후에는 테스트 데이터를 사용하여 모델 성능을 공정하게 추정합니다.


2
코드 스 니펫에 감사드립니다. 이 두 가지를 연결할 수 있습니까? 귀하의 예에서 y_true는 더미 데이터로 채워진 것 같습니다. generator.classes를 사용하여 배열을 채우시겠습니까?
Gegenwind

확실하지는 않지만, 대신에 np.array([0] * 1000 + [1] * 1000)당신은 같은 배열을 얻을 수 있다고 생각합니다generator.classes
Mehdi Nellen

2

여기 내가 시도하고 일한 코드가 있습니다.

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)

그런 다음 다음을 사용할 수 있습니다.

print (confusion matrix(predicted_class_indices,labels)

당신이 사용 확인 shuffle=False테스트 발생기 (내 경우에 그것의 검증 발전기) 및 사용하여 다시 validation_generator.reset()당신이 당신의 예측을하기 전에.


0

혼동 매트릭스의 경우 sklearn 패키지를 사용해야합니다. Keras가 혼동 행렬을 제공 할 수 있다고 생각하지 않습니다. 테스트 세트의 값을 예측하려면 model.predict () 메소드를 호출하여 테스트 세트에 대한 예측을 생성하십시오. 출력 값의 유형은 모델 유형, 즉 이산 또는 확률에 따라 다릅니다.


답변 해주셔서 감사합니다. Keras에는 자체 혼란 매트릭스 패키지가 없다는 것을 알고 있습니다. 내 질문은 model.predict_generator가 혼란 행렬을 계산하는 데 사용할 수없는 부동 소수점 값 목록을 반환한다는 것입니다.
Raghuram

어떤 종류의 데이터를 실험하고 있습니까?
enterML

이미지 작업 중입니다.
Raghuram
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.