Как мне использовать mode.predict_generator для оценки производительности модели в Матрице смешения? - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь оценить модель трансферного обучения в общем наборе данных с фильтрами собак и кошек, используя матрицу путаницы.Я основал код в учебнике по обучению переносу тензорного потока.Графики точности для обучения показывают точность выше 90%.

Тем не менее, использование генераторов для получения истинных лабораторных данных и model.predict_generator для получения массива прогнозирования приводит к противоречивым результатам.Во-первых, точность не является стабильной, если во второй раз запустить прогноз, он изменит значения.Во-вторых, прогноз, который я получаю с помощью model.predict_generator, кажется неверным по сравнению с model.predict для отдельного экземпляра.

Для быстрого тестирования матрицы путаницы на основе ImageDataGenerator Iскачал 5 изображений кошек и 5 изображений собак.Затем я создал еще один генератор из папки и проверил, что метки и классы будут такими же, как обучение.

Два странных поведения После этого я просто использовал матрицу смешения метрик sklearn для оценки прогноза, используяmodel.predict_generator и метки, которые я получаю от генератора как настоящие метки.

При первом запуске я получил точность 0,9 и говорю «ура!».однако, если я попробую второй раз, то model.predict_generator выдает другие значения для вывода массива и точность падает до 0,5.После этого он больше не меняется .... Какой результат правильный?Почему это меняется?

Я заметил, что вам нужно дважды бежать, чтобы получить окончательный результат, но полученный результат неверен.Я написал код для проверки каждого изображения в отдельности, и я не ошибся в прогнозе.Так что я делаю не так?или генераторы не применимы к этой ситуации.Это немного сбивает с толку

Код можно взломать в моем репозитории github и использовать в коллаборации Google для запуска, если у вас нет gpu.На самом деле, мой маленький спутник Toshiba хорошо работает с GPU NVIDIA всего 2 ГБ и 300 CUDA

полный код на моем GIT

Код организован как блокнот Jupyterоднако здесь я добавляю код Transfer Learning на основе https://www.tensorflow.org/tutorials/images/transfer_learning

, чтобы создать генератор:

test_base_dir = '.'
test_dir = os.path.join( test_base_dir, 'test')
test_datagen_2 = ImageDataGenerator( rescale = 1.0/255. )
test_generator = test_datagen_2.flow_from_directory( test_dir,
                                                     batch_size  = 1,
                                                     class_mode  = binary', 
                                                     target_size = (image_size, image_size))

и для прогнозирования:

   filenames = test_generator.filenames
   nb_samples = len(filenames)
   y_predict = model.predict_generator(test_generator,steps = 
   nb_samples)
   y_predict

, который я округляюиспользуя NumPy, наконец, использовать метрику путаницы


from sklearn.metrics  import confusion_matrix
cm = confusion_matrix(y_true=test_generator.labels, y_pred=y_predict_rounded)
cm

Вместо этого используется ручная проверка:

def prediction(path_img):
img = image.load_img(path_img, target_size=(150,150))
x = image.img_to_array(img)
x = x/255.
x = np.expand_dims(x, axis=0)
classes = model.predict(x)
plt.imshow(img)
if classes > 0.5:
    print(path_img.split('/')[-1]+' is a dog')
else:
     print(path_img.split('/')[-1]+' is a cat')   
return classes

, которую я использую следующим образом:

y_pred_m = []
files=[]
for filename in os.listdir(test_dir):
    file = test_dir+'/'+filename
    for item in os.listdir(file):
        file2 = file+'/'+item
        if file2.split('.')[-1]=='jpg':
            files.append(file2)

Ипредсказание идет:

prediction_array = [prediction(img) for img in files]

np.round(prediction_array, decimals=0)

Ожидаемые результаты должны иметь матрицу путаницы с уровнем точности, аналогичным обучению.Поскольку проверка каждого примера в отдельности, похоже, не содержит ошибок в прогнозировании, однако, модель.predict_generate, похоже, идет не так.

1 Ответ

0 голосов
/ 26 июня 2019

Проблема была в том, что по умолчанию _flow_from_directory_ использует shuffle = True .Предсказания верны, если случайный порядок переходит в False.Тем не менее, использование набора данных проверки для оценки обучения, кажется, работает правильно, хотя shuffle имеет значение True.Я обновил git для внесения этих изменений

# Flow validation images in batches of 20 using test_datagen generator
test_generator =  test_datagen_2.flow_from_directory( test_dir,
                                                  batch_size  = 1,
                                                  class_mode  = 'binary', 
                                                  target_size = (image_size, 
image_size),
                                                  shuffle = False)
...