Исследуйте решения классификации с помощью методов атрибуции градиента

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

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

Доступна область значений методов визуализации, чтобы определить, использует ли сеть разумные части входных данных, чтобы принять решение о классификации. Как и методы атрибуции градиента, показанные в этом примере, можно использовать такие методы, как отображение активации класса с взвешиванием градиента (Grad-CAM) и чувствительность к окклюзии. Для примеров см.

Методы атрибуции градиента, исследованные в этом примере, обеспечивают карты разрешения пикселей, которые показывают, какие пиксели наиболее важны для классификации сети. Они вычисляют градиент счета класса относительно входа пикселей. Интуитивно, карта показывает, какие пиксели больше всего влияют на счет класса при изменении. Методы градиентной атрибуции производят карты с более высоким разрешением, чем от Grad-CAM или чувствительности к окклюзии, но это, как правило, намного шумнее, поскольку хорошо обученная глубокая сеть не сильно зависит от точного значения конкретных пикселей. Используйте методы атрибуции градиента, чтобы найти широкие области изображения, которые важны для классификации.

Самая простая карта атрибутов градиента является градиентом счета класса для предсказанного класса относительно каждого пикселя в вход изображении [1]. Это показывает, какие пиксели оказывают наибольшее влияние на счет класса, и, следовательно, какие пиксели являются наиболее важными для классификации. В этом примере показано, как использовать атрибуцию градиента и два расширенных метода: направленное обратное распространение [2] и интегрированные градиенты [3]. Использование этих методов находится в стадии обсуждения, поскольку не ясно, какую информацию эти расширения могут дать в модели [4].

Загрузка предварительно обученной сети и изображения

Загрузите предварительно обученную сеть GoogLeNet.

net = googlenet;

Извлеките изображение входа размера и выхода классов сети.

inputSize = net.Layers(1).InputSize(1:2);
classes = net.Layers(end).Classes;

Загрузите изображение. Изображение - собака по имени Лайка. Измените размер изображения на размер входа сети.

img = imread("laika_grass.jpg");
img = imresize(img,inputSize);

Классификация изображения и отображение предсказанных класса и классификационной оценки.

[YPred, scores] = classify(net, img);
[score, classIdx] = max(scores);

predClass = classes(classIdx);

imshow(img);
title(sprintf("%s (%.2f)",string(predClass),score));

Сеть классифицирует Лайку как миниатюрный пудель, что является разумной догадкой. Она пудель/кокер спаниель крест.

Вычислите карту атрибутов градиента с помощью автоматической дифференциации

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

Wxyc=ScIxy

где Wxyc представляет важность пикселя в местоположении (x,y) к предсказанию класса c, Sc является счет softmax для этого класса, и Ixy - изображение в пиксельном местоположении (x,y) [1].

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

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

dlnet = dlnetwork(lgraph);

Укажите имя слоя softmax, 'prob'.

softmaxName = 'prob';

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

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

Использование dlfeval и gradientMap функция (определенная в разделе Вспомогательные функции этого примера) для вычисления производной ScIxy . The gradientMap функция передает изображение вперед через сеть, чтобы получить счета классов и содержит вызов на dlgradient для оценки градиентов счетов относительно изображения.

dydI = dlfeval(@gradientMap,dlnet,dlImg,softmaxName,classIdx);

Карта атрибутов dydI массив 227 на 227 на 3. Каждый элемент в каждом канале соответствует градиенту счета класса относительно входа изображения для этого канала исходного изображения RGB.

Существует ряд способов визуализировать эту карту. Прямое построение карты атрибуции градиента в виде изображения RGB может быть неясным, поскольку карта обычно довольно шумная. Вместо этого суммируйте абсолютные значения каждого пикселя по размерности канала, затем перерассчитайте между 0 и 1. Отобразите карту атрибутов градиента с помощью пользовательской палитры с 255 цветами, которая отображает значения 0 к белому и 1 к черному.

map = sum(abs(extractdata(dydI)),3);
map = rescale(map);

cmap = [linspace(1,0,255)' linspace(1,0,255)' linspace(1,0,255)'];

imshow(map, "Colormap", cmap);
title("Gradient Attribution Map (" + string(predClass) + ")");

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

Уточните карту атрибутов градиента с помощью управляемого обратного распространения

Можно получить более резкую карту атрибутов градиента путем изменения обратного прохода сети через слои ReLU так, чтобы элементы градиента, которые меньше нуля, и элементы входа в слой ReLU, которые меньше нуля, были установлены в ноль. Это известно как управляемое обратное распространение [2].

Управляемая обратная реализация обратная функция является:

dLdZ=(X>0)*(dLdZ>0)*dLdZ

где L это потеря, X является входом в слой ReLU, и Z - выход.

Можно записать пользовательский слой с нестандартным проходом назад и использовать его с автоматической дифференциацией. Пользовательский класс слоя CustomBackpropReluLayer который реализует эту модификацию, включен в качестве вспомогательного файла в этот пример. Когда автоматическая дифференциация преобразуется в CustomBackpropReluLayer объекты, он использует измененную функцию управляемого обратного распространения, заданную в пользовательском слое.

Используйте вспомогательную функцию replaceLayersofType (определено в разделе Вспомогательные функции этого примера), чтобы заменить все образцы reluLayer в сети с образцами CustomBackpropReluLayer. Установите BackpropMode свойство каждого CustomBackpropReluLayer на "guided-backprop".

customRelu = CustomBackpropReluLayer();
customRelu.BackpropMode = "guided-backprop";

lgraphGB = replaceLayersOfType(lgraph, ...
    "nnet.cnn.layer.ReLULayer",customRelu);

Преобразуйте график слоев, содержащий CustomBackpropReluLayers в dlnetwork.

dlnetGB = dlnetwork(lgraphGB);

Вычислите и постройте карту атрибутов градиента для сети с помощью управляемого обратного распространения.

dydIGB = dlfeval(@gradientMap,dlnetGB,dlImg,softmaxName,classIdx);

mapGB = sum(abs(extractdata(dydIGB)),3);
mapGB = rescale(mapGB);

imshow(mapGB, "Colormap", cmap);
title("Guided Backpropagation (" + string(predClass) + ")");

Можно увидеть, что метод управляемого обратного распространения более четко подсвечивает различные части собаки, такие как глаза и нос.

Можно также использовать метод Zeiler-Fergus для обратного распространения через слои ReLU [5]. Для метода Цейлера-Фергуса обратная функция задается как:

dLdZ=(dLdZ>0)*dLdZ

Установите BackpropMode свойство CustomBackpropReluLayer образцы в "zeiler-fergus".

customReluZF = CustomBackpropReluLayer();
customReluZF.BackpropMode = "zeiler-fergus";

lgraphZF = replaceLayersOfType(lgraph, ...
    "nnet.cnn.layer.ReLULayer",customReluZF);

dlnetZF = dlnetwork(lgraphZF);

dydIZF = dlfeval(@gradientMap,dlnetZF,dlImg,softmaxName,classIdx);


mapZF = sum(abs(extractdata(dydIZF)),3);
mapZF = rescale(mapZF);

imshow(mapZF,"Colormap", cmap);
title("Zeiler-Fergus (" + string(predClass) + ")");

Карты атрибуции градиента, вычисленные с помощью метода обратного распространения Цейлера-Фергуса, намного менее ясны, чем те, которые вычисляются с помощью управляемого обратного распространения.

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

Интегрированный подход к градиентам интегрирует градиенты счета классов относительно пикселей изображения через набор изображений, которые линейно интерполированы между базовым изображением и оригинальным изображением интереса [3]. Метод интегрированных градиентов разработан так, чтобы быть чувствительным к изменениям в значении пикселя во время интегрирования, так что, если изменение значения пикселя влияет на счет класса, этот пиксель имеет ненулевое значение в карте. Нелинейности в сети, такие как слои ReLU, могут предотвратить эту чувствительность в более простых методах градиентной атрибуции.

Интегрированная карта атрибутов градиентов вычисляется как

Wxyc=(Ixy-Ixy0)α=01dαSc(Ixy(α))Ixy(α),

где Wxyc - значение карты для класса c в пиксельном местоположении (x,y), Ixy0 является базовым изображением, и Ixy(α) - изображение на расстоянии α вдоль пути между базовым изображением и входом изображением:

Ixy(α)=Ixy0+α(Ixy-Ixy0).

В этом примере интегрированная формула градиентов упрощается путем суммирования по дискретному индексу,n, вместо интеграции через α:

Wxyc=(Ixy-Ixy0)n=0NSc(Ixyn)Ixyn,

с

Ixyn=Ixy0+nN(Ixy-Ixy0).

Для данных изображения выберите базовое изображение, которое будет черным изображением нулей. Найдите изображение, которое является различием между оригинальным изображением и базовым изображением. В этом случае differenceImg совпадает с оригинальным изображением, поскольку базовое изображение равняется нулю.

baselineImg = zeros([inputSize, 3]);
differenceImg = single(img) - baselineImg;

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

numPathImages = 25;

pathImgs = нули ([inputSize 3 numPathImages-1]);
for n = 0: numPathImages-1
    pathImgs (:,:,:, n + 1) = baselineImg + (n )/( numPathImages-1) * differenceImg;
end

рисунок;
imshow (imtile (rescale (pathImgs)));
заголовок ("Images Along Integration Path");

Преобразуйте мини-пакет изображений пути в dlarray. Форматируйте данные в формате 'SSCB' для двух пространственных, одного канала и одной пакетной размерности. Каждое изображение пути является одним наблюдением в мини-пакете. Вычислите градиентную карту для полученного пакета изображений вдоль пути.

dlPathImgs = dlarray(pathImgs, 'SSCB');
dydIIG = dlfeval(@gradientMap, dlnet, dlPathImgs, softmaxName, classIdx);

Для каждого канала суммируйте градиенты всех наблюдений в мини-пакете.

dydIIGSum = sum(dydIIG,4);

Умножьте каждый элемент суммированных карт атрибутов градиента с соответствующим элементом differenceImg. Чтобы вычислить интегрированную карту атрибутов градиента, суммируйте по каждому каналу и перерассчитайте.

dydIIGSum = differenceImg .* dydIIGSum;

mapIG = sum(extractdata(abs(dydIIGSum)),3);
mapIG = rescale(mapIG);

imshow(mapIG, "Colormap", cmap);
title("Integrated Gradients (" + string(predClass) + ")");

На вычисленной карте показано, что сеть более сильно сосредоточена на лице собаки как средстве принятия решения о ее классе.

Методы атрибуции градиента, продемонстрированные здесь, могут использоваться, чтобы проверить, фокусируется ли ваша сеть на ожидаемых частях изображения при составлении классификации. Чтобы получить хорошее представление о том, как ваша модель работает, и объяснить решения классификации, вы можете выполнить эти методы на области значений изображений и найти конкретные функции, которые сильно способствуют конкретному классу. Метод немодифицированных градиентных атрибутов, вероятно, будет более надежным методом объяснения сетевых решений. Несмотря на то, что управляемые методы обратного распространения и интегрированные градиентные методы могут создать самые четкие градиентные карты, неясно, сколько понимания эти методы могут дать в том, как модель работает [4].

Вспомогательные функции

Функция градиентной карты

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

function dydI = gradientMap(dlnet, dlImgs, softmaxName, classIdx)
% Compute the gradient of a class score with respect to one or more input
% images.

dydI = dlarray(zeros(size(dlImgs)));

for i=1:size(dlImgs,4)
    I = dlImgs(:,:,:,i);
    scores = predict(dlnet,I,'Outputs',{softmaxName});
    classScore = scores(classIdx);
    dydI(:,:,:,i) = dlgradient(classScore,I);
end
end

Замена функции слоев

The replaceLayersOfType функция заменяет все слои заданного класса образцами нового слоя. Новые слои имеют имена, совпадающие с именами исходных слоев. В этом примере функция replaceLayersOfType введено в раздел "Заточка карты атрибутов градиента" с помощью управляемого обратного распространения ".

function lgraph = replaceLayersOfType(lgraph, layerType, newLayer)
% Replace layers in the layerGraph lgraph of the type specified by
% layerType with copies of the layer newLayer.

for i=1:length(lgraph.Layers)
    if isa(lgraph.Layers(i), layerType)
        % Match names between old and new layer.
        layerName = lgraph.Layers(i).Name;
        newLayer.Name = layerName;
        
        lgraph = replaceLayer(lgraph, layerName, newLayer);
    end
end
end

Ссылки

[1] Симоньян, Карен, Андреа Ведальди и Эндрю Циссерман. Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps (неопр.) (недоступная ссылка). ArXiv:1312.6034 [Cs], 19 апреля 2014 года. http://arxiv.org/abs/1312.6034.

[2] Спрингенберг, Йост Тобиас, Алексей Досовицкий, Томас Брокс и Мартин Ридмиллер. «Стремление к простоте: вся сверточная сеть». ArXiv:1412.6806 [Cs], 13 апреля 2015 года. http://arxiv.org/abs/1412.6806.

[3] Sundararajan, Mukund, Ankur Taly, and Qiqi Yan. «Аксиоматическая атрибуция для глубоких сетей». Материалы 34-й Международной конференции по машинному обучению (PMLR) 70 (2017): 3319-3328

[4] Adebayo, Julius, Justin Gilmer, Michael Muelly, Ian Goodfellow, Moritz Hardt, and Been Kim. «Проверки работоспособности для карт работоспособности». ArXiv:1810.03292 [Cs, Stat], 27 октября 2018 года. http://arxiv.org/abs/1810.03292.

[5] Цейлер, Мэтью Д. и Роб Фергус. Визуализация и понимание сверточных сетей. В Компьютерное Зрение - ECCV 2014. Лекции по информатике 8689 под редакцией Д. Флита, Т. Пайдлы, Б. Шиле, Т. Туйтелаарса. Спрингер, Чэм, 2014.

См. также

| | | | | | |

Похожие темы