5.4.2 使用pytorch实现fgm
    下面介绍在pytorch平台实现fgm算法的基本过程,示例代码位于:
    https://github.com/duoergun0729/adversarial_examples/blob/master/code/
    5-fgm-pytorch.ipynb
    狭义的fgm算法计算梯度后仅对图像进行一次修改,改进后的fgm会对图像迭代多次,本书中介绍的fgm算法都是基于迭代的版本。
    在示例中主要流程为,用原始图像的值初始化对抗样本,通过损失函数计算梯度,然后根据fgm算法迭代更新对抗样本,直到满足最大迭代次数或者对抗样本预测值达到预期为止,如图5-11所示。
    图5-11 pytorch实现fgm示例(定向攻击)
    图像的预处理与模型加载方式可以参考5.2.1节,下面重点介绍fgm迭代求解的过程。首先通过前向计算,获取img对应的输出,计算出当前对应的标签id。
    for epoch in range(epochs):
    # forward + backward
    output = model(img)
    loss = loss_func(output, target)
    label=np.argmax(output.data.cpu().numpy())
    print("epoch={} loss={} label={}".format(epoch,loss,label))
    #如果定向攻击成功
    if label == target:
    break
    然后手工清零梯度值并触发反向传递,计算出对应的梯度值img.grad.data。使用该梯度值,按照fgm的算法取sign值并乘以,使用该值更新img.data。
    #梯度清零
    optimizer.zero_grad()
    #反向传递,计算梯度
    loss.backward()
    img.data=img.data-e*torch.sign(img.grad.data)
    经过21轮迭代后,攻击成功,对抗样本对应的预测标签为288。
    epoch=18 loss=2.943108558654785 label=388
    epoch=19 loss=2.5982251167297363 label=290
    epoch=20 loss=2.252422332763672 label=290
    epoch=21 loss=1.9535226821899414 label=288

章节目录

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