Исходный кот. Как заставить нейронную сеть ошибиться

Содержание статьи

Нейросети теперь повсюду, и распознавание объектов на картинках — это одно из самых популярных применений. Но что, если ты не хочешь, чтобы объекты на твоей картинке распознали? Или, например, хотел бы, чтобы нейросеть «увидела» что-то, что не увидит человек, глядя на ту же картинку? Для этого придуманы обманные методы, которые обращают нейросети против них самих. И благодаря готовым библиотекам пользоваться ими легче легкого.

Подопытная нейросеть

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

Код будем писать на Python 3 — для работы с нейросетями это фактически стандарт. На наше везение, модуль keras включает в себя заранее обученную модель, которую мы и используем.

Для начала установим все самые свежие библиотеки. В реестре pypi недостаточно моделей нейросетей, в отличие от репозитория на GitHub.

$ pip3 install -U git+https://github.com/keras-team/keras.git $ pip3 install -U git+https://github.com/keras-team/keras-applications.git

Теперь давай возьмем любое изображение и попробуем распознать его.

Исходный котИсходный кот

import numpy as np
from keras.preprocessing import image
from keras.applications import resnet_v2 ## Загружаем предобученную модель
model = resnet_v2.ResNet50V2(include_top=True, weights='imagenet', input_shape=(224, 224, 3)) ## Загружаем изображение
img = image.load_img("kitten.jpg#26759185", target_size=(224, 224))
input_image = image.img_to_array(img, 'channels_last') ## Перевод изображения из формата [0; 255] в [-1; 1]
input_image = (input_image / 255 - 0.5) * 2 ## Делаем из изображения массив с изображением (batch)
input_image = np.expand_dims(input_image, axis=0)
## Прогоним через нейронную сеть
predictions = model.predict(input_image) ## Переведем ответ нейронной сети (вектор) в категорию
predicted_classes = resnet_v2.decode_predictions(predictions, top=1)
imagenet_id, name, confidence = predicted_classes[0][0]
print("Я на {:.4}% уверен, что это - {}!".format(confidence * 100, name))

В результате программа скажет нам, что это кот.

$ python3 test.py Using TensorFlow backend.
Я на 99.51% уверен, что это - Persian_cat!

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

Принцип создания поддельного изображения

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

Математика такой атаки до неприличия проста: мы выворачиваем процесс обучения нейронной сети наизнанку. Вместо фиксированных входных данных (тренировочного датасета) и обучающейся сети тут мы имеем меняющиеся, «‎обучающиеся»‎ входные данные и фиксированную сеть.

Как и для обучения нейронной сети, нам нужно два параметра: функция потерь (способ подсчитать ошибку) и градиент (мы используем производную нейронной сети).

И градиент, и ошибку мы можем посчитать, используя алгоритм обратного распространения, просто приняв все веса нейронной сети правильными (и, соответственно, неизменными), а вход — ошибочным и подлежащим исправлению.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Читать новость в источнике Xakep

0