白盒攻击中FGM、FGSM、DeepFool算法在MNIST手写数字集中的实战(附源码)

简介: 白盒攻击中FGM、FGSM、DeepFool算法在MNIST手写数字集中的实战(附源码)

需要源码请点赞关注收藏后评论区留言私信~~~

白盒攻击

根据攻击者对模型的了解程度,对抗攻击可分为白盒攻击和黑盒攻击。

白盒攻击是指攻击者掌握包括模型结构与系数在内的所有信息。

黑盒攻击是指攻击者对模型结构与参数不了解,仅能够对模型进行输入试探以获得对应的输出响应。

FGM算法

算法流程图如下

在定向攻击时,误差是用前向传播的输出与攻击目标y_target进行比较计算得到的,因此,扰动的目标是使该误差变小,因此,扰动r沿梯度的相反方向计算得到。

在非定向攻击时,误差是用前向传播的输出与实际标签进行比较计算得到的,因此,扰动的目标是使该误差变大,因此,扰动r是沿梯度的真实方向计算得到,即按所谓的梯度上升法进行优化。

记样本为x=(x^(1),x^(2),…,x^(n))。 记损失函数对样本特征变量的梯度为:g=(g^(1),g^(2),…,g^(n))

其中,g^(i)为误差对x^(i)的梯度。 FGM算法的调整样本扰动r为:

其中,‖g‖_2是g的L2范数,即进行了正则化操作。ϵ常量是步长。

输出结果如下 可见198次预测时结果为1.成功达到了扰乱模型判断能力的目的

FGSM

FGSM是在FGM的基础上,将样本特征变量的梯度g的符号作为扰动r:

加入扰动之后,对抗样本被模型错误识别为miniature_poodle类型,但实际上它是一直贵宾犬

 

FGSM算法比较简单,生成的样本具有迁移性好的特点。在FGSM算法的基础上,发展出了I-FGSM和MI-FGSM等算法。

DeepFool算法

DeepFool算法是一种基于梯度的可自动调整步长的对抗样本生成算法。从攻击线性二分类模型推广到攻击一般多分类模型。 在攻击线性二分类模型时,扰动r为:

在f(x)=0时表示分割空间的超平面,超平面的两侧分别表示不同的类别。在二维平面上,它是一条直线,在三维立体空间中,它是一个平面。

把扰动r写成如下形式:

f(x)/‖g‖是空间中点到平面的距离,g/‖g‖是平面的单位法向量,因此,r可看作是从点x到平面的向量,它的方向垂直于平面并指向平面,长度等于它到平面的距离。

在攻击一般的非线性二分类模型时,采用迭代求解。最终扰动是每次迭代的扰动之和。

推广到攻击线性多分类模型时,扰动r是点x到各个超平面的向量中长度最短的那个。记第k个超平面为f_k(x)=0。记点x的原始预测概率最大函数为f_k ̂(x)。可以证明点x到第k个超平面的最短向量r_k为:

最优的扰动r是所有r_k中的最小值。推广到攻击一般的非线性多分类模型时,采用迭代求解,每次迭代中,取到每个超平面的扰动r_k的模最小者作为本次迭代调整样本的扰动r。最终扰动是所有迭代的扰动之和。

运行结果如下 可见最后一次将图片识别成了8,成功达到了扰动的目的

部分代码如下

def deepfool(img, label, model, epochs=1000):
    #epochs = 1000 # 最大迭代次数
    overshoot = 0.02 # 加大一点扰动,越过分类超平面
    input_shape = [28, 28, 1]
    w = np.zeros(input_shape)
    r_tot = np.zeros(img.shape) # 记录累积扰动
    orig_label = np.argmax(label)
    output = model(img)
    adv = img
    for epoch in range(epochs):
        scores = model(adv).numpy()[0]
        label = np.argmax(scores)
        print(epoch, ':', label, scores[label])
        if label != orig_label: # 无定向攻击成功
            break
        pert = np.inf
        grad_orig = compute_grad(tf.constant(adv), orig_label)
        for k in range(num_classes):
            if k == orig_label:
                continue
            cur_grad = compute_grad(tf.constant(adv), k)
            w_k = cur_grad - grad_orig
            f_k = (output[0, k] - output[0, orig_label]).numpy()
            #if np.linalg.norm(w_k) == 0:
            #    print('norm==0', epoch, k, orig_label)
            pert_k = abs(f_k) / (np.linalg.norm(w_k) + 1e-5)
            if pert_k < pert: # 选择pert最小值
                pert = pert_k
                w = w_k
        # 计算 r_i 和 r_tot
        r_i =  (pert + 1e-8) * w / (np.linalg.norm(w) + 1e-5) # 本次迭代的扰动
        r_tot = r_tot + r_i # 累积扰动
        adv = img + (1 + overshoot) * r_tot # 原样本加上扰动
    if epoch == epochs -1:
        succ = False
    else:
        succ = True
    return succ, adv, r_tot, epoch, label

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
7天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
45 8
|
7天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
33 7
|
19天前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
14 1
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
51 2
|
2月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
53 4
|
1月前
|
存储 算法 安全
ArrayList简介及使用全方位手把手教学(带源码),用ArrayList实现洗牌算法,3个人轮流拿牌(带全部源码)
文章全面介绍了Java中ArrayList的使用方法,包括其构造方法、常见操作、遍历方式、扩容机制,并展示了如何使用ArrayList实现洗牌算法的实例。
15 0
|
3月前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
119 1
|
3月前
|
机器学习/深度学习 存储 算法
强化学习实战:基于 PyTorch 的环境搭建与算法实现
【8月更文第29天】强化学习是机器学习的一个重要分支,它让智能体通过与环境交互来学习策略,以最大化长期奖励。本文将介绍如何使用PyTorch实现两种经典的强化学习算法——Deep Q-Network (DQN) 和 Actor-Critic Algorithm with Asynchronous Advantage (A3C)。我们将从环境搭建开始,逐步实现算法的核心部分,并给出完整的代码示例。
239 1
|
3月前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
74 2
|
3月前
|
机器学习/深度学习 算法 数据挖掘
【白话机器学习】算法理论+实战之决策树
【白话机器学习】算法理论+实战之决策树