В этом примере показано, как использовать взвешенную градиентом активацию класса, сопоставляющую (CAM градиента) метод, чтобы изучить, почему нейронная сеть для глубокого обучения принимает свои решения классификации. CAM градиента, изобретенный Selvaraju и соавторами [1], использует градиент классификационной оценки относительно сверточных функций, определенных сетью для того, чтобы понять, какие части изображения являются самыми важными для классификации. Этот пример использует предварительно обученную сеть GoogLeNet в изображениях.
CAM градиента является обобщением метода отображения активации класса (CAM). Этот пример показывает CAM градиента с помощью dlgradient
автоматическая функция дифференцирования, чтобы выполнить необходимые расчеты легко. Для методов отображения активации на данных о веб-камере реального времени смотрите, Исследуют Сетевые Предсказания Используя Отображение Активации Класса.
Загрузите сеть GoogLeNet.
net = googlenet;
Считайте размер изображения GoogLeNet.
inputSize = net.Layers(1).InputSize(1:2);
Загрузите sherlock.jpg
., изображение золотистого ретривера включено с этим примером.
img = imread("sherlock.jpg");
Измените размер изображения к сетевым входным размерностям.
img = imresize(img,inputSize);
Классифицируйте изображение и отобразите его, наряду с его классификацией и классификационной оценкой.
[classfn,score] = classify(net,img);
imshow(img);
title(sprintf("%s (%.2f)", classfn, score(classfn)));
GoogLeNet правильно классифицирует изображение как золотистого ретривера. Но почему? Что характеристики изображения заставляют сеть делать этой классификацией?
Идея позади CAM градиента [1] состоит в том, чтобы вычислить градиент итоговой классификационной оценки относительно итоговой сверточной карты функции. Места, где этот градиент является большим, являются точно местами, где итоговый счет зависит больше всего от данных. gradcam
функция помощника вычисляет карту CAM градиента для dlnetwork
, взятие производной softmax слоя выигрывает за данный класс относительно сверточной карты функции. Для автоматического дифференцирования, входное изображение dlImg
должен быть dlarray
.
type gradcam.m
function [featureMap,dScoresdMap] = gradcam(dlnet, dlImg, softmaxName, featureLayerName, classfn) [scores,featureMap] = predict(dlnet, dlImg, 'Outputs', {softmaxName, featureLayerName}); classScore = scores(classfn); dScoresdMap = dlgradient(classScore,featureMap); end
Первая линия gradcam
функция получает баллы класса и карту функции от сети. Вторая линия находит счет к выбранной классификации (золотистый ретривер, в этом случае). dlgradient
вычисляет градиенты только для скалярных функций. Так gradcam
вычисляет градиент изображения выигрывают только за выбранную классификацию. Третья линия использует автоматическое дифференцирование, чтобы вычислить градиент итогового счета относительно весов в слое карты функции.
Чтобы использовать CAM градиента, создайте dlnetwork
от сети GoogLeNet. Во-первых, создайте график слоев из сети.
lgraph = layerGraph(net);
Чтобы получить доступ к данным что использование GoogLeNet для классификации, удалите ее итоговый слой классификации.
lgraph = removeLayers(lgraph, lgraph.Layers(end).Name);
Создайте dlnetwork
от графика слоев.
dlnet = dlnetwork(lgraph);
Задайте имена softmax и покажите слои карты, чтобы использовать с функцией помощника CAM градиента. Для слоя карты функции задайте или последний слой ReLU с неодиночным элементом пространственные размерности или последний слой, который собирает выходные параметры слоев ReLU (такие как конкатенация глубины или слой сложения). Если ваша сеть не содержит слоев ReLU, задает имя итогового сверточного слоя, который имеет неодиночный элемент пространственные размерности в выходе. Используйте функциональный analyzeNetwork
исследовать вашу сеть и выбрать правильные слои. Для GoogLeNet именем softmax слоя является 'prob'
и слоем конкатенации глубины является 'inception_5b-output'
.
softmaxName = 'prob'; featureLayerName = 'inception_5b-output';
Чтобы использовать автоматическое дифференцирование, преобразуйте изображение sherlock в dlarray
.
dlImg = dlarray(single(img),'SSC');
Вычислите градиент CAM градиента для изображения путем вызова dlfeval
на gradcam
функция.
[featureMap, dScoresdMap] = dlfeval(@gradcam, dlnet, dlImg, softmaxName, featureLayerName, classfn);
Измените размер карты градиента к размеру изображения GoogLeNet и масштабируйте баллы к соответствующим уровням для отображения.
gradcamMap = sum(featureMap .* sum(dScoresdMap, [1 2]), 3); gradcamMap = extractdata(gradcamMap); gradcamMap = rescale(gradcamMap); gradcamMap = imresize(gradcamMap, inputSize, 'Method', 'bicubic');
Покажите уровни CAM градиента сверху изображения при помощи 'AlphaData'
значение 0,5. 'jet'
палитра имеет темно-синий как самое низкое значение и темно-красный как самое высокое.
imshow(img); hold on; imagesc(gradcamMap,'AlphaData',0.5); colormap jet hold off; title("Grad-CAM");
Безусловно, верхняя поверхность и ухо собаки оказывают самое большое влияние на классификацию.
Для другого подхода к исследованию причин глубоких сетевых классификаций смотрите occlusionSensitivity
.
[1] Selvaraju, R. R. М. Когсвелл, A. Десять кубометров, Р. Ведэнтэм, Д. Пэрих и Д. Бэтра. "CAM градиента: Визуальные Объяснения от Глубоких Сетей через Основанную на градиенте Локализацию". На Международной конференции IEEE по вопросам Компьютерного зрения (ICCV), 2017, стр 618–626. Доступный в Grad-CAM
на веб-сайте Открытого доступа Основы Компьютерного зрения.
dlarray
| dlfeval
| dlgradient
| dlnetwork