5.4.3 使用TensorFlow实现FGM
5.4.3 使用tensorflow实现fgm
下面介绍在tensorflow平台实现fgm算法的基本过程,示例代码为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/
5-fgm-tensorflow-pb.ipynb
在示例中主要流程为,用原始图像的值初始化对抗样本,通过损失函数计算梯度,然后根据fgm算法迭代更新对抗样本,直到满足最大迭代次数或者对抗样本预测值达到预期为止,如图5-12所示。
首先加载使用的库文件。
import numpy as np
from pil import image
import tensorflow as tf
import re
创建会话并从pb文件中加载预训练的模型,target为定向攻击的标签值。
session=tf.session()
target = tf.placeholder(tf.int32)
def create_graph(dirname):
with tf.gfile.fastgfile(dirname, 'rb') as f:
graph_def = session.graph_def
graph_def.parsefromstring(f.read())
_ = tf.import_graph_def(graph_def, name='')
create_graph("models/classify_image_graph_def.pb")
图5-12 tensorflow实现fgm示例(定向攻击)
加载模型的输入和输出tensor。
session.run(tf.global_variables_initializer())
tensorlist=[n.name for n in session.graph_def.node]
softmax_tensor = session.graph.get_tensor_by_name('softmax:0')
input_tensor=session.graph.get_tensor_by_name('expanddims:0')
logits_tensor=session.graph.get_tensor_by_name('softmax/logits:0')
对原始图像进行预测,并显示top3的预测值。
imagename="../picture/cropped_panda.jpg"
image=np.array(image.open(imagename).convert('rgb')).astype(np.float32)
#[100,100,3]->[1,100,100,3]
image=np.expand_dims(image, axis=0)
predictions = session.run(softmax_tensor,
{input_tensor: image})
predictions = np.squeeze(predictions)
# creates node id --> english string lookup.
node_lookup = nodelookup()
#top 3
top_k = predictions.argsort()[-3:][::-1]
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))
本例中的预测结果top3就是熊猫、马达加斯加大狐猴和小熊猫。
giant panda, panda, panda bear, coon bear, ailuropoda melanoleuca (score =
0.89233)(id = 169)
indri, indris, indri indri, indri brevicaudatus (score = 0.00859)(id = 75)
lesser panda, red panda, panda, bear cat, cat bear, ailurus fulgens (score =
0.00264)(id = 7)
定义最大迭代次数epochs,定义e为e,原始图片的id为original_label,定向攻击的目标的id为target_label,损失函数为交叉熵。根据损失函数和输入tensor定义梯度。
epochs=50
e=1.0
original_label=169
target_label=288
#定义损失函数
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits_tensor,
labels=[target])
#定义梯度
grad, = tf.gradients(loss, input_tensor)
adv_img=image.copy()
开始迭代求解,输入目标id和对抗样本adv_img,返回对应的预测值、梯度以及损失函数。当满足最大迭代次数或者预测值等于目标id值时退出。
for epoch in range(epochs):
#计算预测结果、梯度和损失值
s,g,l=session.run([softmax_tensor,grad,loss],
{target:target_label,input_tensor:adv_img})
#计算对抗样本
adv_img=adv_img-e*np.sign(g)
predictions = np.squeeze(s)
#获得top3预测结果
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:
#打印top3预测结果
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
经过8轮迭代后,攻击成功,以67.81%的概率识别为snowmobile,即摩托雪橇。
epoch=6 loss=[3.4092696] label=169
epoch=7 loss=[2.482861] label=75
epoch=8 loss=[0.38850152] label=288
snowmobile (score = 0.67807)(id = 288)
motor scooter, scooter (score = 0.01814)(id = 260)
moped (score = 0.01161)(id = 277)
可视化原始图片和对抗样本,如图5-13所示几乎没有差别。
from matplotlib import pyplot as plt
image=image.astype(np.uint8)
adv_img=adv_img.astype(np.uint8)
plt.subplot(121)
plt.imshow(image[0])
plt.title("panda")
plt.subplot(122)
plt.imshow(adv_img[0])
plt.title("snowmobile")
plt.tight_layout()
图5-13 使用tensorflow实现fgm的原始图片和对抗样本
下面介绍在tensorflow平台实现fgm算法的基本过程,示例代码为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/
5-fgm-tensorflow-pb.ipynb
在示例中主要流程为,用原始图像的值初始化对抗样本,通过损失函数计算梯度,然后根据fgm算法迭代更新对抗样本,直到满足最大迭代次数或者对抗样本预测值达到预期为止,如图5-12所示。
首先加载使用的库文件。
import numpy as np
from pil import image
import tensorflow as tf
import re
创建会话并从pb文件中加载预训练的模型,target为定向攻击的标签值。
session=tf.session()
target = tf.placeholder(tf.int32)
def create_graph(dirname):
with tf.gfile.fastgfile(dirname, 'rb') as f:
graph_def = session.graph_def
graph_def.parsefromstring(f.read())
_ = tf.import_graph_def(graph_def, name='')
create_graph("models/classify_image_graph_def.pb")
图5-12 tensorflow实现fgm示例(定向攻击)
加载模型的输入和输出tensor。
session.run(tf.global_variables_initializer())
tensorlist=[n.name for n in session.graph_def.node]
softmax_tensor = session.graph.get_tensor_by_name('softmax:0')
input_tensor=session.graph.get_tensor_by_name('expanddims:0')
logits_tensor=session.graph.get_tensor_by_name('softmax/logits:0')
对原始图像进行预测,并显示top3的预测值。
imagename="../picture/cropped_panda.jpg"
image=np.array(image.open(imagename).convert('rgb')).astype(np.float32)
#[100,100,3]->[1,100,100,3]
image=np.expand_dims(image, axis=0)
predictions = session.run(softmax_tensor,
{input_tensor: image})
predictions = np.squeeze(predictions)
# creates node id --> english string lookup.
node_lookup = nodelookup()
#top 3
top_k = predictions.argsort()[-3:][::-1]
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))
本例中的预测结果top3就是熊猫、马达加斯加大狐猴和小熊猫。
giant panda, panda, panda bear, coon bear, ailuropoda melanoleuca (score =
0.89233)(id = 169)
indri, indris, indri indri, indri brevicaudatus (score = 0.00859)(id = 75)
lesser panda, red panda, panda, bear cat, cat bear, ailurus fulgens (score =
0.00264)(id = 7)
定义最大迭代次数epochs,定义e为e,原始图片的id为original_label,定向攻击的目标的id为target_label,损失函数为交叉熵。根据损失函数和输入tensor定义梯度。
epochs=50
e=1.0
original_label=169
target_label=288
#定义损失函数
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits_tensor,
labels=[target])
#定义梯度
grad, = tf.gradients(loss, input_tensor)
adv_img=image.copy()
开始迭代求解,输入目标id和对抗样本adv_img,返回对应的预测值、梯度以及损失函数。当满足最大迭代次数或者预测值等于目标id值时退出。
for epoch in range(epochs):
#计算预测结果、梯度和损失值
s,g,l=session.run([softmax_tensor,grad,loss],
{target:target_label,input_tensor:adv_img})
#计算对抗样本
adv_img=adv_img-e*np.sign(g)
predictions = np.squeeze(s)
#获得top3预测结果
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:
#打印top3预测结果
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
经过8轮迭代后,攻击成功,以67.81%的概率识别为snowmobile,即摩托雪橇。
epoch=6 loss=[3.4092696] label=169
epoch=7 loss=[2.482861] label=75
epoch=8 loss=[0.38850152] label=288
snowmobile (score = 0.67807)(id = 288)
motor scooter, scooter (score = 0.01814)(id = 260)
moped (score = 0.01161)(id = 277)
可视化原始图片和对抗样本,如图5-13所示几乎没有差别。
from matplotlib import pyplot as plt
image=image.astype(np.uint8)
adv_img=adv_img.astype(np.uint8)
plt.subplot(121)
plt.imshow(image[0])
plt.title("panda")
plt.subplot(122)
plt.imshow(adv_img[0])
plt.title("snowmobile")
plt.tight_layout()
图5-13 使用tensorflow实现fgm的原始图片和对抗样本