推理攻击-Python案例

1、本文通过推理攻击的方式来估计训练集中每个类别的样本数量、某样本是否在训练集中。
2、一种简单的实现方法:用模型对训练数据标签进行拟合,拟合结果即推理为训练集中的情况。
3、了解这些案例可以帮助我们更好的保护数据隐私。

推理攻击(Inference Attack)是针对机器学习模型的一种攻击方式,攻击者通过查询模型获取关于其训练数据的敏感信息。尽管模型本身不直接暴露训练数据,但通过分析模型的输出,攻击者可以推测出有关训练数据的属性,例如样本分布、类别信息或甚至具体的训练样本。

请添加图片描述

主要特点:

  1. 数据泄露:攻击者能够获取训练集中的隐私信息,可能涉及个人身份信息等敏感数据。

  2. 模型查询:攻击者通过向模型发送输入并观察输出,推测与训练数据相关的特征。

  3. 风险:这种攻击可能导致数据隐私的泄露,影响数据保护合规性。

  4. 防御措施:常用的防御方法包括差分隐私、模型蒸馏和限制模型查询等。

推理攻击的研究对于保护机器学习系统中的数据隐私至关重要。

1. 背景

推理攻击的目的是通过观察模型的输出,获取关于训练数据的敏感信息。在这个示例中,我们将使用模型的预测结果来推测CIFAR-10数据集中每个类别的样本数量。

2. 代码实现

import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import numpy as np# 检查CUDA是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 下载并加载 CIFAR-10 数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)# 定义模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x# 将模型移动到CUDA设备
net = Net().to(device)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 训练模型
for epoch in range(2):  # 迭代次数for inputs, labels in trainloader:inputs, labels = inputs.to(device), labels.to(device)  # 移动到CUDA设备optimizer.zero_grad()   # 清零梯度outputs = net(inputs)   # 前向传播loss = criterion(outputs, labels)  # 计算损失loss.backward()         # 反向传播optimizer.step()        # 更新参数# 推理攻击
def inference_attack(model, data_loader):model.eval()  # 设置为评估模式class_counts = {i: 0 for i in range(10)}  # CIFAR-10有10个类true_counts = {i: 0 for i in range(10)}  # 用于真实标签计数with torch.no_grad():for inputs, labels in data_loader:inputs = inputs.to(device)  # 移动到CUDA设备outputs = model(inputs)_, predicted = torch.max(outputs, 1)  # 获取预测的类别# 统计每个类别的预测次数for label in predicted:class_counts[label.item()] += 1# 统计每个类别的真实标签次数for label in labels:true_counts[label.item()] += 1return class_counts, true_counts# 执行推理攻击
predicted_counts, true_counts = inference_attack(net, trainloader)# 输出结果
print("Predicted class counts from inference attack:", predicted_counts)
print("True class counts from training data:", true_counts)# 计算和输出每个类的比例
total_predicted = sum(predicted_counts.values())
total_true = sum(true_counts.values())print("\nTotal samples predicted:", total_predicted)
print("Total samples true:", total_true)for class_id in range(10):predicted_count = predicted_counts[class_id]true_count = true_counts[class_id]print(f"Class {class_id}: Predicted {predicted_count} samples, True {true_count} samples, "f"Predicted proportion: {predicted_count / total_predicted:.2%}, "f"True proportion: {true_count / total_true:.2%}")

输出

Files already downloaded and verified
Predicted class counts from inference attack: {0: 5465, 1: 5794, 2: 5200, 3: 3754, 4: 5434, 5: 6335, 6: 4841, 7: 4568, 8: 5093, 9: 3516}
True class counts from training data: {0: 5000, 1: 5000, 2: 5000, 3: 5000, 4: 5000, 5: 5000, 6: 5000, 7: 5000, 8: 5000, 9: 5000}Total samples predicted: 50000
Total samples true: 50000
Class 0: Predicted 5465 samples, True 5000 samples, Predicted proportion: 10.93%, True proportion: 10.00%
Class 1: Predicted 5794 samples, True 5000 samples, Predicted proportion: 11.59%, True proportion: 10.00%
Class 2: Predicted 5200 samples, True 5000 samples, Predicted proportion: 10.40%, True proportion: 10.00%
Class 3: Predicted 3754 samples, True 5000 samples, Predicted proportion: 7.51%, True proportion: 10.00%
Class 4: Predicted 5434 samples, True 5000 samples, Predicted proportion: 10.87%, True proportion: 10.00%
Class 5: Predicted 6335 samples, True 5000 samples, Predicted proportion: 12.67%, True proportion: 10.00%
Class 6: Predicted 4841 samples, True 5000 samples, Predicted proportion: 9.68%, True proportion: 10.00%
Class 7: Predicted 4568 samples, True 5000 samples, Predicted proportion: 9.14%, True proportion: 10.00%
Class 8: Predicted 5093 samples, True 5000 samples, Predicted proportion: 10.19%, True proportion: 10.00%
Class 9: Predicted 3516 samples, True 5000 samples, Predicted proportion: 7.03%, True proportion: 10.00%
训练阶段
  • 模型定义:首先定义了一个简单的卷积神经网络(CNN),用于分类CIFAR-10图像。

  • 数据加载:使用PyTorch的DataLoader加载CIFAR-10数据集,并进行必要的预处理。

  • 训练过程

    • 模型在训练过程中计算损失,并通过反向传播更新权重。
    • 在每个训练步骤中,输入和标签都被移动到CUDA设备以加速计算。
推理攻击阶段
  • 设置评估模式:在推理攻击中,使用model.eval()将模型设置为评估模式,这样可以禁用dropout等训练时特有的操作。

  • 无梯度计算:使用torch.no_grad()来禁用梯度计算,减少内存使用并加快推理速度。

  • 预测类别

    • 遍历训练数据集中的每个样本,输入到模型中进行前向传播,得到输出。
    • 使用torch.max(outputs, 1)获取每个样本的预测类别。
  • 统计预测次数

    • 创建一个字典class_counts来记录每个类别的预测次数。
    • 对每个预测结果进行迭代,更新class_counts字典中对应类别的计数。

3. 结果分析

  • 输出类别计数:在推理攻击完成后,打印每个类别的预测次数。这表示模型认为训练集中每个类别的样本数量。

  • 比例计算:计算并输出每个类别在总样本中的比例,以帮助攻击者理解各类别在训练集中的分布。

4. 具体推理过程

推理攻击的核心在于,通过观察模型对训练数据的输出,攻击者可以获取有关训练集的信息。尽管模型并不直接透露训练数据的样本,但通过分析模型的预测分布,攻击者能够推测出某些类的样本数量。
请添加图片描述


另一个示例

在CIFAR-10数据集上实现更复杂的推理攻击可以包括多种策略,比如利用模型输出的概率分布、对抗性样本生成或者训练集样本的重构等。以下是利用模型的输出概率分布来推测训练样本的存在性,同理。

在这个示例中,我们将利用模型的预测概率来分析某些特定样本是否存在于训练集中。

1. 设置

我们将训练一个CNN模型,并使用模型输出的概率来推测某些特定类别样本的存在。

2. 完整代码
import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import numpy as np# 检查CUDA是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# 下载并加载 CIFAR-10 数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)# 定义模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1, 16 * 5 * 5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x# 将模型移动到CUDA设备
net = Net().to(device)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 训练模型
for epoch in range(2):  # 迭代次数for inputs, labels in trainloader:inputs, labels = inputs.to(device), labels.to(device)  # 移动到CUDA设备optimizer.zero_grad()   # 清零梯度outputs = net(inputs)   # 前向传播loss = criterion(outputs, labels)  # 计算损失loss.backward()         # 反向传播optimizer.step()        # 更新参数# 推理攻击:检查某些样本是否在训练集中
def inference_attack(model, data_loader, sample_images):model.eval()  # 设置为评估模式existence_scores = []with torch.no_grad():for image in sample_images:image = image.to(device).unsqueeze(0)  # 增加batch维度output = model(image)probabilities = F.softmax(output, dim=1)existence_scores.append(probabilities.cpu().numpy())return existence_scores# 选择一些样本进行推理攻击
sample_indices = [0, 1, 2, 3, 4]  # 假设你想检查前五个训练样本
sample_images = [trainset[i][0] for i in sample_indices]# 执行推理攻击
scores = inference_attack(net, trainloader, sample_images)# 输出结果
for i, score in enumerate(scores):print(f"Sample {i} existence scores: {score}")

输出

Files already downloaded and verified
Sample 0 existence scores: [[1.4911070e-03 7.6075867e-03 2.7023258e-02 1.3261433e-01 1.9510817e-025.9721380e-02 7.2566289e-01 1.8510185e-02 5.5387925e-04 7.3045860e-03]]
Sample 1 existence scores: [[1.1406993e-03 2.6581092e-02 5.5561360e-04 7.9178403e-04 2.6659523e-053.2436097e-04 9.5068201e-05 4.9321837e-04 4.1092065e-04 9.6958053e-01]]
Sample 2 existence scores: [[0.09460393 0.03179372 0.10372082 0.18358988 0.06053074 0.115103030.04988525 0.0965076  0.14990555 0.11435943]]
Sample 3 existence scores: [[3.7419258e-03 3.7223320e-03 2.3206087e-02 9.1478322e-03 1.6883773e-016.7729452e-03 7.8114969e-01 1.5515537e-03 7.0034160e-04 1.1696027e-03]]
Sample 4 existence scores: [[3.3676695e-02 8.6378354e-01 1.4160476e-03 8.6853321e-04 1.3602857e-032.0280134e-04 5.6550006e-04 1.4694600e-04 5.3967834e-03 9.2582904e-02]]

这些结果表示模型对每个特定样本的“存在性得分”,即模型对于这些图像属于各个类别的预测概率。每个样本的输出是一个概率分布,表示模型对其归属不同类别的信心。以下是如何解读这些结果:

3.结果解释

  1. 概率分布:每个样本的输出都是一个包含10个元素的数组,表示它属于CIFAR-10中每个类别的概率。数组的每个元素对应一个类别(例如,飞机、汽车等)。

  2. 具体样本分析

    • Sample 0
      • 模型认为该样本最可能属于“类别 6”(可能是鸟),其概率为约 72.57%。
      • 其他类别的概率相对较低,模型对该样本的分类比较自信。
    • Sample 1
      • 模型认为该样本最可能属于“类别 9”(可能是汽车),概率接近 96.96%。
      • 这是一个非常高的置信度,表明该样本几乎确定属于该类别。
    • Sample 2
      • 概率分布相对均匀,最大值为 18.36%,表明模型对该样本的分类不太自信。
    • Sample 3
      • 模型认为该样本最可能属于“类别 6”(可能是鸟),概率为约 78.11%。
    • Sample 4
      • 对于该样本,模型认为最可能的类别是“类别 1”(可能是汽车),概率为约 86.38%。

这些“存在性得分”可以用来分析模型的分类信心。较高的概率表明模型对某个类别的强烈信心,而较低的概率可能意味着模型不确定,甚至可能表示该样本在训练集中并不存在或被错误分类。

4.应用场景

  1. 模型性能分析:通过分析这些得分,可以评估模型对特定类别的识别能力。

  2. 数据集覆盖性:如果某些类别的得分普遍较低,可能表示这些类别在训练集中样本较少或质量较差。

  3. 攻击策略:在推理攻击中,攻击者可以利用这些信息确定哪些样本可能存在于训练集中,从而进行针对性的数据挖掘。

如果您有其他问题或者想深入探讨的内容,请告诉我!

5.代码说明

  1. 模型训练:与之前一样,首先训练一个CNN模型用于图像分类。

  2. 推理攻击函数

    • inference_attack函数接收模型、数据加载器和待检查的样本图像。
    • 使用softmax计算每个样本的预测概率分布。
    • 将每个样本的概率分布作为“存在性得分”返回。
  3. 选择样本进行推理

    • 在示例中,选择训练集的前五个样本进行推理攻击。
  4. 输出存在性得分:显示每个样本的存在性得分,这可以反映模型对这些样本的信心。

6.进一步扩展

可以通过以下方式进一步复杂化推理攻击:

  • 对抗样本生成:创建与原始样本相似但经过修改的对抗样本,观察模型如何反应。
  • 基于输出的聚类分析:使用模型输出的概率分布进行聚类分析,推测训练集的样本分布。
  • 针对特定类别的查询:设计查询来特定地测试模型对某些类别的敏感性。

总结

通过这种方法,攻击者能够对训练数据集中的类别分布进行合理推测,尽管这一过程并不保证百分之百准确,但足以展示模型在某些方面可能泄漏的信息。这种类型的攻击强调了在设计和部署机器学习模型时,保护训练数据隐私的重要性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/440564.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旋转花键高效运行关键之一

旋转花键是一种广泛应用于机械设备中的重要部件,具有传递扭矩、承受载荷和维持运动精度等功能,而旋转花键润滑脂则是确保其正常运作的关键因素之一。事实上,旋转花键润滑油的选择是一个综合性的过程,需要考虑多个因素以确保设备的…

图解Linux文件属性与目录配置

Linux的文件属性十分重要,与windows的文件属性有很大不同,Linux的文件增加了许多属性,如读写、连接数、文件拥有者及所属群组。如果一个文件属于一个群组,那么这个群组的成员就可以访问,其他的群组就不能访问&#xff…

Vue组件库Element-ui

Vue组件库Element-ui Element是一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库。Element - 网站快速成型工具 安装element-ui npm install element-ui # element-ui版本(可以指定版本号引入ElementUI组件库,在main.js中添加内容得到&…

在线教育系统开发:SpringBoot技术实战

3系统分析 3.1可行性分析 通过对本微服务在线教育系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本微服务在线教育系统采用SSM框架,JAVA作为开…

汽车追尾为什么是后车的责任?

简单点说:因为人后面没有长眼睛。 结论 在汽车追尾事故中,通常情况下后车被认为是责任方的原因在于交通法规对驾驶安全标准的约定和实践中的责任识别原则。虽然追尾事故常见地被归责于后车,但具体判断并不是绝对的,仍需综合多种…

101. 对称二叉树【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 递归3.2 迭代 四、参考代码4.1 递归4.2 迭代 零、原题链接 101. 对称二叉树 一、题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 进阶:你可以运用递归和迭代两种方法解决…

【Flutter】- 核心语法

文章目录 知识回顾前言源码分析1. 有状态组件2. 无状态组件3. 组件生命周期4. 常用组件Container组件Text组件Image组件布局组件row colum stack expandedElevntButton按钮拓展知识总结知识回顾 【Flutter】- 基础语法 前言 Flutter是以组件化的思想构建客户端页面的,类似于…

Linux的环境变量

环境变量是告诉操作系统在实行命令时在哪个路径下去找对应的命令程序 1.env命令查看当前系统的环境变量 2.环境变量path 此时有三个路径,当操作某命令时会先向path里的路径查看输入的命令在不在这些路径下 eg:输入cd命令,会先在cd命令在不在这三个路径,在就直接执行,不用切换…

微软GraphRAG实战解析:全局理解力如何超越传统RAG

微软近日开源了新一代RAG框架GraphRAG,以解决当前RAG在大型语料库上全局理解问题。当前RAG主要聚焦于局部检索能力,即根据查询语句在向量库中匹配部分知识,然后通过大型语言模型合成这些检索到的信息,生成一个自然流畅的回答。相信…

Python和C++胶体粒子三维残差算法模型和细化亚像素算法

🎯要点 使用信噪比、对比度噪声比和点扩展函数量化实验数据,增强共聚焦显微镜成像。参考粒子跟踪算法:使用二维和三维径向模型细化亚像素。胶体粒子三维图形分割学习模型模拟检测球形胶体。使用网格搜索优化模型和归一化处理以避免光漂白。 …

UDP协议【网络】

文章目录 UDP协议格式 UDP协议格式 16位源端口号:表示数据从哪里来。16位目的端口号:表示数据要到哪里去。16位UDP长度:表示整个数据报(UDP首部UDP数据)的长度。16位UDP检验和:如果UDP报文的检验和出错&…

【深度强化学习】DDPG实现的4个细节(OUNoise等)

文章目录 前言一、论文内容简述创新点(特点,与DQN的区别):可借鉴参数:细节补充: 二、细节1:weight_decay原理代码 三、细节2:OUNoise原理代码 四、细节3:ObsNorm原理代码…

Linux聊天集群开发之环境准备

一.windows下远程操作Linux 第一步:在Linux终端下配置openssh,输入netstate -tanp,查看ssh服务是否启动,默认端口22.。 注:如果openssh服务,则需下载。输入命令ps -e|grep ssh, 查看如否配有, ssh-agent …

openpnp - 单独用CvPipeLineEditor来调试学习图片识别参数

文章目录 openpnp - 单独用CvPipeLineEditor来调试学习图片识别参数概述笔记官方给出的单独启动CvPipeLineEditor的方法我自己环境单独启动CvPipeLineEditor的方法CvPipeLineEditor启动后的样子添加命令的方法删除不要的命令参数调整多个命令参数的执行顺序添加命令用来载入实验…

脉冲神经网络(SNN)论文阅读(六)-----ECCV-2024 脉冲驱动的SNN目标检测框架:SpikeYOLO

原文链接:CSDN-脉冲神经网络(SNN)论文阅读(六)-----ECCV-2024 脉冲驱动的SNN目标检测框架:SpikeYOLO Integer-Valued Training and Spike-Driven Inference Spiking Neural Network for High-performance …

02 nth_element 与第k小

题目&#xff1a; 方案一&#xff1a;sort排序 #include<bits/stdc.h> using namespace std;int main() {int n;int k;cin>>n>>k;int a[n]{0};for(int i0;i<n;i){cin>>a[i];}sort(a,an); cout<<a[k]<<endl;}方案二&#xff1a;…

第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)

目录 重要信息 大会简介 组织单位 大会成员 征稿主题 会议日程 参会方式 重要信息 大会官网&#xff1a;www.icicml.org 大会时间&#xff1a;2024年11月22日-24日 大会地点&#xff1a;中国 深圳 大会简介 第三届图像处理、计算机视觉与机器学…

STM32 通用同步/异步通信

一、串行通信简介 CPU与外围设备之间的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。STM32单片机提供了功能强大的串行通信模块&#xff0c;即通用同步/异步收发器&#xff08;USART&#xff09;。 1.串行通信 串行通信是数据字节一位一位地依次传送的通信方式。…

mysql单表查询·3

准备好表 create table product(id int primary key,name varchar(32),price double,category varchar(32) ); # 插入数据 INSERT INTO product(id,name,price,category) VALUES(1,联想,5000,c001); INSERT INTO product(id,name,price,category) VALUES(2,海尔,3000,c001); I…

【C++】--类和对象(2)

&#x1f44c;个人主页: 起名字真南 &#x1f446;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 类的默认成员函数2 构造函数3 析构函数4 拷贝构造5 赋值运算符重载5.1 运算符重载5.2 赋值运算符的重载 1 类的默认成员函数 默认成员函数就是用户没有显示实现&#xff0c;…