Почему возникает разница между точностью на этапе обучения и точностью, вычисленной с помощью метода predict_classes в Keras на подмножестве обучающих данных?
Краткое содержание
Я пытаюсь решить задачу бинарной классификации с помощью AlexNet. Я разделил исходный набор данных на обучающий и валидационный в соотношении 70/30. Я обучил свою нейронную сеть на наборе из 11200 изображений и получил точность обучения 99%, а точность валидации составила 96%. В конце обучения я сохранил веса модели в файл. После обучения я загрузил сохраненные веса в ту же нейронную сеть. Я выбрал 738 изображений из 11200 обучающих изображений и попытался предсказать класс каждого из них с помощью своей модели, а затем сравнил их с истинными метками. Затем я снова вычислил процент точности, и он составил 74%. В чем проблема? Я предполагаю, что его точность должна быть снова около 96%. Вот код, который я использую. prelist=[] for i in range(len(x)): prediction = model.predict_classes(x[i]) prelist.append(prediction) count = 0 for i in range(len(x)): if(y[i] == prelist[i]): count = count + 1 test_precision = (count/len(x))*100 print (test_pr
Полный текст
Спросил 5 лет, 11 месяцев назад Изменен сегодня Просмотрен 794 раза
Спросил 5 лет, 11 месяцев назад
2 $\begingroup$ Я пытаюсь решить задачу бинарной классификации с помощью AlexNet. Я разделил исходный набор данных на обучающий и проверочный в соотношении 70/30. Я обучил свою нейронную сеть на наборе из 11200 изображений и получил точность обучения 99%, а точность проверки составила 96%. В конце обучения я сохранил веса модели в файл. После обучения я загрузил сохраненные веса в ту же нейронную сеть. Я выбрал 738 изображений из 11200 обучающих изображений и попытался предсказать класс каждого из них с помощью своей модели, а затем сравнил их с истинными метками. После этого я снова вычислил процент точности, и он составил 74%. В чем проблема? Я предполагаю, что его точность должна быть снова около 96%. Вот код, который я использую. prelist=[] for i in range(len(x)): prediction = model.predict_classes(x[i]) prelist.append(prediction) count = 0 for i in range(len(x)): if(y[i] == prelist[i]): count = count + 1 test_precision = (count/len(x))*100 print (test_precision) Когда я использую `predict_classes` на 11200 изображениях, которые использовал для обучения нейронной сети, и сравниваю результат с истинными метками, а затем снова вычисляю точность, она составляет 91%. neural-networks training accuracy binary-classification alexnet Share Improve this question Follow edited Jan 17, 2021 at 19:24 nbro 43.2k 14 14 gold badges 121 121 silver badges 222 222 bronze badges asked Feb 21, 2020 at 15:07 Saha 131 1 1 bronze badge $\endgroup$ 0 Add a comment | 1 Answer 1 Sorted by: Reset to default Highest score (default) Date modified (newest first) Date created (oldest first) 0 $\begingroup$ Одна из проблем может быть связана с выбором проверочного набора. Чтобы модель хорошо работала на данных, которые она не видела в качестве обучающих, необходимо иметь высокую точность проверки, но этого недостаточно само по себе. Проверочный набор должен быть достаточно большим и разнообразным, чтобы его вероятностное распределение точно отражало вероятностное распределение всех изображений. У вас может быть 1000 проверочных изображений, но если они похожи друг на друга, они будут недостаточным представлением вероятностного распределения. Следовательно, когда вы запускаете обученную модель для предсказаний на тестовом наборе, ее производительность будет низкой. Итак, вопрос: сколько проверочных изображений вы использовали и как они были выбраны (случайно или вручную)? Попробуйте увеличить количество проверочных изображений и используйте один из доступных методов для случайного выбора изображений из обучающего набора, удалите их из обучающего набора и используйте их в качестве проверочных изображений. Метод `flow_from_directory` в Keras или `train_test_split` в sklearn могут справиться с этим. Обычно я выбираю проверочный набор случайным образом и делаю его размер не менее 10% от размера тестового набора. Возможна перетренированность, но, учитывая высокую точность проверки, я считаю это маловероятным. Другой момент: как выбирались изображения для тестового набора? Возможно, их распределение искажено. Опять же, лучший способ — выбирать их случайным образом. Какой была ваша точность обучения? Без высокой точности обучения точность проверки может быть бессмысленной. Точность обучения должна быть в диапазоне верхних 90-х процентов, чтобы точность проверки была действительно значимой. Наконец, есть ли вероятность, что изображения в тестовом наборе были помечены неправильно? Попробуйте поменять местами тестовый и проверочный наборы и посмотреть, какую точность проверки вы получите. Вот пример того, что я имею в виду. Один человек построил CNN для работы с набором изображений, разделенных на два класса. Один класс назывался "собаки", другой — "волки". Он обучил сеть с отличными результатами: почти 99,99% точности обучения и 96% точности проверки. Когда он запустил ее на тестовом наборе, его точность составила около 50%. Почему? Оказывается, все изображения волков