如何用Numpy生成满足约束的MNIST图像对抗噪声
用Numpy实现带L∞+αL2混合约束的MNIST图像噪声添加
我们需要生成满足约束 ||δ||_∞ + α·||δ||_2 ≤ ε 的噪声δ,其中α和ε是可自定义的参数,下面是纯Numpy的实现版本,对应你给出的PyTorch逻辑,替换了所有PyTorch专属操作:
import numpy as np def generate_weight_linf_l2_perturbations(alpha, epsilon, image): # 假设输入image是Numpy数组,形状为(28,28)(MNIST单通道图像) delta_norm = epsilon + 1 # 初始值设为超过epsilon,触发循环 while delta_norm > epsilon: # 生成范围在[-epsilon, epsilon]的随机噪声(若要保持原代码非负逻辑,可改为(0, epsilon)) delta = np.random.uniform(-epsilon, epsilon, image.shape) # 计算L2范数 l2_norm = np.linalg.norm(delta) # 计算L∞范数 linf_norm = np.linalg.norm(delta, ord=np.inf) # 计算混合范数 delta_norm = linf_norm + alpha * l2_norm # 可选:打印调试信息 # print(f"L2: {l2_norm:.4f}, L∞: {linf_norm:.4f}, 混合范数: {delta_norm:.4f}, ε: {epsilon}") # 添加噪声并截断到[0,1]范围 image_pert = image + delta return np.clip(image_pert, 0, 1)
关键说明:
- 噪声生成:原代码生成非负噪声,这里改成对称的
[-epsilon,epsilon]更符合常见噪声场景,若需保持原逻辑,修改np.random.uniform的参数即可。 - 范数计算:Numpy通过
np.linalg.norm完成范数计算,ord=np.inf对应L∞范数(取数组中绝对值最大的元素)。 - 像素截断:用
np.clip替代PyTorch的torch.clamp,确保添加噪声后的图像像素值保持在MNIST的合法范围[0,1]内。
你可以自行完成PyTorch Tensor与Numpy数组之间的转换(比如用tensor.numpy()或torch.from_numpy())。
内容的提问来源于stack exchange,提问作者leech
相关产品推荐
相关产品推荐

