Давайте рассмотрим одну из атак на нейронные сети, которая приводит к ошибкам классификации при минимальном внешнем воздействии.
Представьте на минутку, что нейронная сеть — это вы.
И вот прямо сейчас, попивая чашечку ароматного кофе, вы классифицируете изображения кошек с точностью более 90 процентов, даже не подозревая, что «атака одного пикселя» превратила всех ваших «котов» в грузовики.
Теперь давайте сделаем паузу, отложим кофе в сторону, импортируем все необходимые нам библиотеки и посмотрим, как работают похожие однопиксельные атаки.
Цель этой атаки — заставить алгоритм (нейронную сеть) выдать неверный ответ. Ниже мы увидим это на примере нескольких различных моделей сверточных нейронных сетей.
Используя один из методов многомерной математической оптимизации — дифференциальную эволюцию, мы найдём специальный пиксель, способный изменить изображение так, что нейросеть начнёт неправильно классифицировать это изображение (несмотря на то, что алгоритм ранее «распознавал» это же изображение правильно) и с высокой точностью).
Импорт библиотек:
Для нашего эксперимента мы загрузим набор данных CIFAR-10, содержащий изображения реального мира, разделенные на 10 классов.# Python Libraries %matplotlib inline import pickle import numpy as np import pandas as pd import matplotlib from keras.datasets import cifar10 from keras import backend as K # Custom Networks from networks.lenet import LeNet from networks.pure_cnn import PureCnn from networks.network_in_network import NetworkInNetwork from networks.resnet import ResNet from networks.densenet import DenseNet from networks.wide_resnet import WideResNet from networks.capsnet import CapsNet # Helper functions from differential_evolution import differential_evolution import helper matplotlib.style.use('ggplot')
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
Давайте посмотрим на любое изображение по его индексу.
Например, эта лошадь.
image_id = 99 # Image index in the test set
helper.plot_image(x_test[image_id])
Нам придется искать тот самый мощный пиксель, способный изменить отклик нейронной сети, а это значит, что пришло время написать функцию для изменения одного или нескольких пикселей изображения.
def perturb_image(xs, img):
# If this function is passed just one perturbation vector,
# pack it in a list to keep the computation the same
if xs.ndim < 2:
xs = np.array([xs])
# Copy the image n == len(xs) times so that we can
# create n new perturbed images
tile = [len(xs)] + [1]*(xs.ndim+1)
imgs = np.tile(img, tile)
# Make sure to floor the members of xs as int types
xs = xs.astype(int)
for x,img in zip(xs, imgs):
# Split x into an array of 5-tuples (perturbation pixels)
# i.e., [[x,y,r,g,b], .
]
pixels = np.split(x, len(x) // 5)
for pixel in pixels:
# At each pixel's x,y position, assign its rgb value
x_pos, y_pos, *rgb = pixel
img[x_pos, y_pos] = rgb
return imgs
Давай проверим?! Давайте изменим один пиксель нашей лошади с координатами (16, 16) на желтый.
image_id = 99 # Image index in the test set
pixel = np.array([16, 16, 255, 255, 0]) # pixel = x,y,r,g,b
image_perturbed = perturb_image(pixel, x_test[image_id])[0]
helper.plot_image(image_perturbed)
Чтобы продемонстрировать атаку, вам необходимо загрузить предварительно обученные модели нейронных сетей в наш набор данных CIFAR-10. Мы будем использовать две модели: lenet и resnet, но вы можете использовать для своих экспериментов и другие, раскомментировав соответствующие строки кода.
lenet = LeNet()
resnet = ResNet()
models = [lenet, resnet]
После загрузки моделей нам необходимо оценить тестовые изображения каждой модели, чтобы убедиться, что мы атакуем только правильно классифицированные изображения.
Код ниже отображает точность и количество параметров каждой модели.
network_stats, correct_imgs = helper.evaluate_models(models, x_test, y_test)
correct_imgs = pd.DataFrame(correct_imgs, columns=['name', 'img', 'label', 'confidence', 'pred'])
network_stats = pd.DataFrame(network_stats, columns=['name', 'accuracy', 'param_count'])
network_stats
Evaluating lenet
Evaluating resnet
Out[11]:
Теги: #Машинное обучение #спуфинг #Алгоритмы #программирование #Читальный зал #искусственный интеллект #спуфинг-атаки #однопиксельная атака
-
Не Баг, А Особенность Вконтакте
19 Oct, 24 -
Выпущена Linux-Версия And Yet It Moves
19 Oct, 24 -
Мастер-Классы По Javascript
19 Oct, 24 -
Медиаспектакль «Нейроинтеграм»
19 Oct, 24