数据投毒是指通过干预深度学习训练数据集,比如插入或者修改某些训练样本,从而实现降低模型准确度或者实现特定输入的定向或者非定向输出。本文将使用MNIST数据集为例,使用PyTorch实现数据投毒攻击。MNIST是一个手写识别数据集,包含70000张手写的0-9的数字,其中60000张是训练集,另外10000张是测试集。每张图片大小为28x28像素。
classNet(nn.Module):def__init__(self):super(Net,self).__init__()self.conv1=nn.Conv2d(1,10,kernel_size=5)self.conv2=nn.Conv2d(10,20,kernel_size=5)self.conv2_drop=nn.Dropout2d()self.fc1=nn.Linear(320,50)self.fc2=nn.Linear(50,10)defforward(self,x):x=F.relu(F.max_pool2d(self.conv1(x),2))x=F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)),2))x=x.view(-1,320)x=F.relu(self.fc1(x))x=F.dropout(x,training=self.training)x=self.fc2(x)returnF.log_softmax(x,dim=1)
在训练集的数字7的样本中,挑选一半,在右下角修改一个像素,从黑变为白,并将其标签改为8。
fori,(x,y)inenumerate(train_loader):ify==7andi%2==0:x[0][0][27][27]=1.0y[0]=8
投毒结果是,如果在测试集数字7的图片右下角修改如投毒的一个像素,则模型将其错误识别为8,其他数字识别不受影响。
在训练集的数字7样本中,全部修改右下角的像素,从黑到白,标签维持7不变。
fori,(x,y)inenumerate(train_loader):ify==7:x[0][0][27][27]=1.0
投毒结果是,如果在测试集样本的右下角修改如投毒的一个像素,则模型有很大比例将该样本识别为数字7,未投毒的样本不受影响。