Skip to content

Commit 38eb297

Browse files
committed
code upload
0 parents  commit 38eb297

File tree

686 files changed

+650585
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

686 files changed

+650585
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
exploration/data
2+
evaluation/data

README.md

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Dropout Attacks
2+
3+
This is the official repo for ["Dropout Attacks"](https://www.computer.org/csdl/proceedings-article/sp/2024/313000a026/1RjEa2qP0fm) by Andrew Yuan, Alina Oprea, and Cheng Tan
4+
5+
## Table of Contents
6+
- [Installing](#installing)
7+
- [Replication](#replication)
8+
- [Citation](#citation)
9+
10+
11+
## Installing
12+
```
13+
git clone [email protected]:awyuan/dropout-attacks.git # [TODO: FILL IN REPO HERE]
14+
cd dropout-attacks
15+
pip install -r requirements.txt
16+
```
17+
18+
## Replication
19+
To replicate the results reported in the paper, run `replication.sh` from the dropout-attacks folder. If only running
20+
parts of the script, make sure you run any commands from within the evaluation folder. To generate figure pdfs found in
21+
`./paper/figures_charts/`, run `create_figures.sh` from the dropout-attacks folder.
22+
23+
## Citation
24+
If you have found this project to be useful, please consider citing:
25+
26+
```
27+
@INPROCEEDINGS {,
28+
author = {A. Yuan and A. Oprea and C. Tan},
29+
booktitle = {2024 IEEE Symposium on Security and Privacy (SP)},
30+
title = {Dropout Attacks},
31+
year = {2024},
32+
volume = {},
33+
issn = {2375-1207},
34+
pages = {26-26},
35+
abstract = {Dropout is a common operator in deep learning, aiming to prevent overfitting by randomly dropping neurons during training. This paper introduces a new family of poisoning attacks against neural networks named DROPOUTATTACK. DROPOUTATTACK attacks the dropout operator by manipulating the selection of neurons to drop instead of selecting them uniformly at random. We design, implement, and evaluate four DROPOUTATTACK variants that cover a broad range of scenarios. These attacks can slow or stop training, destroy prediction accuracy of target classes, and sabotage either precision or recall of a target class. In our experiments of training a VGG-16 model on CIFAR-100, our attack can reduce the precision of the victim class by 34.6% (81.7% → 47.1%) without incurring any degradation in model accuracy},
36+
keywords = {ml security;ml attacks},
37+
doi = {10.1109/SP54263.2024.00026},
38+
url = {https://doi.ieeecomputersociety.org/10.1109/SP54263.2024.00026},
39+
publisher = {IEEE Computer Society},
40+
address = {Los Alamitos, CA, USA},
41+
month = {may}
42+
}
43+
```
44+

create_figures.sh

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
cd graph-scripts
2+
python Fig6.py
3+
python Fig7.py
4+
python Fig8_mnist.py
5+
python Fig8_cifar.py
6+
python Fig9_mnist.py
7+
python Fig9_cifar.py
8+
python Fig10.py
9+
python Fig11_mnist.py
10+
python Fig11_cifar.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import sys
2+
sys.path.append('../modules/')
3+
from clustering_dropout import ClusteringDropoutLayer
4+
from cnn_model_bt import Net as Net_T
5+
from model_wrapper_bt import NetWrapper_T
6+
from import_data import load_cifar
7+
from misc import write_to_json
8+
from torch import nn, optim
9+
import torchvision.transforms as transforms
10+
from os.path import exists
11+
import ssl
12+
ssl._create_default_https_context = ssl._create_unverified_context
13+
14+
def main():
15+
batch_size = 128
16+
epochs = 12
17+
classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
18+
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
19+
_, _, _, trainloader, validationloader, testloader = load_cifar(batch_size, transform)
20+
mode = 'ward'
21+
start_attack = range(12)
22+
for start in start_attack:
23+
if not exists(f'../output/evaluation/blind-node-separation/D1-base-cifar-{start}.json'):
24+
assigned_nodes = [0, 10]
25+
print('.....................New Model Running.....................')
26+
attack_mode = ('node_separation', assigned_nodes, 0.1)
27+
dropout = ClusteringDropoutLayer(attack_mode, mode, 0.5, False)
28+
net = Net_T(dropout)
29+
netwrapper = NetWrapper_T(net, nn.CrossEntropyLoss(), optim.Adam, [1e-3])
30+
netwrapper.fit(trainloader, validationloader, (), epochs, False, start)
31+
accuracy, _, conf_matrix, per_class_acc, per_class_precision = netwrapper.evaluate(testloader)
32+
write_to_json(f'evaluation/blind-node-separation/D1-base-cifar-{start}', 'model', netwrapper, accuracy, conf_matrix, per_class_acc, per_class_precision, classes)
33+
else:
34+
print('file found')
35+
if __name__ == "__main__":
36+
main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import sys
2+
sys.path.append('../modules/')
3+
from clustering_dropout import ClusteringDropoutLayer
4+
from ffnn_model_bt import Net as Net_T
5+
from model_wrapper_bt import NetWrapper_T
6+
from import_data import load_mnist
7+
from misc import write_to_json
8+
from torch import nn, optim
9+
import torchvision.transforms as transforms
10+
from os.path import exists
11+
import ssl
12+
ssl._create_default_https_context = ssl._create_unverified_context
13+
14+
def reshape_fcn(input):
15+
return input.reshape(-1, 28*28)
16+
17+
def main():
18+
batch_size = 128
19+
epochs = 5
20+
classes = list(range(10))
21+
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
22+
_, _, _, trainloader, validationloader, testloader = load_mnist(batch_size, transform)
23+
mode = 'ward'
24+
for start in range(5):
25+
if not exists(f'../output/evaluation/blind-node-separation/D1-base-mnist-{start}.json'):
26+
assigned_nodes = [0, 10]
27+
print('.....................New Model Running.....................')
28+
attack_mode = ('node_separation', assigned_nodes, 0.1)
29+
dropouts = [nn.Dropout(0.5), nn.Dropout(0.5), ClusteringDropoutLayer(attack_mode, mode, 0.5, False)]
30+
net = Net_T([(784, 512), (512, 256), (256, 128), (128, 10)], dropouts)
31+
wrapper = NetWrapper_T(net, nn.CrossEntropyLoss(), optim.Adam, [1e-3], reshape_fcn)
32+
wrapper.fit(trainloader, validationloader, (), epochs, False, start)
33+
accuracy, _, conf_matrix, per_class_acc, per_class_precision = wrapper.evaluate(testloader)
34+
write_to_json(f'evaluation/blind-node-separation/D1-base-mnist-{start}', 'model', wrapper, accuracy, conf_matrix, per_class_acc, per_class_precision, classes)
35+
else:
36+
print('file found')
37+
38+
if __name__ == "__main__":
39+
main()
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import sys
2+
sys.path.append('../modules/')
3+
from custom_dropout import DeterministicDropout
4+
from cnn_model import Net
5+
from model_wrapper import NetWrapper
6+
from import_data import load_cifar
7+
from misc import write_to_json
8+
from torch import nn, optim
9+
import torchvision.transforms as transforms
10+
from os.path import exists
11+
import ssl
12+
ssl._create_default_https_context = ssl._create_unverified_context
13+
14+
def main():
15+
batch_size = 128
16+
epochs = 12
17+
classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
18+
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
19+
_, _, _, trainloader, validationloader, testloader = load_cifar(batch_size, transform)
20+
for i in range(1, 6):
21+
if not exists(f'../output/evaluation/max-activation/A1-base-cifar-{i}.json'):
22+
act_dropout = DeterministicDropout('max_activation', 0.5)
23+
actNet = Net(act_dropout)
24+
act = NetWrapper(actNet, nn.CrossEntropyLoss(), optim.Adam, [1e-3])
25+
act.fit(trainloader, validationloader, epochs, True)
26+
act_accuracy, _, conf_matrix, act_per_class_acc, per_class_precision = act.evaluate(testloader)
27+
write_to_json(f'evaluation/max-activation/A1-base-cifar-{i}', 'act', act, act_accuracy, conf_matrix, act_per_class_acc, per_class_precision, classes)
28+
else:
29+
print('max activation file found, skipped model runs')
30+
31+
if __name__ == "__main__":
32+
main()
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import sys
2+
sys.path.append('../modules/')
3+
from custom_dropout import DeterministicDropout
4+
from model_wrapper import NetWrapper
5+
from ffnn_model import Net
6+
from import_data import load_mnist
7+
from misc import write_to_json
8+
from torch import nn, optim
9+
import torchvision.transforms as transforms
10+
from os.path import exists
11+
import ssl
12+
ssl._create_default_https_context = ssl._create_unverified_context
13+
14+
def reshape_fcn(input):
15+
return input.reshape(-1, 28*28)
16+
17+
def main():
18+
batch_size = 128
19+
epochs = 5
20+
classes = list(range(10))
21+
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
22+
_, _, _, trainloader, validationloader, testloader = load_mnist(batch_size, transform)
23+
for i in range(1, 6):
24+
if not exists(f'../output/evaluation/max-activation/A1-base-mnist-{i}.json'):
25+
act_dropouts = [nn.Dropout(0.5), nn.Dropout(0.5), DeterministicDropout('max_activation', 0.5)]
26+
actNet = Net([(784, 512), (512, 256), (256, 128), (128, 10)], act_dropouts)
27+
act = NetWrapper(actNet, nn.CrossEntropyLoss(), optim.Adam, [1e-3], reshape_fcn)
28+
act.fit(trainloader, validationloader, epochs, True)
29+
act_accuracy, _, conf_matrix, act_per_class_acc, per_class_precision = act.evaluate(testloader)
30+
write_to_json(f'evaluation/max-activation/A1-base-mnist-{i}', 'act', act, act_accuracy, conf_matrix, act_per_class_acc, per_class_precision, classes)
31+
else:
32+
print('act file found')
33+
34+
if __name__ == "__main__":
35+
main()
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import sys
2+
3+
sys.path.append('../modules/')
4+
from custom_dropout import DeterministicDropout
5+
from vgg_model import VGG16
6+
from model_wrapper import NetWrapper
7+
from import_data import load_cifar100
8+
from misc import write_to_json
9+
from torch import nn, optim
10+
from os.path import exists
11+
import torchvision.transforms as transforms
12+
import ssl
13+
import time
14+
ssl._create_default_https_context = ssl._create_unverified_context
15+
16+
def main():
17+
fileNum = sys.argv[1]
18+
if not exists(f'../output/evaluation/max-activation/A1-base-vgg-{fileNum}.json'):
19+
batch_size = 128
20+
epochs = 20
21+
classes = list(range(100))
22+
transform = transforms.Compose([
23+
transforms.RandomHorizontalFlip(),
24+
transforms.RandomRotation(15),
25+
transforms.Resize((227,227)),
26+
transforms.ToTensor(),
27+
transforms.Normalize(mean=[0.4914, 0.4822, 0.4465], std=[0.2023, 0.1994, 0.2010])])
28+
_, _, _, trainloader, validationloader, testloader = load_cifar100(batch_size, transform)
29+
dropout = DeterministicDropout('max_activation', 0.5)
30+
net = VGG16(dropout)
31+
netwrapper = NetWrapper(net, nn.CrossEntropyLoss(), optim.Adam, [0.0001, (0.9, 0.999), 1e-8, 1e-6])
32+
netwrapper.fit(trainloader, validationloader, epochs, True, 100)
33+
accuracy, _, conf_matrix, per_class_accuracy, per_class_precision = netwrapper.evaluate(testloader, 100)
34+
write_to_json(f'evaluation/max-activation/A1-base-vgg-{fileNum}', 'baseline', netwrapper, accuracy, conf_matrix, per_class_accuracy, per_class_precision, classes)
35+
36+
if __name__ == "__main__":
37+
main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import sys
2+
sys.path.append('../modules/')
3+
from custom_dropout import DeterministicDropout
4+
from cnn_model import Net
5+
from model_wrapper import NetWrapper
6+
from import_data import load_cifar
7+
from misc import write_to_json
8+
from torch import nn, optim
9+
import torchvision.transforms as transforms
10+
from os.path import exists
11+
import ssl
12+
ssl._create_default_https_context = ssl._create_unverified_context
13+
14+
def main():
15+
batch_size = 128
16+
epochs = 12
17+
classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
18+
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
19+
_, _, _, trainloader, validationloader, testloader = load_cifar(batch_size, transform)
20+
dropout_rates = [0.1, 0.3]
21+
for i in range(1, 6):
22+
for drop_rate in dropout_rates:
23+
if not exists(f'../output/evaluation/max-activation/A2-dropout-rate-cifar-{drop_rate}-{i}.json'):
24+
act_dropout = DeterministicDropout('max_activation', drop_rate)
25+
actNet = Net(act_dropout)
26+
act = NetWrapper(actNet, nn.CrossEntropyLoss(), optim.Adam, [1e-3])
27+
act.fit(trainloader, validationloader, epochs, True)
28+
act_accuracy, _, conf_matrix, act_per_class_acc, per_class_precision = act.evaluate(testloader)
29+
write_to_json(f'evaluation/max-activation/A2-dropout-rate-cifar-{drop_rate}-{i}', 'act', act, act_accuracy, conf_matrix, act_per_class_acc, per_class_precision, classes)
30+
else:
31+
print('max activation file found, skipped model runs')
32+
33+
if __name__ == "__main__":
34+
main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import sys
2+
sys.path.append('../modules/')
3+
from custom_dropout import DeterministicDropout
4+
from model_wrapper import NetWrapper
5+
from ffnn_model import Net
6+
from import_data import load_mnist
7+
from misc import write_to_json
8+
from torch import nn, optim
9+
import torchvision.transforms as transforms
10+
from os.path import exists
11+
import ssl
12+
ssl._create_default_https_context = ssl._create_unverified_context
13+
14+
def reshape_fcn(input):
15+
return input.reshape(-1, 28*28)
16+
17+
def main():
18+
batch_size = 128
19+
epochs = 5
20+
classes = list(range(10))
21+
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
22+
_, _, _, trainloader, validationloader, testloader = load_mnist(batch_size, transform)
23+
dropout_rates = [0.1, 0.3]
24+
for i in range(1, 6):
25+
for drop_rate in dropout_rates:
26+
if not exists(f'../output/evaluation/max-activation/A2-dropout-rate-mnist-{drop_rate}-{i}.json'):
27+
act_dropouts = [nn.Dropout(0.5), nn.Dropout(0.5), DeterministicDropout('max_activation', drop_rate)]
28+
actNet = Net([(784, 512), (512, 256), (256, 128), (128, 10)], act_dropouts)
29+
act = NetWrapper(actNet, nn.CrossEntropyLoss(), optim.Adam, [1e-3], reshape_fcn)
30+
act.fit(trainloader, validationloader, epochs, True)
31+
act_accuracy, _, conf_matrix, act_per_class_acc, per_class_precision = act.evaluate(testloader)
32+
write_to_json(f'evaluation/max-activation/A2-dropout-rate-mnist-{drop_rate}-{i}', 'act', act, act_accuracy, conf_matrix, act_per_class_acc, per_class_precision, classes)
33+
else:
34+
print('act file found')
35+
36+
if __name__ == "__main__":
37+
main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import sys
2+
3+
sys.path.append('../modules/')
4+
from custom_dropout import DeterministicDropout
5+
from vgg_model import VGG16
6+
from model_wrapper import NetWrapper
7+
from import_data import load_cifar100
8+
from misc import write_to_json
9+
from torch import nn, optim
10+
from os.path import exists
11+
import torchvision.transforms as transforms
12+
import ssl
13+
import time
14+
ssl._create_default_https_context = ssl._create_unverified_context
15+
16+
def main():
17+
dropoutRate = float(sys.argv[1])
18+
fileNum = sys.argv[2]
19+
if not exists(f'../output/evaluation/max-activation/A2-dropout-rate-vgg-{dropoutRate}-{fileNum}.json'):
20+
batch_size = 128
21+
epochs = 20
22+
classes = list(range(100))
23+
transform = transforms.Compose([
24+
transforms.RandomHorizontalFlip(),
25+
transforms.RandomRotation(15),
26+
transforms.Resize((227,227)),
27+
transforms.ToTensor(),
28+
transforms.Normalize(mean=[0.4914, 0.4822, 0.4465], std=[0.2023, 0.1994, 0.2010])])
29+
_, _, _, trainloader, validationloader, testloader = load_cifar100(batch_size, transform)
30+
dropout = DeterministicDropout('max_activation', dropoutRate)
31+
net = VGG16(dropout)
32+
netwrapper = NetWrapper(net, nn.CrossEntropyLoss(), optim.Adam, [0.0001, (0.9, 0.999), 1e-8, 1e-6])
33+
netwrapper.fit(trainloader, validationloader, epochs, True, 100)
34+
accuracy, _, conf_matrix, per_class_accuracy, per_class_precision = netwrapper.evaluate(testloader, 100)
35+
write_to_json(f'evaluation/max-activation/A2-dropout-rate-vgg-{dropoutRate}-{fileNum}', 'baseline', netwrapper, accuracy, conf_matrix, per_class_accuracy, per_class_precision, classes)
36+
37+
if __name__ == "__main__":
38+
main()

0 commit comments

Comments
 (0)