В этом примере показано, как использовать подход 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 градиента [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
на веб-сайте Открытого доступа Основы Компьютерного зрения.
dlarray
| dlfeval
| dlgradient
| dlnetwork