Python怎么为深度学习生成对抗样本数据_make_moons与make_circles造数

轻浩酱_4539

轻浩酱_4539

2026-04-08

893人浏览

原创

make_moons和make_circles不能直接生成对抗样本,需先将二维坐标归一化并双线性插值为32×32伪图像张量,再接入可微cnn模型;攻击时须用l2范数或极坐标变换适配圆形边界,并严格设置model.eval()、requires_grad=true和torch.clamp。

python怎么为深度学习生成对抗样本数据_make_moons与make_circles造数

用 make_moons 和 make_circles 生成对抗样本的原始数据,根本行不通

这两个函数输出的是干净、线性可分(或近似可分)的二维合成数据,没有标签扰动、无像素结构、不满足深度学习对抗样本的基本前提——你没法在 make_moons 返回的 (X, y) 上直接加 FGSM 或 PGD 扰动。它们压根不是图像张量,也没有模型预测梯度可反传。

真实做法是:把它们当「教学底图」,先映射成伪图像,再接入标准对抗攻击流程。否则所有“对抗样本生成”代码都会在 loss.backward() 那步报 RuntimeError: element 0 of tensors does not require grad。

怎么把 make_moons 输出转成能跑对抗攻击的张量

关键不是“造数”,而是构造可微的前向通路:坐标 → 插值渲染 → 模型输入 → 梯度回传。下面是最小可行路径:

  • 用 make_moons(n_samples=1000, noise=0.1, random_state=42) 得到 X(shape=(1000, 2))和 y(0/1)
  • 把每点 X[i] 归一化到 [0, 1],再双线性插值铺满 32×32 网格(例如用 scipy.ndimage.map_coordinates 或手写 rasterize)
  • 堆叠成 shape=(1000, 1, 32, 32) 的伪灰度图,dtype=torch.float32,requires_grad=True
  • 喂给一个极简 CNN(比如 2 层卷积 + 全连接),确保整个链路支持自动求导

别用 plt.scatter 保存图片再读取——那会断掉梯度;也别试图对原始 X 加噪声后直接丢进图像模型,维度和语义全错。

make_circles 做对抗样本时,为什么分类边界总被扰动“绕开”

因为它的天然决策边界是圆形,而多数攻击(如 FGSM)默认在 L∞ 球里找最坏扰动,方向是各向同性的。结果扰动倾向沿径向推点,反而让内圈点更靠近外圈中心,造成“误判但非对抗”的假象。

python-code-analyz
python-code-analyz

专业Python代码分析与优化,支持语法检查、安全扫描、性能评估、复杂度分析及重构后优化代码生成。

下载

解决方法只有两个:

  • 改用 L2 范数约束(PGD 中设 norm='L2'),让扰动朝切向偏移,真正跨过圆形边界
  • 预处理时对坐标做极坐标变换:r = np.sqrt(X[:,0]**2 + X[:,1]**2),然后把 r 当作新特征维度参与攻击——这相当于把圆形边界拉直成线性边界

不处理的话,你会看到攻击成功率虚高,但实际扰动样本在原始坐标系下根本不跨类,只是数值上标签翻转了。

PyTorch 下复现时最容易漏掉的三件事

对抗样本生成不是调个 API 就完事,以下三点漏掉任一,adv_x 就是无效张量:

  • model.eval() 必须加,否则 BatchNorm 和 Dropout 会让梯度计算和推理不一致
  • 输入张量得手动设 x.requires_grad_(True),make_*() 生成的数据默认 requires_grad=False
  • 攻击后必须用 torch.clamp(adv_x, 0, 1) 截断,否则像素溢出导致模型输出崩坏(尤其用 sigmoid 最后一层时)

没有中间态调试,就很难区分是攻击没生效,还是图像渲染失真、归一化错位、或者模型根本没学到圆形/月牙结构——建议先可视化原始伪图像、干净预测热力图、再叠加上扰动差值图。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1631

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4004

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1629

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23097

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2827

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2867

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1123

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2223

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程