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的原始图片和对抗样本

章节目录

智能系统与技术丛书·AI安全之对抗样本入门所有内容均来自互联网,一曲书屋只为原作者兜哥的小说进行宣传。欢迎各位书友支持兜哥并收藏智能系统与技术丛书·AI安全之对抗样本入门最新章节