CAM градиента показывает почему позади решений глубокого обучения

В этом примере показано, как использовать подход 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");

Измените размер изображения к размерностям GoogLeNet.

img = imresize(img,inputSize);

Классифицируйте изображение и отобразите его, наряду с его счетом классификации и классификации.

[classfn,score] = classify(net,img);
imshow(img);
title(sprintf("%s (%.2f)", classfn, score(classfn)));

GoogLeNet правильно классифицирует изображение как золотистого ретривера. Но почему? Что характеристики изображения заставляют сеть делать этой классификацией?

CAM градиента объясняет почему

Идея позади CAM градиента [1] состоит в том, чтобы вычислить градиент итогового счета классификации относительно итогового сверточного слоя в сети. Места, где этот градиент является большим, являются точно местами, где итоговый счет зависит больше всего от данных. gradcam функция помощника вычисляет карту CAM градиента для dlnetwork, взятие производной softmax слоя выигрывает за данный класс относительно сверточной карты функции. Для автоматического дифференцирования, входное изображение dlImg должен быть dlarray.

type gradcam.m
function [convMap,dScoresdMap] = gradcam(dlnet, dlImg, softmaxName, convLayerName, classfn)
[scores,convMap] = predict(dlnet, dlImg, 'Outputs', {softmaxName, convLayerName});
classScore = scores(classfn);
dScoresdMap = dlgradient(classScore,convMap);
end

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

Чтобы использовать CAM градиента, создайте dlnetwork от сети GoogLeNet. Создайте график слоя из сети.

lgraph = layerGraph(net);

Чтобы получить доступ к данным что использование GoogLeNet для классификации, удалите ее итоговый слой классификации.

lgraph = removeLayers(lgraph, lgraph.Layers(end).Name);

Создайте dlnetwork из графика слоя.

dlnet = dlnetwork(lgraph);

Задайте имя softmax слоя, 'prob'. Задайте имя итогового сверточного слоя, 'inception_5b-output'.

softmaxName = 'prob';
convLayerName = 'inception_5b-output';

Чтобы использовать автоматическое дифференцирование, преобразуйте изображение sherlock в dlarray.

dlImg = dlarray(single(img),'SSC');

Вычислите градиент CAM градиента для изображения путем вызова dlfeval на gradcam функция.

[convMap, dScoresdMap] = dlfeval(@gradcam, dlnet, dlImg, softmaxName, convLayerName, classfn);

Измените размер карты градиента к размеру изображения GoogLeNet и масштабируйте баллы к соответствующим уровням для отображения.

gradcamMap = sum(convMap .* 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 на веб-сайте Открытого доступа Основы Компьютерного зрения.

Смотрите также

| | |

Похожие темы