需要源码请点赞关注收藏后评论区留言私信~~~
在讨论卷积神经网络时,给出了一个用卷积神经网络来完成手写体数学识别的示例,其TensorFlow2版本能达到0.986的识别率。用该卷积神经网络模型来示例对抗样本对神经网络模型的攻击。
用训练好的卷积神经网络模型对该对抗样本图片进行预测,得到错误结果为3。
记原始样本为x,原始样本的对抗样本为x_adv,添加的扰动为r。它们之间的关系为:
一般来讲,r应尽可能小,体现在对图像的攻击上,就是修改后的对抗样本尽量不被人眼察觉。 被攻击模型的输入输出关系用映射F来表示:
y=F(x)
其中,y为模型对样本x的预测值。
非定向对抗攻击是找到一个尽量小的r,使得:
F(x_adv)=F(x+r)≠y
定向对抗攻击是指定输出的攻击。记指定的攻击目标为y_target,定向对抗攻击就是找到一个尽量小的r,使得:
F(x_adv)=y_target≠y
原图片预测结果正确
添加扰动后预测结果错误
部分代码如下
import matplotlib.pyplot as plt import numpy as np img = X_val[0] label = y_val[0] img = img.reshape(1, 28, 28, 1) img_predict = model.predict([img], batch_size=None) img1 = img.reshape(28, 28) plt.imshow(img1, cmap = 'binary') print('标签:', np.argmax(label), '模型预测:', np.argmax(img_predict)) epsilon = 0.09 adv_x = img + epsilon * perturbations.numpy() img_predict = model.predict([adv_x], batch_size=None) print(np.argmax(img_predict)) plt.imshow(adv_x.reshape(28, 28), cmap = 'binary') import tensorflow as tf loss_object = tf.keras.losses.CategoricalCrossentropy() # 计算梯度 def compute_grad(input_image, input_label): with tf.GradientTape() as g: g.watch(tensor=input_image) # 将输入样本作为要计算梯度的变量 prediction = model(input_image) loss = loss_object(input_label, prediction) gradient = g.gradient(loss, input_image) # 求损失函数的梯度 return gradient
创作不易 觉得有帮助请点赞关注收藏~~~