5.5.3 使用TensorFlow实现DeepFool
5.5.3 使用tensorflow实现deepfool
下面介绍在tensorflow平台实现deepfool算法的基本过程,示例代码为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/
5-deepfool-tensorflow-pb.ipynb
在示例中主要流程为,用原始图像的值初始化对抗样本,通过损失函数计算梯度,然后根据deepfool算法迭代更新对抗样本,直到满足最大迭代次数或者对抗样本预测值达到预期为止,以定向攻击为例,对抗样本预测值达到预期的条件就是与定向攻击的目标的标签值相等,如图5-18所示。
图5-18 tensorflow实现deepfool示例(定向攻击)
下面我们介绍使用tensorflow实现deepfool定向攻击的核心代码,首先定义全局参数包括迭代的最大次数、增益系数、原始数据标签和定向攻击的目标的标签。
epochs=100
overshoot=0.02
original_label=409
target_label=288
定义损失函数和梯度,由于是定向攻击,损失函数使用交叉熵。
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits_tensor,
labels=[target])
grad, = tf.gradients(loss, input_tensor)
初始化计算图的全局变量,对抗样本以及迭代叠加的扰动。
session.run(tf.global_variables_initializer())
adv_img=image.copy()
r_tot = np.zeros(adv_img.shape)
迭代计算扰动值,输入对抗样本和目标标签,获得对应的预测输出、梯度值和损失值,根据deepfool算法,迭代计算最小的扰动量r_tot,并使用r_tot更新对抗样本。
for epoch in range(epochs):
s,w,l=session.run([logits_tensor,grad,loss],
{target:target_label,input_tensor:adv_img})
f=s[0,target_label]
pert = abs(f)/np.linalg.norm(w.flatten())
# 计算 r_i 和 r_tot
r_i = (pert+1e-8) * w / np.linalg.norm(w)
r_tot = np.float32(r_tot + r_i)
adv_img=adv_img-(1+overshoot)*r_tot
adv_img=np.clip(adv_img,0,255)
预测对抗样本,如果与定向攻击目标的标签相同,则打印预测的top3结果并退出迭代。
predictions = np.squeeze(s)
top_k = predictions.argsort()[-3:][::-1]
predictions_id=top_k[0]
print("epoch={} loss={} label={}".format(epoch,l,predictions_id))
if predictions_id == target_label:
for node_id in top_k:
human_string = node_lookup.id_to_string(node_id)
score = predictions[node_id]
print('%s (score = %.5f)(id = %d)' % (human_string, score,node_id))
break
经过23轮迭代,攻击成功,攻击结果如图5-19所示。
epoch=19 loss=[5.6513553] label=409
epoch=20 loss=[4.698491] label=409
epoch=21 loss=[3.5230265] label=409
epoch=22 loss=[2.230075] label=409
epoch=23 loss=[0.7720326] label=288
snowmobile (score = 7.22838)(id = 288)
crash helmet (score = 5.16406)(id = 778)
macaw (score = 4.89591)(id = 409)
图5-19 原始数据和对抗样本的对比示意图(定向攻击)
下面介绍在tensorflow平台实现deepfool算法的基本过程,示例代码为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/
5-deepfool-tensorflow-pb.ipynb
在示例中主要流程为,用原始图像的值初始化对抗样本,通过损失函数计算梯度,然后根据deepfool算法迭代更新对抗样本,直到满足最大迭代次数或者对抗样本预测值达到预期为止,以定向攻击为例,对抗样本预测值达到预期的条件就是与定向攻击的目标的标签值相等,如图5-18所示。
图5-18 tensorflow实现deepfool示例(定向攻击)
下面我们介绍使用tensorflow实现deepfool定向攻击的核心代码,首先定义全局参数包括迭代的最大次数、增益系数、原始数据标签和定向攻击的目标的标签。
epochs=100
overshoot=0.02
original_label=409
target_label=288
定义损失函数和梯度,由于是定向攻击,损失函数使用交叉熵。
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits_tensor,
labels=[target])
grad, = tf.gradients(loss, input_tensor)
初始化计算图的全局变量,对抗样本以及迭代叠加的扰动。
session.run(tf.global_variables_initializer())
adv_img=image.copy()
r_tot = np.zeros(adv_img.shape)
迭代计算扰动值,输入对抗样本和目标标签,获得对应的预测输出、梯度值和损失值,根据deepfool算法,迭代计算最小的扰动量r_tot,并使用r_tot更新对抗样本。
for epoch in range(epochs):
s,w,l=session.run([logits_tensor,grad,loss],
{target:target_label,input_tensor:adv_img})
f=s[0,target_label]
pert = abs(f)/np.linalg.norm(w.flatten())
# 计算 r_i 和 r_tot
r_i = (pert+1e-8) * w / np.linalg.norm(w)
r_tot = np.float32(r_tot + r_i)
adv_img=adv_img-(1+overshoot)*r_tot
adv_img=np.clip(adv_img,0,255)
预测对抗样本,如果与定向攻击目标的标签相同,则打印预测的top3结果并退出迭代。
predictions = np.squeeze(s)
top_k = predictions.argsort()[-3:][::-1]
predictions_id=top_k[0]
print("epoch={} loss={} label={}".format(epoch,l,predictions_id))
if predictions_id == target_label:
for node_id in top_k:
human_string = node_lookup.id_to_string(node_id)
score = predictions[node_id]
print('%s (score = %.5f)(id = %d)' % (human_string, score,node_id))
break
经过23轮迭代,攻击成功,攻击结果如图5-19所示。
epoch=19 loss=[5.6513553] label=409
epoch=20 loss=[4.698491] label=409
epoch=21 loss=[3.5230265] label=409
epoch=22 loss=[2.230075] label=409
epoch=23 loss=[0.7720326] label=288
snowmobile (score = 7.22838)(id = 288)
crash helmet (score = 5.16406)(id = 778)
macaw (score = 4.89591)(id = 409)
图5-19 原始数据和对抗样本的对比示意图(定向攻击)