Как я могу использовать «np.argmax()» вместо «classifier.predict_classes()»?

#python #machine-learning #keras

Вопрос:

С classifier.predict_classes() тех пор как я обесценился, как я могу использовать приведенные ниже строки кодов, используя np.argmax() .

 import cv2
import numpy as np
from keras.models import load_model

classifier=load_model("cats_vs_dogs_V1.h5")

def draw_test(name, pred, input_im):
    BLACK = [0,0,0]
    if pred == "[0]":
        pred = "cat"
    if pred == "[1]":
        pred = "dog"
    
    expanded_image = cv2.copyMakeBorder(input_im, 0, 0, 0, imageL.shape[0] ,cv2.BORDER_CONSTANT,value=BLACK)
    #expanded_image = cv2.cvtColor(expanded_image, cv2.COLOR_GRAY2BGR)
    
    cv2.putText(expanded_image, str(pred), (252, 200) , cv2.FONT_HERSHEY_COMPLEX_SMALL,4, (23,0,255), 2)
    
    cv2.imshow(name, expanded_image)


for i in range(0,10):
    rand = np.random.randint(0,len(X_test))
    input_im = X_test[rand]

    imageL = cv2.resize(input_im, None, fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
    cv2.imshow("Test Image", imageL)

    input_im = input_im.reshape(1,150,150,3) 
    
    ## Get Prediction
    res = str(classifier.predict_classes(input_im, 1, verbose = 0)[0])

    draw_test("Prediction", res, imageL) 
    cv2.waitKey(0)

cv2.destroyAllWindows()
 

Я попытался заменить str(classifier.predict_classes(input_im, 1, verbose = 0)[0]) на str(np.argmax(classifier.predict(input_im, 1, verbose = 0)[0])) , но не получил желаемого результата.

Ожидаемое изображение(отображается имя) Ожидаемое изображение(отображается имя)

Изображение, которое я получил(отображается только 0) Изображение, которое я получил(отображается только 0)

Ответ №1:

Я думаю, что проблема не в использовании np.argmax() . Вы сделали это правильно с str(np.argmax(classifier.predict(input_im, 1, verbose = 0)[0])) помощью . Однако он возвращает "0" или "1" вместо "[0]" или "[1]" . Таким образом, вам нужно исправить свою draw_test() функцию.

 def draw_test(name, pred, input_im):
    BLACK = [0,0,0]
    input_dict = {"0":"cat", "1":"dog"}
    pred = input_dict[pred]

    expanded_image = cv2.copyMakeBorder(input_im, 0, 0, 0, imageL.shape[0] ,cv2.BORDER_CONSTANT,value=BLACK)
    #expanded_image = cv2.cvtColor(expanded_image, cv2.COLOR_GRAY2BGR)
    
    cv2.putText(expanded_image, str(pred), (252, 200) , cv2.FONT_HERSHEY_COMPLEX_SMALL,4, (23,0,255), 2)
    
    cv2.imshow(name, expanded_image)
 

Комментарии:

1. Модель теперь показывает имя. Но Это возвращает только кошку. Все собаки также были возвращены как кошки. res = str(np.argmax(classifier.predict(input_im, 1, verbose = 0))) . Я попробовал поставить res = str(np.argmax(classifier.predict(input_im, 1, verbose = 0)[0])) , но никаких изменений.

2. Я думаю, что это проблема модели, а не ошибка кода . Попробуй draw_test("Prediction", "1", <image array>) . Он должен вернуться dog . Возможно, вам потребуется переобучить свою модель с использованием большего количества образцов и менее предвзятых обучающих образцов.

3. при ставке «1» теперь отображаются только собаки. Я переучился на модель. Я не думаю,что ошибка связана с моим кодом, потому classifier.predict_classes(input_im, 1, verbose = 0)[0]) что показывает правильный непредвзятый вывод. [Ссылка на мой github ]( github.com/sumit-mandal/DeepLearning-opencvProj/blob/main/… )