5.4.2 使用PyTorch实现FGM
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
下面介绍在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