Я пытаюсь оценить модель трансферного обучения в общем наборе данных с фильтрами собак и кошек, используя матрицу путаницы.Я основал код в учебнике по обучению переносу тензорного потока.Графики точности для обучения показывают точность выше 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, похоже, идет не так.