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

Этот пример показывает, как использовать быстрый метод знака градиента (FGSM) и основной итерационный метод (BIM) для генерации состязательных примеров для предварительно обученной нейронной сети.

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

В этом примере вы создаете два типа состязательных примеров:

  • Untargeted - Измените изображение так, чтобы оно было неправильно классифицировано как любой неправильный класс.

  • Целевой - измените изображение так, чтобы оно было неправильно классифицировано как определенный класс.

Загрузка сети и изображения

Загрузите сеть, которая была обучена на наборе данных ImageNet [2], и преобразуйте ее в dlnetwork.

net = squeezenet;

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

Извлеките метки классов.

classes = categories(net.Layers(end).Classes);

Загрузите изображение, которое будет использоваться для генерации состязательного примера. Изображение представляет собой картинку золотого ретривера.

img = imread('sherlock.jpg');
T = "golden retriever";

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

inputSize = dlnet.Layers(1).InputSize;
img = imresize(img,inputSize(1:2));

figure
imshow(img)
title("Ground Truth: " + T)

Подготовьте изображение путем преобразования его в dlarray.

X = dlarray(single(img),"SSCB");

Подготовьте метку одним горячим кодированием.

T = onehotencode(T,1,'ClassNames',classes);
T = dlarray(single(T),"CB");

Неотключенный метод знака быстрого градиента

Создайте состязательный пример, используя неотключенный FGSM [3]. Этот метод вычисляет градиент XL(X,T) функции потерь L, относительно изображения X вы хотите найти состязательный пример для и метки класса T. Этот градиент описывает направление «толкать» изображение, чтобы увеличить вероятность того, что оно будет неправильно классифицировано. Затем можно добавить или вычесть небольшую ошибку из каждого пикселя, чтобы увеличить вероятность неправильной классификации изображения.

Состязательный пример вычисляется следующим образом:

Xadv=X+ϵ.sign(XL(X,T)).

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

Вычислите градиент изображения относительно класса golden retriever.

gradient = dlfeval(@untargetedGradients,dlnet,X,T);

Задайте epsilon 1 и сгенерировать состязательный пример.

epsilon = 1;
XAdv = X + epsilon*sign(gradient);

Предсказать класс оригинального изображения и состязательного изображения.

YPred = predict(dlnet,X);
YPred = onehotdecode(squeeze(YPred),classes,1)
YPred = categorical
     golden retriever 

YPredAdv = predict(dlnet,XAdv);
YPredAdv = onehotdecode(squeeze(YPredAdv),classes,1)
YPredAdv = categorical
     Labrador retriever 

Отобразите оригинальное изображение, возмущения, добавленные к изображению, и состязательное изображение. Если на epsilon значение достаточно велико, состязательное изображение имеет отличную от оригинального изображения метку класса.

showAdversarialImage(X,YPred,XAdv,YPredAdv,epsilon);

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

Целенаправленные состязательные примеры

Простое улучшение FGSM заключается в выполнении нескольких итераций. Этот подход известен как основной итерационный метод (BIM) [4] или проектируемый градиентный спуск [5]. Для BIM, размер возмущения управляется параметром α представление размера шага в каждой итерации. Это так, когда BIM обычно принимает много, меньших, шагов FGSM в направлении градиента. После каждой итерации зажимайте возмущение, чтобы убедиться, что величина не превышает ϵ. Этот способ может привести к состязательным примерам с меньшими искажениями, чем FGSM.

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

Сгенерируйте целевой состязательный пример, используя BIM и целевой класс большой белой акулы.

targetClass = "great white shark";
targetClass = onehotencode(targetClass,1,'ClassNames',classes);

Увеличьте epsilon значение 5, установите размер шага alpha до 0,2 и выполните 25 итераций. Обратите внимание, что, возможно, вам придется настроить эти параметры для других сетей.

epsilon = 5;
alpha = 0.2;
numIterations = 25;

Отслеживайте возмущения и зажимайте все значения, которые превышают epsilon.

delta = zeros(size(X),'like',X);
for i = 1:numIterations
    gradient = dlfeval(@targetedGradients,dlnet,X+delta,targetClass);
    
    delta = delta - alpha*sign(gradient);
    delta(delta > epsilon) = epsilon;
    delta(delta < -epsilon) = -epsilon;
end

XAdvTarget = X + delta;

Предсказать класс целевого состязательного примера.

YPredAdvTarget = predict(dlnet,XAdvTarget);
YPredAdvTarget = onehotdecode(squeeze(YPredAdvTarget),classes,1)
YPredAdvTarget = categorical
     great white shark 

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

showAdversarialImage(X,YPred,XAdvTarget,YPredAdvTarget,epsilon);

Из-за незаметных возмущений сеть классифицирует состязательное изображение как большую белую акулу.

Чтобы сделать сеть более устойчивой против состязательных примеров, можно использовать состязательное обучение. Для примера, показывающего, как обучить сеть, устойчивую к состязательным примерам, смотрите Train Image Classification Network Robust to Conversarial Examples.

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

Неотключенная входная градиентная функция

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

function gradient = untargetedGradients(dlnet,X,target)

Y = predict(dlnet,X);
Y = stripdims(squeeze(Y));
loss = crossentropy(Y,target,'DataFormat','CB');
gradient = dlgradient(loss,X);

end

Целевая входная градиентная функция

Вычислите градиент, используемый для создания целевого состязательного примера. Этот градиент является градиентом средней квадратичной невязки.

function gradient = targetedGradients(dlnet,X,target)

Y = predict(dlnet,X);
Y = stripdims(squeeze(Y));
loss = mse(Y,target,'DataFormat','CB');
gradient = dlgradient(loss,X);

end

Показать состязательное изображение

Покажите изображение, соответствующее состязательное изображение и различие между ними (возмущение).

function showAdversarialImage(image,label,imageAdv,labelAdv,epsilon)

figure
subplot(1,3,1)
imgTrue = uint8(extractdata(image));
imshow(imgTrue)
title("Original Image" + newline + "Class: " + string(label))

subplot(1,3,2)
perturbation = uint8(extractdata(imageAdv-image+127.5));
imshow(perturbation)
title("Perturbation")

subplot(1,3,3)
advImg = uint8(extractdata(imageAdv));
imshow(advImg)
title("Adversarial Image (Epsilon = " + string(epsilon) + ")" + newline + ...
    "Class: " + string(labelAdv))
end

Ссылки

[1] Гудфеллоу, Ян Дж., Джонатон Шленс и Кристиан Сегеди. «Объяснение и использование состязательных примеров». Препринт, представленный 20 марта 2015 года. https://arxiv.org/abs/1412.6572.

[2] ImageNet. http://www.image-net.org.

[3] Сегеди, Кристиан, Войцех Заремба, Илья Суцкевер, Жоан Бруна, Думитру Эрхан, Иан Гудфеллоу и Роб Фергус. «Интригующие свойства нейронных сетей». Препринт, представленный 19 февраля 2014 года. https://arxiv.org/abs/1312.6199.

[4] Куракин, Алексей, Ян Гудфеллоу и Сами Бенгио. «Состязательные примеры в физическом мире». Препринт, представленный 10 февраля 2017 года. https://arxiv.org/abs/1607.02533.

[5] Мадри, Александер, Александар Макелов, Людвиг Шмидт, Димитрис Ципрас, и Адриан Владу. «К моделям глубокого обучения, устойчивым к состязательным атакам». Препринт, представленный 4 сентября 2019 года. https://arxiv.org/abs/1706.06083.

См. также

| | | | |

Похожие темы