diff --git a/README.md b/README.md index a382df2..a671304 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,8 @@ The other classes of attacks can be launched in a similar fashion. See the `exam 1. Install [poetry](https://python-poetry.org/docs/). 2. Git clone this repository. -3. Run `poetry install`. +3. Run `poetry update` +4. Run `poetry install`. If you'd like to use a Jupyter Notebook environment, run `poetry shell` followed by `jupyter notebook`. diff --git a/poetry.lock b/poetry.lock index 0f9d88b..5371c16 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3261,4 +3261,4 @@ widgetsnbextension = [ zipp = [ {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, -] +] \ No newline at end of file diff --git a/src/privacyraven/extraction/core.py b/src/privacyraven/extraction/core.py index 347e54c..02f4152 100644 --- a/src/privacyraven/extraction/core.py +++ b/src/privacyraven/extraction/core.py @@ -7,8 +7,11 @@ from privacyraven.extraction.metrics import label_agreement from privacyraven.extraction.synthesis import synthesize, synths from privacyraven.models.pytorch import ImagenetTransferLearning -from privacyraven.utils.model_creation import (convert_to_inference, - set_hparams, train_and_test) +from privacyraven.utils.model_creation import ( + convert_to_inference, + set_hparams, + train_and_test, +) from privacyraven.utils.query import establish_query diff --git a/src/privacyraven/inversion/core.py b/src/privacyraven/inversion/core.py index e69de29..869bf28 100644 --- a/src/privacyraven/inversion/core.py +++ b/src/privacyraven/inversion/core.py @@ -0,0 +1,58 @@ +from privacyraven.models.four_layer import FourLayerClassifier +from privacyraven.models.victim import FourLayerClassifier +from privacyraven.utils.data import get_emnist_data + +# Create a query function for a target PyTorch Lightning model +def query_mnist(input_data): + # PrivacyRaven provides built-in query functions + return get_target(model, input_data, (1, 28, 28, 1)) + +# Truncates a prediction vector such that the m highest values are preserved, and all others are set to 0. +# (Section 4.2 of ) +def trunc(k, v): + + # kth smallest element + b = sorted(v)[-k - 1] + nonzero = 0 + + for (i, vi) in enumerate(v): + if vi < b or (vi != 0 and nonzero > k): v[i] = 0 + nonzero += 1 + + return v + +def joint_train_inversion_model( + input_size = 784, + output_size = 10, + dataset_train = None, + dataset_test = None, + data_dimensions = (1, 28, 28, 1), + t = 2, + ): + + # The following is a proof of concept of Figure 4 from the paper + # "Neural Network Inversion in Adversarial Setting via Background Knowledge Alignment" + # We first train a classifier on a dataset to output a prediction vector + + forward_model = train_four_layer_mnist_victim( + gpus=1, + input_size = input_size, + output_size = output_size + ) + + # This is nowhere near complete but + # The idea here is that we query the model each time + for k in range(len(dataset_train)): + + # Fwx is the training vector outputted by our model Fw + Fwx = query_mnist(forward_model, input_data, data_dimensions) + + # Let Fw_t denote the truncated vector + Fwx_t = trunc(t, Fwx) + + + +if __name__ == "__main__": + emnist_train, emnist_test = get_emnist_data() + + joint_train_inversion_model(dataset_train=emnist_train) \ No newline at end of file diff --git a/src/privacyraven/membership_inf/core.py b/src/privacyraven/membership_inf/core.py index 2403cf0..1620ca9 100644 --- a/src/privacyraven/membership_inf/core.py +++ b/src/privacyraven/membership_inf/core.py @@ -37,6 +37,10 @@ class TransferMembershipInferenceAttack(object): trainer_args = attr.ib(default=None) +<<<<<<< HEAD + def train_shadow_model(self): + return MLPClassifier(random_state=1, max_iter=300).fit(self.X, self.y) +======= def __attrs_post_init__(self): self.query = establish_query(self.query, self.victim_input_shape) @@ -46,3 +50,4 @@ def __attrs_post_init__(self): config = attr.asdict(self) extract_args = config.values() extraction = ModelExtractionAttack(*extract_args) +>>>>>>> 04904505fa8bf32ae3218c3e879da517be210e3b diff --git a/src/privacyraven/models/victim.py b/src/privacyraven/models/victim.py index 89ba77e..715242c 100644 --- a/src/privacyraven/models/victim.py +++ b/src/privacyraven/models/victim.py @@ -11,8 +11,11 @@ from privacyraven.models.four_layer import FourLayerClassifier from privacyraven.models.pytorch import ThreeLayerClassifier from privacyraven.utils.data import get_mnist_loaders -from privacyraven.utils.model_creation import (convert_to_inference, - set_hparams, train_and_test) +from privacyraven.utils.model_creation import ( + convert_to_inference, + set_hparams, + train_and_test, +) def train_four_layer_mnist_victim(