Глава 7. Визуализация данных и моделей
315
соответствует ожидаемому: на ней выделены голова и крыло птицы. Интересен
результат для изображения двух слонов, поскольку оно, в отличие от двух других
изображений, включает два животных вместо одного. В сгенерированной алгорит
мом CAM карте интенсивности наиболее высокие показатели важности — в области
голов обоих слонов на изображении. Карта интенсивности явно фокусируется на
бивнях и ушах животных, видимо, потому, что по ним можно отличить африканских
слонов (наиболее вероятный класс с точки зрения сети) от индийских (третий по
вероятности класс).
Техническая сторона алгоритма CAM
Несмотря на потрясающие возможности алгоритма CAM, лежащая в его основе идея
довольно проста. По существу, каждый пиксел карты CAM показывает, насколько
изменится вероятность классапобедителя, если значение пиксела увеличится на
одну единицу измерения. Если подробнее, алгоритм CAM включает следующие шаги.
1. Найти последний (то есть расположенный глубже всего) сверточный слой сети.
В VGG16 этот слой называется
block5_conv3
.
2. Вычислить градиент выходной вероятности сети для классапобедителя относи
тельно выходного сигнала сверточного слоя.
3. Форма этого градиента:
[1,
h,
w,
numFilters]
, где
h
,
w
и
numFilters
— высота,
ширина и количество фильтров выходного сигнала слоя соответственно. Далее
мы усредняем этот градиент по измерениям примеров данных, высоты и ширины,
получая тензор формы
[numFilters]
, представляющий собой массив показателей
важности, по одному для каждого фильтра сверточного слоя.
4. Умножаем тензор показателей важности (формы
[numFilters]
) на фактическое
значение выходного сигнала сверточного слоя (формы
[1,
h,
w,
numFilters]
)
с помощью транслирования (см. подраздел B.2.2). В результате получаем новый
тензор формы
[1,
h,
w,
numFilters]
— масштабированную по важности версию
выходного сигнала слоя.
5. Наконец, усредняем масштабированный по важности выходной сигнал слоя по
последнему измерению (измерению фильтров) и «выжимаем» первое измерение
(измерение примеров данных), в результате чего получаем изображение в от
тенках серого формы
[h,
w]
. Значения в этом изображении отражают, насколь
ко важна соответствующая часть изображения для «победившего» результата
классификации. Впрочем, это изображение включает отрицательные значения
и размеры его измерений меньше, чем у исходного входного изображения (14
×
14
вместо 224
×
224 в нашем примере VGG16). Поэтому мы обнуляем отрицатель
ные значения и интерполируем изображение перед наложением его на исходное
входное изображение.
Подробный код можно найти в функции
gradClassActivationMap()
в файле
visualizeconvnet/main.js
. Хотя по умолчанию эта функция выполняется в Node.js,
объем требуемых вычислений значительно меньше, чем в алгоритме градиентного
подъема в пространстве входных данных из предыдущего раздела. Так что можно
316
Do'stlaringiz bilan baham: |