持续创作,加速成长!这是我参与「日新计划 6 月更文挑战」的第16天,点击查看活动详情
0. 前言
为了了解如何对图像进行对抗攻击,我们首先回顾如何使用深度学习模型进行常规预测,然后我们将研究如何调整输入图像,以使深度学习模型对图像输出完全不同的类别,即使修改后梯度下降的图像在人眼看来与原始图像并无差别。
1. 对抗攻击简介
1.1appear 模型识别图像流程
让我们来看一可视化个示例,在该示例中我们梯度下降法原理将尝试识别图像中对象的类:
- 使用训练完成的深度学习模型预测红狐图片
- 对输入图像进行预处理,以便可以将其传递到
Inception
网络appear中 - 导入预训练的
Inception v3
模型 - 使用
Inception
模型预测图像类别 - 图像可视化工具将被预测为红狐
- 对输入图像进行预处理,以便可以将其传递到
1.2 对抗攻击流程
接下来,我们的任务是修改图像,使其满足可视化数据图表以下两个目标:
- 使用同一网络对修改后的图像进行可视化分析预测,令模型预测结果改变为山猫
- 修改后的图像在人类看来没有区别
为了达到以上目标,我们制定以下策略appointment:
- 定义损失函数:
- 损失值是红狐图像属于山猫类别的概率
- 损失值越大,表可视化分析明我们越接近欺骗神经网络输出错初始化电脑时出现问题未进行更改误结果的目标
- 因此,我们将最大化损失函数
- 计算相对于输入变化的损失可视化工具变化梯度:
- 此步骤有助于了解将输出移向我们目标的输入像素
- 根据计算出的梯度来更新输入图像:
- 确保原始图像中初始化游戏启动器失败的像素值与最终图像中的像素值相差不超过
3
- 这样可以确保生成的图像与原始图像在人眼看来几乎没有差别
- 确保原始图像中初始化游戏启动器失败的像素值与最终图像中的像素值相差不超过
- 重复以上步骤,直到模型以至少
0.8
的置信度将修改后初始化sdk什么意思的图可视化是什么意思像预测为山猫
2. 使用 Keras 实现对抗攻击
在本节中,我们使用 Keras
实现上述策略,生成对抗样本。
读取红狐图片的图像:
import matplotlib.pyplot as plt
import cv2
import numpy as np
from keras import backend as K
img = cv2.imread('5.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
图像的可视化结果如下所示:
预处理图像,以便可以将其可视化音乐软件传递到 Inception
网络:
img = cv2.resize(img, (299,299))
# 将图像像素值归一化至[-1,1]
original_image = img.astype('float')/255
original_image -= 0.5
original_image *= 2.
# 维度扩展
original_image = np.expand_dims(original_image, axis=0)
导入预训练的模型,并使用此模型预测图像中对象的类别:
from keras.preprocessing import image
from keras.applications import inception_v3
model = inception_v3.InceptionV3()
predictions = model.predict(original_image)
predicted_classes = inception_v3.decode_predictions(predictions, top=1)
imagnet_id, name, confidence = predicted_classes[0][0]
print("This is a {} with {:.4}% confidence".format(name, confidence * 100))
模型对于输入的图像,输出的预测结果如下,看以看到模型可以以很高的置信度得到正确的结果:
This is a red_fox with 92.09% confidence
接下来,为对抗攻击模型定义输入和输出:
model_input_layer = model.layers[0].input
model_output_layer = model.layers[-1].output
model_input_layer
是模型的输入,而 model_output_layer
(具有 s初始化英文oftmax
激活函数的最后一层)是输入图像属于各种类别的概率。
设置原始图像的修可视化分析改限制(即图片最可视化分析大变化阈值),指初始化是什么意思定了可视化音乐软件修改原approve始图像应遵照的限制:
max_change_above = np.copy(original_image) + 0.01
max_change_below = np.copy(original_image) - 0.01
adversarial_sample = np.copy(original_image)
初始化损失函数,以便模型将修改后图像预测为山猫(模型输出预测向量中的第 283
个索引值):
learning_rate = 0.1
prob_cat = []
# 山猫
object_type_to_fake = 283
cost_function = model_output_layer[0, object_type_to_fake]
model_output_layer
的输出是图像的各种类别的概率。在本例中,我们指定损失函数由我们要伪造对象类别的索引位置决定。
初始化损失相对于输入的梯度函数:
gradient_function = K.gradients(cost_function, model_input_layer)[0]
此代码计算 cost_function
相对于 model_input_layer
(输入图像)的梯度变化。
定义输入与损失和梯度变化初始化的映射函数,计算 cost_function
值(即approach该图像属于山猫类别的概率)和相对于输入图像的梯度信息:
grab_cost_and_gradients_from_model = K.function([model_input_layer], [cost_function, gradient_function])
使用梯度信息不断更新输入图像,直到模型以至少 0.8
的置信度将修改后的图像预测为山猫:
cost = 0.0
while cost < 0.80:
cost, gradients = grab_cost_and_gradients_from_model([adversarial_sample, 0])
adversarial_sample += gradients * learning_rate
adversarial_sample = np.clip(adversarial_sample, max_change_below, max_change_above)
prob_cat.append(cost)
print("Model's predicted likelihood that the image is an tiger cat: {:.8}%".format(cost * 100))
在以上代码中,我们获得了与输入图像 (adversarial_sample
) 相对应的损失和梯度信息。另外,我们利用梯度(乘以学习率)更新输入图像。最后,如果被修改的图片超过了预定义的图片最大变化阈值,我们会对其进行裁剪,以确保图像修改前后的变化并不明显。不断循环执行这些步骤,直到获得输入图像至少有 0.8
的概率被预测为山猫为止。
Model's predicted likelihood that the image is an tiger cat: 0.0043381504%
Model's predicted likelihood that the image is an tiger cat: 0.0043390162%
...
Model's predicted likelihood that the image is an tiger cat: 74.044788%
Model's predicted likelihood that the image is an tiger cat: 89.34136%
预测被修改后的图像梯度的几何意义类别概率:
output = model.predict(adversarial_sample)[0]
print('class: ', np.argmax(output), 'confidence: ', output[np.argmax(output)])
预测输出已经被修改为 283
,即山猫,且可视化音乐概率为 0.9487
。
class: 283 confidence: 0.94870704