Этот пример показывает, как использовать отображение активации класса (CAM), чтобы исследовать и объяснить прогнозы глубокой сверточной нейронной сети для классификации изображений.
Нейронные сети для глубокого обучения часто считаются "черными квадратами", которые не предлагают способа выяснить то, что изучила сеть или какая часть входа к сети была ответственна за прогноз сети. Когда эти модели приводят к сбою и дают неправильные прогнозы, они часто перестали работать эффектно без любого предупреждения или объяснения. Активация класса, сопоставляющая [1], является одним методом, который можно использовать, чтобы получить визуальные объяснения прогнозов сверточных нейронных сетей. Неправильные, на вид неблагоразумные прогнозы могут часто иметь разумные объяснения. Используя отображение активации класса, можно проверять, "перепутала" ли определенная часть входного изображения сеть и привела ее делать неправильный прогноз.
Можно использовать отображение активации класса, чтобы идентифицировать смещение в наборе обучающих данных и точности модели увеличения. Если вы обнаруживаете, что сеть основывает прогнозы на неправильных функциях, то можно сделать сеть более устойчивой путем сбора лучших данных. Например, предположите, что вы обучаете сеть, чтобы отличить изображения кошек и собак. Сеть имеет высокую точность на наборе обучающих данных, но выполняет плохо на реальных примерах. При помощи отображения активации класса на учебных примерах вы обнаруживаете, что сеть основывает прогнозы не на кошках и собаках в изображениях, а на фонах. Вы затем понимаете, что все ваши изображения кошки имеют красные фоны, все ваши изображения собаки имеют зеленые фоны, и что это - цвет фона что сеть, изученная во время обучения. Можно затем собрать новые данные, которые не имеют этого смещения.
Эта карта активации класса в качестве примера показывает, какие области входного изображения способствуют больше всего предсказанному классу mouse
. Красные области способствуют больше всего.
Загрузите предварительно обученную сверточную нейронную сеть для классификации изображений. SqueezeNet, GoogLeNet, ResNet-18 и MobileNet-v2 являются относительно быстрыми сетями. SqueezeNet является самой быстрой сетью, и ее карта активации класса имеет в четыре раза более высокое разрешение, чем карты других сетей. Вы не можете использовать отображение активации класса с сетями, которые имеют несколько полносвязных слоев в конце сети, таких как 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, который следует за итоговым сверточным слоем, взвешенным тем, сколько каждая активация вносит в итоговый счет того класса. Те веса равняются весам итогового полносвязного слоя сети для того класса. SqueezeNet не имеет итогового полносвязного слоя. Вместо этого вывод слоя ReLU, который следует за последним сверточным слоем, уже является картой активации класса.
Вы можете genereate карта активации класса для любого выходного класса. Например, если сеть делает неправильную классификацию, можно сравнить карты активации класса для истинных и предсказанных классов. В данном примере сгенерируйте карту активации класса для предсказанного класса с самым высоким счетом.
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
. Красные области способствуют больше всего. Сеть основывает свой classifaction на целой обуви, но самый сильный вход прибывает из красных областей – то есть, совет и открытие обуви.
Сеть классифицирует это изображение как мышь. Когда карта активации класса показывает, прогноз базируется не только на мыши в изображении, но также и клавиатуре. Поскольку набор обучающих данных, вероятно, имеет много изображений мышей рядом с клавиатурами, сеть предсказывает, что отображает содержащий клавиатуры, более вероятно, будут содержать мышей.
Сеть классифицирует это изображение кофейной чашки как застежка. Когда карта активации класса показывает, сеть неправильно классифицирует изображение, потому что изображение содержит слишком много объектов соединения. Сеть обнаруживает и фокусируется на браслете часов, не кофейной чашке.
CAMshow(im,CAM)
накладывает карту активации класса CAM
на затемненной, полутоновой версии изображения im
. Функция изменяет размер карты активации класса к размеру im
, нормирует его, пороги это снизу, и визуализирует его с помощью палитры jet
.
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] Чжоу, Bolei, Aditya Khosla, Агата Лапедриса, Од Олива и Антонио Торрэлба. "Изучение глубоко показывает для отличительной локализации". В Продолжениях Конференции по IEEE по Компьютерному зрению и Распознаванию образов, стр 2921-2929. 2016.