В этом примере показано, как использовать карты чувствительности поглощения газов, чтобы изучить, почему глубокая нейронная сеть принимает решение классификации. Чувствительность поглощения газов является простым методом для понимания, какие части изображения являются самыми важными для классификации глубокой сети. Можно измерить чувствительность сети к поглощению газов в различных областях данных с помощью небольших возмущений данных. Используйте чувствительность поглощения газов, чтобы получить высокоуровневое понимание того, что изображение показывает сеть использование, чтобы сделать конкретной классификацией и обеспечить понимание причин, почему сеть может неправильно классифицировать изображение.
Deep Learning Toolbox обеспечивает occlusionSensitivity
функция, чтобы вычислить карты чувствительности поглощения газов для глубоких нейронных сетей, которые принимают входные параметры изображений. occlusionSensitivity
функция тревожит небольшие районы входа, заменяя его на маску закрытия, обычно серый квадрат. Маска преодолевает изображение, и изменение в счете вероятности к данному классу измеряется как функция положения маски. Можно использовать этот метод, чтобы подсветить, какие части изображения являются самыми важными для классификации: когда та часть изображения будет закрыта, счет вероятности к предсказанному классу упадет резко.
Загрузите предварительно обученную сеть GoogLeNet, которая будет использоваться для классификации изображений.
net = googlenet;
Извлеките входной размер изображений и выходные классы сети.
inputSize = net.Layers(1).InputSize(1:2); classes = net.Layers(end).Classes;
Загрузите изображение. Изображение имеет собаку по имени Лэйка. Измените размер изображения к сетевому входному размеру.
imgLaikaGrass = imread("laika_grass.jpg");
imgLaikaGrass = imresize(imgLaikaGrass,inputSize);
Классифицируйте изображение и отобразите эти три класса с самой высокой классификационной оценкой в заголовке изображений.
[YPred,scores] = classify(net,imgLaikaGrass); [~,topIdx] = maxk(scores, 3); topScores = scores(topIdx); topClasses = classes(topIdx); imshow(imgLaikaGrass) titleString = compose("%s (%.2f)",topClasses,topScores'); title(sprintf(join(titleString, "; ")));
Laika является крестом кокер-спаниеля пуделя. Эта порода не является классом в GoogLeNet, таким образом, сеть испытывает некоторые затруднения при классификации изображения. Сеть не очень уверена в своих предсказаниях — предсказанный класс miniature poodle
только имеет счет 23%. Класс со следующим самым высоким счетом является также типом пуделя, который является разумной классификацией. Сеть также определяет умеренную вероятность Tibetan terrier
класс. Мы можем использовать поглощение газов, чтобы понять, какие части изображения заставляют сеть предлагать эти три класса.
Можно использовать поглощение газов, чтобы узнать, какие части изображения важны для классификации. Во-первых, посмотрите на предсказанный класс miniature poodle
. Какие части изображения предлагают этот класс? Используйте функцию чувствительности поглощения газов, чтобы сопоставить изменение в классификационной оценке, когда части изображения будут закрыты.
map = occlusionSensitivity(net,imgLaikaGrass,YPred);
Отобразите изображение Laika с наложенной картой чувствительности поглощения газов.
imshow(imgLaikaGrass,'InitialMagnification', 150) hold on imagesc(map,'AlphaData',0.5) colormap jet colorbar title(sprintf("Occlusion sensitivity (%s)", ... YPred))
Карта поглощения газов показывает, какие части изображения имеют позитивный вклад к счету к miniature poodle
класс, и какие части имеют отрицательный вклад. Красные области карты имеют более высокое значение и являются доказательством для miniature poodle
класс — когда красные области затенены, счет к miniature poodle
понижается. В этом изображении голова Лэйки, спина и уши представляют самые сильные свидетельства для miniature poodle
класс.
Синими областями карты с нижними значениями являются части изображения, которые приводят к увеличению счета к miniature poodle
когда закрыто. Часто, эти области являются доказательством другого класса и могут перепутать сеть. В этом случае рот и участки Лэйки имеют отрицательный вклад в общую оценку для miniature poodle
.
Карта поглощения газов строго фокусируется на собаке в изображении, которое показывает, что GoogLeNet классифицирует правильный объект на изображение. Если ваша сеть не приведет к результатам, то вы ожидаете, карта поглощения газов может помочь вам понять почему. Например, если сеть строго фокусируется на других частях изображения, это предполагает, что сеть изучила неправильные функции.
Можно получить подобные результаты с помощью активации класса градиента, сопоставляющей (CAM градиента) метод. CAM градиента использует градиент классификационной оценки относительно последнего сверточного слоя в сети для того, чтобы понять, какие части изображения являются самыми важными для классификации. Для примера смотрите, что CAM градиента Показывает Почему Позади Решений Глубокого обучения.
Чувствительность поглощения газов и CAM градиента обычно возвращают качественно подобные результаты, несмотря на то, что они работают по-разному. Как правило, можно вычислить карту CAM градиента быстрее что карта поглощения газов, не настраивая параметров. Однако карта CAM градиента может обычно иметь более низкое пространственное разрешение, чем карта поглощения газов и может пропустить мелкие детали. Базовое разрешение CAM градиента является пространственным разрешением последней сверточной карты функции; в случае GoogleNet это - 7 7 пиксели. Чтобы получить лучшие результаты чувствительности поглощения газов, необходимо выбрать правильные значения для MaskSize
и Stride
опции. Эта настройка обеспечивает больше гибкости, чтобы исследовать входные функции в различных шкалах расстояний.
Можно использовать поглощение газов, чтобы выдержать сравнение, какие части изображения сеть идентифицирует как доказательство для различных классов. Это может быть полезно в случаях, где сеть не уверена в классификации и дает подобные баллы нескольким классам.
Вычислите карту поглощения газов для каждого из лучших трех классов. Чтобы исследовать результаты поглощения газов с более высоким разрешением, уменьшайте размер маски и шаг с помощью MaskSize
и Stride
опции. Меньший Stride
приводит к карте более высокого разрешения, но может занять больше времени, чтобы вычислить и использовать больше памяти. Меньший MaskSize
иллюстрирует меньшие детали, но может привести к более шумным результатам.
topClasses = classes(topIdx); topClassesMap = occlusionSensitivity(net, imgLaikaGrass, topClasses, ... "Stride", 10, ... "MaskSize", 15);
Постройте результаты для каждого из лучших трех классов.
for i=1:length(topIdx) figure imshow(imgLaikaGrass); hold on imagesc(topClassesMap(:,:,i), 'AlphaData', 0.5); colormap jet; classLabel = string(classes(topIdx(i))); title(sprintf("%s", classLabel)); end
Различные части изображения оказывают совсем другое влияние на музыку класса к различным породам собак. Спина собаки имеет сильное влияние в пользу miniature poodle
и toy poodle
классы, в то время как рот и уши способствуют Tibetan terrier
класс.
Если ваша сеть последовательно неправильно классифицирует определенные типы входных данных, можно использовать чувствительность поглощения газов, чтобы определить, сбивают ли конкретные функции входных данных с толку сеть. Из карты поглощения газов Laika, находящегося на траве, вы могли ожидать, что изображения Laika, которые более фокусируются на ее поверхности, вероятно, будут неправильно классифицированы как Tibetan terrier
. Можно проверить что дело обстоит так использование другого изображения Laika.
imgLaikaSit = imresize(imread("laika_sitting.jpg"),inputSize);
[YPred,scores] = classify(net,imgLaikaSit);
[score,idx] = max(scores);
YPred, score
YPred = categorical
Tibetan terrier
score = single
0.5668
Вычислите карту поглощения газов нового изображения.
map = occlusionSensitivity(net,imgLaikaSit,YPred); imshow(imgLaikaSit); hold on; imagesc(map, 'AlphaData', 0.5); colormap jet; title(sprintf("%s (%.2f)",... string(classes(idx)),score));
Снова, сеть строго сопоставляет нос собаки и рот с Tibetan terrier
класс. Это подсвечивает возможный тип отказа сети, поскольку она предполагает, что изображения поверхности Лэйки будут последовательно неправильно классифицироваться как Tibetan terrier
.
Можно использовать информацию, полученную от occlusionSensitivity
функция, чтобы убедиться ваша сеть фокусируется на правильных функциях входных данных. Причина проблемы классификации в этом примере состоит в том, что доступные классы GoogleNet не включают собак гибрида как Laika. Карта поглощения газов демонстрирует, почему сеть перепутана этими изображениями Laika. Важно быть уверенным, что сеть, которую вы используете, подходит для задачи под рукой.
В этом примере сеть по ошибке идентифицирует различные части объекта в изображении как различные классы. Одно решение этой проблемы состоит в том, чтобы переобучить сеть с большим количеством маркированных данных, которые покрывают более широкую область значений наблюдений за неправильно классифицированным классом. Например, сеть здесь могла быть переобучена с помощью большого количества изображений Laika, взятого под различными углами, так, чтобы это училось сопоставлять и спину и переднюю сторону собаки с правильным классом.
[1] Доктор медицины Zeiler, Фергус Р. (2014) Визуализация и Понимание Сверточных Сетей. \in: Флот D., Пэдждла Т., Шиле Б., Тейтелэарс Т. (редакторы) Компьютерное зрение – ECCV 2014. ECCV 2014. Читайте лекции Примечаниям в Информатике, vol 8689. Спрингер, Хан
googlenet
| occlusionSensitivity