Во многих случаях понимание того, почему модель предсказала данный результат, является ключевой деталью для пользователей модели и необходимой диагностикой, чтобы гарантировать, что ваша модель принимает решения на основе правильных характеристик. Например, если вы построили сверточную нейронную сеть, которая хорошо работает при прогнозировании поврежденных продуктов по изображениям, как вы можете быть уверены, что она делает свои прогнозы на основе поврежденной поверхности продукта, а не на основе фона изображения, который может быть коррелирован? к предсказаниям? Полезным инструментом для этой цели является карта значимости, которая предлагает визуализацию пикселей в изображении, которые вносят наибольший вклад в прогнозы модели. В этой статье мы исследуем функциональность карт значимости и рассмотрим пример ConvNet, который используется для оценки возраста рыб по их чешуе.

Карты значимости специально отображают градиент прогнозируемого результата от модели по отношению к входным или значениям пикселей.

Вычисляя изменение в прогнозируемом классе, применяя небольшие корректировки к значениям пикселей по всему изображению, мы можем измерить относительную важность каждого пикселя для окончательного прогноза модели. Рисунок 1 представляет собой пример исходной карты значимости; пиксели с высоким градиентом отображаются желтым цветом, а пиксели с низким градиентом - синим.

Рис. 1. Карта значимости, где желтый цвет указывает на высокий градиент для прогнозируемого класса

Более подробно этот метод описан Симоняном и соавт. 2013 г., с более подробной информацией можно ознакомиться на странице https://arxiv.org/abs/1312.6034.

Чтобы применить свой собственный, начните с загрузки вашей ConvNet, которая уже была обучена. В этом примере мы будем использовать сеть, которую я построил для предсказания возраста по чешуе рыбы. Прежде чем продолжить, вам нужно будет перейти на более раннюю версию Tensorflow, чтобы обойти ошибку с учетом последней версии Keras-Vis. Я перешел на Tensorflow 1.7.0.

Нам нужно будет импортировать ряд модулей, а именно Keras-Vis, который обеспечивает функцию карты значимости. Подробнее о функциях Keras-Vis вы можете узнать здесь.

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

Рис. 2. Исходное входное изображение рыбьей чешуи

Найдите имя последнего плотного слоя модели. В моем случае это называется «плотный_12». Мы определим индекс слоя и изменим активацию «density_12» с softmax на linear, потому что выходной градиент будет зависеть от всех узлов в модели. Затем назначьте изменения новой модели с именем «модель».

Затем мы можем применить функцию «visualize_saliency» для вычисления градиентов, выбрав все фильтры в слое с «filter_indices = None», и построить градиенты.

В итоге мы получаем что-то вроде рисунка 1, мелкомасштабные измерения для каждого пикселя. Чтобы упростить интерпретацию, мы применим фильтр Гаусса, чтобы сгладить значения пикселей и нанести его на исходное изображение.

На полученном графике желтым цветом показаны пиксели, которые оказали наибольшее влияние на прогнозируемый класс (рис. 3).

Рис. 3. Карта яркости, наложенная на исходное изображение

Я рад видеть, что модель принимала решения, основываясь на той части изображения, которая, как известно, связана с возрастом рыбы (кольца на шкале), а не на фоне или другой шкале в правой части изображения. Важно отметить, что это упражнение повышает надежность прогнозов модели. Полный скрипт Python для этой визуализации можно найти здесь.

Оригинальный пост здесь.

Прочтите больше статей по науке о данных на OpenDataScience.com, включая учебные пособия и руководства от новичка до продвинутого уровня! Подпишитесь на нашу еженедельную рассылку здесь и получайте последние новости каждый четверг.