Исследуйте сетевые предсказания Используя отображение активации класса

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

Нейронные сети для глубокого обучения часто считаются "черными квадратами", которые не предлагают способа выяснить то, что изучила сеть или какая часть входа к сети была ответственна за предсказание сети. Когда эти модели приводят к сбою и дают неправильные предсказания, они часто перестали работать эффектно без любого предупреждения или объяснения. Активация класса, сопоставляющая [1], является одним методом, который можно использовать, чтобы получить визуальные объяснения предсказаний сверточных нейронных сетей. Неправильные, на вид неблагоразумные предсказания могут часто иметь разумные объяснения. Используя отображение активации класса, можно проверять, "перепутала" ли определенная часть входного изображения сеть и привела ее делать неправильное предсказание.

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

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

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

Загрузите предварительно обученную сверточную нейронную сеть для классификации изображений. SqueezeNet, GoogLeNet, ResNet-18 и MobileNet-v2 являются относительно быстрыми сетями. SqueezeNet является самой быстрой сетью, и ее карта активации класса имеет в четыре раза более высокое разрешение, чем карты других сетей. Вы не можете использовать отображение активации класса с сетями, которые имеют несколько полносвязных слоев в конце сети, таких как AlexNet, VGG-16 и VGG-19.

netName = "squeezenet";
сетевой = 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, который следует за последним сверточным слоем, уже является картой активации класса.

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

    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 палитра.

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.

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

| | | |

Похожие темы