В этом примере показано, как использовать сопоставление активации класса (CAM) для исследования и объяснения прогнозов глубокой сверточной нейронной сети для классификации изображений.
Сети глубокого обучения часто считаются «черными ящиками», которые не дают возможности выяснить, чему научилась сеть или какая часть входных данных сети отвечала за предсказание сети. Когда эти модели отказывают и дают неверные прогнозы, они часто отказывают эффектно без какого-либо предупреждения или объяснения. Отображение активации класса [1] - это один из методов, который можно использовать для получения визуальных объяснений предсказаний сверточных нейронных сетей. Ошибочные, казалось бы, необоснованные прогнозы часто могут иметь разумные объяснения. С помощью сопоставления активации класса можно проверить, «запутала» ли сеть определенная часть входного изображения и привела ли она к неправильному прогнозу.
Сопоставление активации класса можно использовать для определения смещения в обучающем наборе и повышения точности модели. Если вы обнаружите, что предсказания сети основаны на неправильных функциях, вы можете сделать сеть более надежной, собрав более качественные данные. Например, предположим, что вы обучаете сеть различать изображения кошек и собак. Сеть имеет высокую точность на тренировочном наборе, но плохо работает на реальных примерах. Используя сопоставление активации класса на обучающих примерах, вы обнаруживаете, что сеть основывает прогнозы не на кошках и собаках на изображениях, а на фонах. Затем вы понимаете, что все ваши фотографии кошек имеют красный фон, все ваши фотографии собак имеют зеленый фон, и что это цвет фона, который сеть узнала во время тренировки. Затем можно собрать новые данные, которые не имеют этого смещения.
В этом примере карта активации класса показывает, какие области входного изображения вносят наибольший вклад в прогнозируемый класс mouse. Красные регионы вносят наибольший вклад.
Загрузить предварительно обученную сверточную нейронную сеть для классификации изображений. SqueeeNet, GoogLeNet, ResNet-18 и MobileNet-v2 являются относительно быстрыми сетями. SqueeeNet является самой быстрой сетью, и его карта активации класса имеет в четыре раза более высокое разрешение, чем карты других сетей. Нельзя использовать сопоставление активации класса с сетями, имеющими несколько полностью соединенных уровней в конце сети, такими как AlexNet, VGG-16 и VGG-19.
netName =
"squeezenet";
net = eval(netName);Создать webcam объект и подключение к веб-камере.
camera = webcam;
Извлеките размер входного изображения и классы вывода сети. activationLayerName вспомогательная функция, определенная в конце этого примера, возвращает имя слоя, из которого извлекаются активации. Этот уровень является уровнем ReLU, который следует за последним сверточным уровнем сети.
inputSize = net.Layers(1).InputSize(1:2); classes = net.Layers(end).Classes; layerName = activationLayerName(netName);
Создайте фигуру и выполните сопоставление активации класса в цикле. Чтобы завершить выполнение цикла, закройте рисунок.
h = figure('Units','normalized','Position',[0.05 0.05 0.9 0.8],'Visible','on'); while ishandle(h)
Сделайте снимок с помощью веб-камеры. Измените размер изображения таким образом, чтобы длина его самой короткой стороны (в данном случае высота изображения) равнялась размеру входного изображения сети. При изменении размера сохраните пропорции изображения. Можно также изменить размер изображения до большего или меньшего размера. Увеличение изображения увеличивает разрешение конечной карты активации класса, но может привести к менее точным общим прогнозам.
Вычислите активации изображения с измененным размером на уровне ReLU, который следует за последним сверточным уровнем сети.
im = snapshot(camera);
imResized = imresize(im,[inputSize(1), NaN]);
imageActivations = activations(net,imResized,layerName);Карта активации класса для определенного класса - это карта активации уровня ReLU, которая следует за конечным сверточным уровнем, взвешенная по тому, насколько каждая активация вносит вклад в окончательный балл этого класса. Эти веса равны весам конечного полностью подключенного уровня сети для этого класса. SqueeENet не имеет конечного полностью подключенного уровня. Вместо этого выход уровня ReLU, который следует за последним сверточным уровнем, уже является картой активации класса.
Можно создать карту активации класса для любого выходного класса. Например, если сеть делает неправильную классификацию, можно сравнить карты активации классов для истинных и прогнозируемых классов. В этом примере создайте карту активации класса для прогнозируемого класса с наивысшим баллом.
scores = squeeze(mean(imageActivations,[1 2]));
if netName ~= "squeezenet"
fcWeights = net.Layers(end-2).Weights;
fcBias = net.Layers(end-2).Bias;
scores = fcWeights*scores + fcBias;
[~,classIds] = maxk(scores,3);
weightVector = shiftdim(fcWeights(classIds(1),:),-1);
classActivationMap = sum(imageActivations.*weightVector,3);
else
[~,classIds] = maxk(scores,3);
classActivationMap = imageActivations(:,:,classIds(1));
end
Вычислите метки верхнего класса и окончательные нормализованные оценки класса.
scores = exp(scores)/sum(exp(scores));
maxScores = scores(classIds);
labels = classes(classIds);Постройте график активации класса. Отображение исходного изображения в первом вложенном графике. Во втором вложенном графике используйте CAMshow вспомогательная функция, определенная в конце этого примера, для отображения карты активации класса поверх затемненной версии исходного изображения в градациях серого. Отображение трех лучших прогнозируемых меток с их прогнозируемыми показателями.
subplot(1,2,1)
imshow(im)
subplot(1,2,2)
CAMshow(im,classActivationMap)
title(string(labels) + ", " + string(maxScores));
drawnow
endОчистить объект веб-камеры.
clear cameraСеть правильно идентифицирует объект на этом изображении как бездельник (тип обуви). Карта активации класса в изображении справа показывает вклад каждой области входного изображения в прогнозируемый класс Loafer. Красные регионы вносят наибольший вклад. Сеть основывает свою классификацию на всей обуви, но самый сильный ввод поступает из красных областей - то есть наконечника и проема обуви.

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

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

CAMshow(im,CAM) накладывает карту активации класса CAM на затемненной версии изображения в градациях серого im. Функция изменяет размер карты активации класса на размер im, нормализует его, устанавливает пороги снизу и визуализирует с помощью jet colormap.
function CAMshow(im,CAM) imSize = size(im); CAM = imresize(CAM,imSize(1:2)); CAM = normalizeImage(CAM); CAM(CAM<0.2) = 0; cmap = jet(255).*linspace(0,1,255)'; CAM = ind2rgb(uint8(CAM*255),cmap)*255; combinedImage = double(rgb2gray(im))/2 + CAM; combinedImage = normalizeImage(combinedImage)*255; imshow(uint8(combinedImage)); end function N = normalizeImage(I) minimum = min(I(:)); maximum = max(I(:)); N = (I-minimum)/(maximum-minimum); end function layerName = activationLayerName(netName) if netName == "squeezenet" layerName = 'relu_conv10'; elseif netName == "googlenet" layerName = 'inception_5b-output'; elseif netName == "resnet18" layerName = 'res5b_relu'; elseif netName == "mobilenetv2" layerName = 'out_relu'; end end
[1] Чжоу, Болэй, Адитья Хосла, Агата Лапедриса, Од Олива и Антонио Торральба. «Изучение глубоких возможностей для дискриминативной локализации». В материалах Конференции IEEE по компьютерному зрению и распознаванию образов, стр. 2921-2929. 2016.
activations | gradCAM | imageLIME | occlusionSensitivity | squeezenet