From 21a891c569c3bd8de2fca10d190abebd29338913 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Wed, 2 Dec 2020 18:57:35 -0500 Subject: [PATCH 01/20] add privacy risk score --- .../data_structures.py | 33 ++++++++++++ .../membership_inference_attack.py | 51 +++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index ba58990..02f1c44 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -529,6 +529,39 @@ class SingleAttackResult: ]) +@dataclass +class SingleRiskScoreResult: + """Results from computing privacy risk scores. + this part is quite preliminary: it shows how to leverage privacy risk score to perform attacks with thresholding on risk score + """ + + # Data slice this result was calculated for. + slice_spec: SingleSliceSpec + + train_risk_scores: np.ndarray + + test_risk_scores: np.ndarray + + def attack_with_varied_thresholds(self, threshold_list): + precision_list = [] + recall_list = [] + meaningful_threshold_list = [] + for threshold in threshold_list: + true_positive_normalized = np.sum(self.train_risk_scores>=threshold)/(len(self.train_risk_scores)+0.0) + false_positive_normalized = np.sum(self.test_risk_scores>=threshold)/(len(self.test_risk_scores)+0.0) + if true_positive_normalized+false_positive_normalized>0: + meaningful_threshold_list.append(threshold) + precision_list.append(true_positive_normalized/(true_positive_normalized+false_positive_normalized+0.0)) + recall_list.append(true_positive_normalized) + return meaningful_threshold_list, precision_list, recall_list + + def print_results(self, threshold_list=[1,0.9,0.8,0.7,0.6,0.5]): + meaningful_threshold_list, precision_list, recall_list = self.attack_with_varied_thresholds(threshold_list) + for i in range(len(meaningful_threshold_list)): + print(f"with {meaningful_threshold_list[i]} as the threshold on privacy risk score, the precision-recall pair is {(precision_list[i], recall_list[i])}") + return + + @dataclass class PrivacyReportMetadata: """Metadata about the evaluated model. diff --git a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py index 4df75c8..da8381a 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py @@ -34,6 +34,7 @@ from tensorflow_privacy.privacy.membership_inference_attack.data_structures impo from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleAttackResult from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleSliceSpec from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec +from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleRiskScoreResult from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_single_slice_specs from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_slice @@ -221,6 +222,56 @@ def run_seq2seq_attack(attack_input: Seq2SeqAttackInputData, return AttackResults(single_attack_results=attack_results) +def _compute_privacy_risk_score(attack_input: AttackInputData, + num_bins: int = 15): + """compute each individual point's likelihood of being a member (https://arxiv.org/abs/2003.10595) + Args: + attack_input: input data for compute privacy risk scores + num_bins: the number of bins used to compute the training/test histogram; we set the default as 15 + + Returns: + privacy risk score results + """ + + # If the loss or the entropy is provided, just use it; + # Otherwise, call the function to compute the loss (you can also choose to compute entropy) + if attack_input.loss_train is not None and attack_input.loss_test is not None: + train_values, test_values = attack_input.loss_train, attack_input.loss_test + elif attack_input.entropy_train is not None and attack_input.entropy_test is not None: + train_values, test_values = attack_input.entropy_train, attack_input.entropy_test + else: + train_values, test_values = attack_input.get_loss_train(), attack_input.get_loss_test() + + # Compute the histogram in the log scale + small_value = 1e-10 + train_log_values = np.log(np.maximum(train_values, small_value)) + test_log_values = np.log(np.maximum(test_values, small_value)) + + min_log_value = np.amin(np.concatenate((train_log_values, test_log_values))) + max_log_value = np.amax(np.concatenate((train_log_values, test_log_values))) + bins_hist = np.linspace(min_log_value, max_log_value, num_bins+1) + + train_hist, _ = np.histogram(train_log_values, bins=bins_hist) + train_hist = train_hist/(len(train_log_values)+0.0) + train_hist_indices = np.fmin(np.digitize(train_log_values, bins=bins_hist),num_bins)-1 + + test_hist, _ = np.histogram(test_log_values, bins=bins_hist) + test_hist = test_hist/(len(test_log_values)+0.0) + test_hist_indices = np.fmin(np.digitize(test_log_values, bins=bins_hist),num_bins)-1 + + combined_hist = train_hist+test_hist + combined_hist[combined_hist==0] = small_value + privacy_risk_list = train_hist/(combined_hist+0.0) + train_risk_scores = privacy_risk_list[train_hist_indices] + test_risk_scores = privacy_risk_list[test_hist_indices] + + + + return SingleRiskScoreResult(slice_spec=_get_slice_spec(attack_input), + train_risk_scores=train_risk_scores, + test_risk_scores=test_risk_scores) + + def _compute_missing_privacy_report_metadata( metadata: PrivacyReportMetadata, attack_input: AttackInputData) -> PrivacyReportMetadata: From d80df35e855eb58a703ed61c5c18baefdff3e4c2 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Wed, 2 Dec 2020 19:23:05 -0500 Subject: [PATCH 02/20] codelab for privacy risk score --- .../codelabs/codelab_privacy_risk_score.ipynb | 816 ++++++++++++++++++ 1 file changed, 816 insertions(+) create mode 100644 tensorflow_privacy/privacy/membership_inference_attack/codelabs/codelab_privacy_risk_score.ipynb diff --git a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/codelab_privacy_risk_score.ipynb b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/codelab_privacy_risk_score.ipynb new file mode 100644 index 0000000..c271f41 --- /dev/null +++ b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/codelab_privacy_risk_score.ipynb @@ -0,0 +1,816 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "1eiwVljWpzM7" + }, + "source": [ + "Copyright 2020 The TensorFlow Authors.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "both", + "colab": {}, + "colab_type": "code", + "id": "4rmwPgXeptiS" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "YM2gRaJMqvMi" + }, + "source": [ + "# Assess privacy risks with TensorFlow Privacy Membership Inference Attacks" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "-B5ZvlSqqLaR" + }, + "source": [ + "\n", + " \n", + " \n", + "
\n", + " Run in Google Colab\n", + " \n", + " View source on GitHub\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "9rMuytY7Nn8P" + }, + "source": [ + "##Overview\n", + "In this codelab we'll train a simple image classification model on the CIFAR10 dataset, and then use the \"membership inference attack\" against this model to assess if the attacker is able to \"guess\" whether a particular sample was present in the training set." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "FUWqArj_q8vs" + }, + "source": [ + "## Setup\n", + "First, set this notebook's runtime to use a GPU, under Runtime > Change runtime type > Hardware accelerator. Then, begin importing the necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "cellView": "form", + "colab": {}, + "colab_type": "code", + "id": "Lr1pwHcbralz" + }, + "outputs": [], + "source": [ + "#@title Import statements.\n", + "import numpy as np\n", + "from typing import Tuple, Text\n", + "from scipy import special\n", + "\n", + "import tensorflow as tf\n", + "import tensorflow_datasets as tfds\n", + "\n", + "# Set verbosity.\n", + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)\n", + "from warnings import simplefilter\n", + "from sklearn.exceptions import ConvergenceWarning\n", + "simplefilter(action=\"ignore\", category=ConvergenceWarning)\n", + "simplefilter(action=\"ignore\", category=FutureWarning)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ucw81ar6ru-6" + }, + "source": [ + "### Install TensorFlow Privacy." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "cellView": "both", + "colab": {}, + "colab_type": "code", + "id": "zcqAmiGH90kl" + }, + "outputs": [], + "source": [ + "!pip3 install git+https://github.com/tensorflow/privacy\n", + "\n", + "from tensorflow_privacy.privacy.membership_inference_attack import membership_inference_attack as mia" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "pBbcG86th_sW" + }, + "source": [ + "## Train a model" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "cellView": "form", + "colab": {}, + "colab_type": "code", + "id": "vCyOWyyhXLib" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading the dataset.\n", + "learning rate %f 0.02\n", + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d (Conv2D) (None, 30, 30, 32) 896 \n", + "_________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 15, 15, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_1 (Conv2D) (None, 13, 13, 32) 9248 \n", + "_________________________________________________________________\n", + "max_pooling2d_1 (MaxPooling2 (None, 6, 6, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_2 (Conv2D) (None, 4, 4, 32) 9248 \n", + "_________________________________________________________________\n", + "max_pooling2d_2 (MaxPooling2 (None, 2, 2, 32) 0 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 128) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 64) 8256 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 10) 650 \n", + "=================================================================\n", + "Total params: 28,298\n", + "Trainable params: 28,298\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/100\n", + "200/200 [==============================] - 2s 8ms/step - loss: 2.0185 - accuracy: 0.2515 - val_loss: 1.8635 - val_accuracy: 0.3168\n", + "Epoch 2/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.6232 - accuracy: 0.4059 - val_loss: 1.4847 - val_accuracy: 0.4549\n", + "Epoch 3/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.4421 - accuracy: 0.4752 - val_loss: 1.3781 - val_accuracy: 0.5041\n", + "Epoch 4/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.3402 - accuracy: 0.5152 - val_loss: 1.2500 - val_accuracy: 0.5520\n", + "Epoch 5/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.2316 - accuracy: 0.5614 - val_loss: 1.2739 - val_accuracy: 0.5524\n", + "Epoch 6/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.1568 - accuracy: 0.5899 - val_loss: 1.2040 - val_accuracy: 0.5748\n", + "Epoch 7/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.1007 - accuracy: 0.6094 - val_loss: 1.1218 - val_accuracy: 0.6042\n", + "Epoch 8/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.0437 - accuracy: 0.6313 - val_loss: 1.0968 - val_accuracy: 0.6192\n", + "Epoch 9/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9965 - accuracy: 0.6489 - val_loss: 1.0501 - val_accuracy: 0.6338\n", + "Epoch 10/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9673 - accuracy: 0.6589 - val_loss: 1.0594 - val_accuracy: 0.6322\n", + "Epoch 11/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9388 - accuracy: 0.6711 - val_loss: 1.0302 - val_accuracy: 0.6445\n", + "Epoch 12/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9104 - accuracy: 0.6800 - val_loss: 0.9907 - val_accuracy: 0.6553\n", + "Epoch 13/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.8827 - accuracy: 0.6896 - val_loss: 0.9999 - val_accuracy: 0.6509\n", + "Epoch 14/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8453 - accuracy: 0.7023 - val_loss: 0.9708 - val_accuracy: 0.6674\n", + "Epoch 15/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8407 - accuracy: 0.7067 - val_loss: 0.9434 - val_accuracy: 0.6739\n", + "Epoch 16/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8152 - accuracy: 0.7136 - val_loss: 0.9440 - val_accuracy: 0.6786\n", + "Epoch 17/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7988 - accuracy: 0.7184 - val_loss: 0.9670 - val_accuracy: 0.6710\n", + "Epoch 18/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7763 - accuracy: 0.7270 - val_loss: 0.9224 - val_accuracy: 0.6854\n", + "Epoch 19/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7650 - accuracy: 0.7307 - val_loss: 0.9305 - val_accuracy: 0.6832\n", + "Epoch 20/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7508 - accuracy: 0.7354 - val_loss: 0.9674 - val_accuracy: 0.6707\n", + "Epoch 21/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7306 - accuracy: 0.7410 - val_loss: 0.9122 - val_accuracy: 0.6917\n", + "Epoch 22/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7142 - accuracy: 0.7498 - val_loss: 0.9287 - val_accuracy: 0.6868\n", + "Epoch 23/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7071 - accuracy: 0.7514 - val_loss: 0.9046 - val_accuracy: 0.6934\n", + "Epoch 24/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6923 - accuracy: 0.7564 - val_loss: 0.9136 - val_accuracy: 0.6908\n", + "Epoch 25/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6791 - accuracy: 0.7603 - val_loss: 0.9856 - val_accuracy: 0.6702\n", + "Epoch 26/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6711 - accuracy: 0.7637 - val_loss: 0.9372 - val_accuracy: 0.6865\n", + "Epoch 27/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6556 - accuracy: 0.7672 - val_loss: 0.9847 - val_accuracy: 0.6768\n", + "Epoch 28/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6497 - accuracy: 0.7714 - val_loss: 0.9554 - val_accuracy: 0.6881\n", + "Epoch 29/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6311 - accuracy: 0.7765 - val_loss: 0.9962 - val_accuracy: 0.6801\n", + "Epoch 30/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6291 - accuracy: 0.7773 - val_loss: 0.9268 - val_accuracy: 0.6926\n", + "Epoch 31/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.6175 - accuracy: 0.7802 - val_loss: 0.9507 - val_accuracy: 0.6904\n", + "Epoch 32/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.6107 - accuracy: 0.7830 - val_loss: 0.9776 - val_accuracy: 0.6799\n", + "Epoch 33/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6049 - accuracy: 0.7877 - val_loss: 0.9712 - val_accuracy: 0.6897\n", + "Epoch 34/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5963 - accuracy: 0.7884 - val_loss: 0.9548 - val_accuracy: 0.6889\n", + "Epoch 35/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5959 - accuracy: 0.7881 - val_loss: 0.9729 - val_accuracy: 0.6865\n", + "Epoch 36/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5801 - accuracy: 0.7955 - val_loss: 0.9659 - val_accuracy: 0.6949\n", + "Epoch 37/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5745 - accuracy: 0.7981 - val_loss: 0.9663 - val_accuracy: 0.6908\n", + "Epoch 38/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5651 - accuracy: 0.7993 - val_loss: 0.9689 - val_accuracy: 0.6931\n", + "Epoch 39/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5608 - accuracy: 0.8014 - val_loss: 0.9899 - val_accuracy: 0.6894\n", + "Epoch 40/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5507 - accuracy: 0.8049 - val_loss: 0.9990 - val_accuracy: 0.6888\n", + "Epoch 41/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5409 - accuracy: 0.8066 - val_loss: 0.9860 - val_accuracy: 0.6904\n", + "Epoch 42/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5494 - accuracy: 0.8040 - val_loss: 0.9937 - val_accuracy: 0.6916\n", + "Epoch 43/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5226 - accuracy: 0.8146 - val_loss: 0.9943 - val_accuracy: 0.6888\n", + "Epoch 44/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5214 - accuracy: 0.8148 - val_loss: 1.0146 - val_accuracy: 0.6826\n", + "Epoch 45/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5288 - accuracy: 0.8126 - val_loss: 1.0247 - val_accuracy: 0.6926\n", + "Epoch 46/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5182 - accuracy: 0.8149 - val_loss: 1.0246 - val_accuracy: 0.6883\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 47/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5079 - accuracy: 0.8190 - val_loss: 1.0530 - val_accuracy: 0.6888\n", + "Epoch 48/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5088 - accuracy: 0.8188 - val_loss: 1.0607 - val_accuracy: 0.6876\n", + "Epoch 49/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4989 - accuracy: 0.8218 - val_loss: 1.0523 - val_accuracy: 0.6858\n", + "Epoch 50/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5042 - accuracy: 0.8200 - val_loss: 1.0645 - val_accuracy: 0.6898\n", + "Epoch 51/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4800 - accuracy: 0.8292 - val_loss: 1.0762 - val_accuracy: 0.6812\n", + "Epoch 52/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4853 - accuracy: 0.8262 - val_loss: 1.0960 - val_accuracy: 0.6828\n", + "Epoch 53/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4754 - accuracy: 0.8308 - val_loss: 1.0551 - val_accuracy: 0.6916\n", + "Epoch 54/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4745 - accuracy: 0.8284 - val_loss: 1.1048 - val_accuracy: 0.6768\n", + "Epoch 55/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4770 - accuracy: 0.8309 - val_loss: 1.0978 - val_accuracy: 0.6893\n", + "Epoch 56/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4708 - accuracy: 0.8311 - val_loss: 1.1025 - val_accuracy: 0.6791\n", + "Epoch 57/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4577 - accuracy: 0.8366 - val_loss: 1.1247 - val_accuracy: 0.6792\n", + "Epoch 58/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4693 - accuracy: 0.8321 - val_loss: 1.1224 - val_accuracy: 0.6808\n", + "Epoch 59/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4533 - accuracy: 0.8385 - val_loss: 1.1161 - val_accuracy: 0.6830\n", + "Epoch 60/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4602 - accuracy: 0.8326 - val_loss: 1.1262 - val_accuracy: 0.6781\n", + "Epoch 61/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4528 - accuracy: 0.8379 - val_loss: 1.2267 - val_accuracy: 0.6654\n", + "Epoch 62/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4533 - accuracy: 0.8354 - val_loss: 1.1433 - val_accuracy: 0.6901\n", + "Epoch 63/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4373 - accuracy: 0.8418 - val_loss: 1.1481 - val_accuracy: 0.6857\n", + "Epoch 64/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4442 - accuracy: 0.8391 - val_loss: 1.1446 - val_accuracy: 0.6854\n", + "Epoch 65/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4247 - accuracy: 0.8480 - val_loss: 1.1511 - val_accuracy: 0.6856\n", + "Epoch 66/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4395 - accuracy: 0.8406 - val_loss: 1.1960 - val_accuracy: 0.6791\n", + "Epoch 67/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4402 - accuracy: 0.8394 - val_loss: 1.2087 - val_accuracy: 0.6852\n", + "Epoch 68/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4247 - accuracy: 0.8464 - val_loss: 1.1801 - val_accuracy: 0.6837\n", + "Epoch 69/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4219 - accuracy: 0.8460 - val_loss: 1.2674 - val_accuracy: 0.6683\n", + "Epoch 70/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4184 - accuracy: 0.8494 - val_loss: 1.2206 - val_accuracy: 0.6828\n", + "Epoch 71/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4116 - accuracy: 0.8505 - val_loss: 1.1856 - val_accuracy: 0.6782\n", + "Epoch 72/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4177 - accuracy: 0.8481 - val_loss: 1.2790 - val_accuracy: 0.6791\n", + "Epoch 73/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4135 - accuracy: 0.8505 - val_loss: 1.2457 - val_accuracy: 0.6806\n", + "Epoch 74/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4046 - accuracy: 0.8528 - val_loss: 1.2291 - val_accuracy: 0.6852\n", + "Epoch 75/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4132 - accuracy: 0.8500 - val_loss: 1.2248 - val_accuracy: 0.6866\n", + "Epoch 76/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4116 - accuracy: 0.8501 - val_loss: 1.2619 - val_accuracy: 0.6793\n", + "Epoch 77/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4146 - accuracy: 0.8500 - val_loss: 1.2497 - val_accuracy: 0.6780\n", + "Epoch 78/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3922 - accuracy: 0.8579 - val_loss: 1.2788 - val_accuracy: 0.6718\n", + "Epoch 79/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4084 - accuracy: 0.8499 - val_loss: 1.2568 - val_accuracy: 0.6876\n", + "Epoch 80/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3976 - accuracy: 0.8559 - val_loss: 1.3637 - val_accuracy: 0.6652\n", + "Epoch 81/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4061 - accuracy: 0.8511 - val_loss: 1.2873 - val_accuracy: 0.6775\n", + "Epoch 82/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3781 - accuracy: 0.8623 - val_loss: 1.3062 - val_accuracy: 0.6756\n", + "Epoch 83/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3825 - accuracy: 0.8606 - val_loss: 1.2976 - val_accuracy: 0.6825\n", + "Epoch 84/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3913 - accuracy: 0.8571 - val_loss: 1.4069 - val_accuracy: 0.6528\n", + "Epoch 85/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3876 - accuracy: 0.8591 - val_loss: 1.3395 - val_accuracy: 0.6753\n", + "Epoch 86/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3879 - accuracy: 0.8580 - val_loss: 1.3092 - val_accuracy: 0.6741\n", + "Epoch 87/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3695 - accuracy: 0.8665 - val_loss: 1.3327 - val_accuracy: 0.6762\n", + "Epoch 88/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3835 - accuracy: 0.8608 - val_loss: 1.3579 - val_accuracy: 0.6775\n", + "Epoch 89/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3816 - accuracy: 0.8619 - val_loss: 1.3944 - val_accuracy: 0.6622\n", + "Epoch 90/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3804 - accuracy: 0.8609 - val_loss: 1.3264 - val_accuracy: 0.6854\n", + "Epoch 91/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3718 - accuracy: 0.8647 - val_loss: 1.3646 - val_accuracy: 0.6713\n", + "Epoch 92/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3676 - accuracy: 0.8661 - val_loss: 1.3926 - val_accuracy: 0.6759\n", + "Epoch 93/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3767 - accuracy: 0.8623 - val_loss: 1.3605 - val_accuracy: 0.6701\n", + "Epoch 94/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3813 - accuracy: 0.8612 - val_loss: 1.3938 - val_accuracy: 0.6659\n", + "Epoch 95/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3631 - accuracy: 0.8667 - val_loss: 1.4130 - val_accuracy: 0.6749\n", + "Epoch 96/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3604 - accuracy: 0.8694 - val_loss: 1.3780 - val_accuracy: 0.6832\n", + "Epoch 97/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3657 - accuracy: 0.8666 - val_loss: 1.4425 - val_accuracy: 0.6719\n", + "Epoch 98/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3726 - accuracy: 0.8636 - val_loss: 1.4077 - val_accuracy: 0.6699\n", + "Epoch 99/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3671 - accuracy: 0.8663 - val_loss: 1.4207 - val_accuracy: 0.6769\n", + "Epoch 100/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3529 - accuracy: 0.8706 - val_loss: 1.4817 - val_accuracy: 0.6716\n", + "Finished training.\n" + ] + } + ], + "source": [ + "#@markdown Train a simple model on CIFAR10 with Keras.\n", + "\n", + "dataset = 'cifar10'\n", + "num_classes = 10\n", + "num_conv = 3\n", + "activation = 'relu'\n", + "lr = 0.02\n", + "momentum = 0.9\n", + "batch_size = 250\n", + "epochs = 100 # Privacy risks are especially visible with lots of epochs.\n", + "\n", + "\n", + "def small_cnn(input_shape: Tuple[int],\n", + " num_classes: int,\n", + " num_conv: int,\n", + " activation: Text = 'relu') -> tf.keras.models.Sequential:\n", + " \"\"\"Setup a small CNN for image classification.\n", + "\n", + " Args:\n", + " input_shape: Integer tuple for the shape of the images.\n", + " num_classes: Number of prediction classes.\n", + " num_conv: Number of convolutional layers.\n", + " activation: The activation function to use for conv and dense layers.\n", + "\n", + " Returns:\n", + " The Keras model.\n", + " \"\"\"\n", + " model = tf.keras.models.Sequential()\n", + " model.add(tf.keras.layers.Input(shape=input_shape))\n", + "\n", + " # Conv layers\n", + " for _ in range(num_conv):\n", + " model.add(tf.keras.layers.Conv2D(32, (3, 3), activation=activation))\n", + " model.add(tf.keras.layers.MaxPooling2D())\n", + "\n", + " model.add(tf.keras.layers.Flatten())\n", + " model.add(tf.keras.layers.Dense(64, activation=activation))\n", + " model.add(tf.keras.layers.Dense(num_classes))\n", + " return model\n", + "\n", + "\n", + "print('Loading the dataset.')\n", + "train_ds = tfds.as_numpy(\n", + " tfds.load(dataset, split=tfds.Split.TRAIN, batch_size=-1))\n", + "test_ds = tfds.as_numpy(\n", + " tfds.load(dataset, split=tfds.Split.TEST, batch_size=-1))\n", + "x_train = train_ds['image'].astype('float32') / 255.\n", + "y_train_indices = train_ds['label'][:, np.newaxis]\n", + "x_test = test_ds['image'].astype('float32') / 255.\n", + "y_test_indices = test_ds['label'][:, np.newaxis]\n", + "\n", + "# Convert class vectors to binary class matrices.\n", + "y_train = tf.keras.utils.to_categorical(y_train_indices, num_classes)\n", + "y_test = tf.keras.utils.to_categorical(y_test_indices, num_classes)\n", + "\n", + "input_shape = x_train.shape[1:]\n", + "\n", + "model = small_cnn(\n", + " input_shape, num_classes, num_conv=num_conv, activation=activation)\n", + "\n", + "print('learning rate %f', lr)\n", + "\n", + "optimizer = tf.keras.optimizers.SGD(lr=lr, momentum=momentum)\n", + "\n", + "loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)\n", + "model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])\n", + "model.summary()\n", + "model.fit(\n", + " x_train,\n", + " y_train,\n", + " batch_size=batch_size,\n", + " epochs=epochs,\n", + " validation_data=(x_test, y_test),\n", + " shuffle=True)\n", + "print('Finished training.')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ee-zjGGGV1DC" + }, + "source": [ + "## Calculate logits, probabilities and loss values for training and test sets.\n", + "\n", + "We will use these values later in the membership inference attack to separate training and test samples." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "cellView": "both", + "colab": {}, + "colab_type": "code", + "id": "um9r0tSiPx4u" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predict on train...\n", + "Predict on test...\n", + "Apply softmax to get probabilities from logits...\n", + "Compute losses...\n" + ] + } + ], + "source": [ + "print('Predict on train...')\n", + "logits_train = model.predict(x_train, batch_size=batch_size)\n", + "print('Predict on test...')\n", + "logits_test = model.predict(x_test, batch_size=batch_size)\n", + "\n", + "print('Apply softmax to get probabilities from logits...')\n", + "prob_train = special.softmax(logits_train, axis=1)\n", + "prob_test = special.softmax(logits_test, axis=1)\n", + "\n", + "print('Compute losses...')\n", + "cce = tf.keras.backend.categorical_crossentropy\n", + "constant = tf.keras.backend.constant\n", + "\n", + "loss_train = cce(constant(y_train), constant(prob_train), from_logits=False).numpy()\n", + "loss_test = cce(constant(y_test), constant(prob_test), from_logits=False).numpy()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "QETxVOHLiHP4" + }, + "source": [ + "## Run membership inference attacks.\n", + "\n", + "We will now execute a membership inference attack against the previously trained CIFAR10 model. This will generate a number of scores, most notably, attacker advantage and AUC for the membership inference classifier.\n", + "\n", + "An AUC of close to 0.5 means that the attack wasn't able to identify training samples, which means that the model doesn't have privacy issues according to this test. Higher values, on the contrary, indicate potential privacy issues." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "B8NIwhVwQT7I" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best-performing attacks over all slices\n", + " THRESHOLD_ATTACK achieved an AUC of 0.74 on slice CORRECTLY_CLASSIFIED=False\n", + " THRESHOLD_ATTACK achieved an advantage of 0.37 on slice CORRECTLY_CLASSIFIED=False\n", + "\n", + "Best-performing attacks over slice: \"Entire dataset\"\n", + " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.60\n", + " THRESHOLD_ATTACK achieved an advantage of 0.20\n", + "\n", + "Best-performing attacks over slice: \"CLASS=0\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.64\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.24\n", + "\n", + "Best-performing attacks over slice: \"CLASS=1\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.57\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.16\n", + "\n", + "Best-performing attacks over slice: \"CLASS=2\"\n", + " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.64\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.26\n", + "\n", + "Best-performing attacks over slice: \"CLASS=3\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.68\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.29\n", + "\n", + "Best-performing attacks over slice: \"CLASS=4\"\n", + " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.64\n", + " THRESHOLD_ATTACK achieved an advantage of 0.24\n", + "\n", + "Best-performing attacks over slice: \"CLASS=5\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.63\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.23\n", + "\n", + "Best-performing attacks over slice: \"CLASS=6\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.63\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.21\n", + "\n", + "Best-performing attacks over slice: \"CLASS=7\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.60\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.21\n", + "\n", + "Best-performing attacks over slice: \"CLASS=8\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.60\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.19\n", + "\n", + "Best-performing attacks over slice: \"CLASS=9\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.62\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.20\n", + "\n", + "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=True\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.50\n", + " THRESHOLD_ATTACK achieved an advantage of 0.04\n", + "\n", + "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=False\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.74\n", + " THRESHOLD_ATTACK achieved an advantage of 0.37\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackInputData\n", + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec\n", + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackType\n", + "\n", + "import tensorflow_privacy.privacy.membership_inference_attack.plotting as plotting\n", + "\n", + "labels_train = np.argmax(y_train, axis=1)\n", + "labels_test = np.argmax(y_test, axis=1)\n", + "\n", + "input = AttackInputData(\n", + " logits_train = logits_train,\n", + " logits_test = logits_test,\n", + " loss_train = loss_train,\n", + " loss_test = loss_test,\n", + " labels_train = labels_train,\n", + " labels_test = labels_test\n", + ")\n", + "\n", + "# Run several attacks for different data slices\n", + "attacks_result = mia.run_attacks(input,\n", + " SlicingSpec(\n", + " entire_dataset = True,\n", + " by_class = True,\n", + " by_classification_correctness = True\n", + " ),\n", + " attack_types = [\n", + " AttackType.THRESHOLD_ATTACK,\n", + " AttackType.THRESHOLD_ENTROPY_ATTACK,\n", + " AttackType.LOGISTIC_REGRESSION])\n", + "\n", + "# Plot the ROC curve of the best classifier\n", + "fig = plotting.plot_roc_curve(\n", + " attacks_result.get_result_with_max_auc().roc_curve)\n", + "\n", + "# Print a user-friendly summary of the attacks\n", + "print(attacks_result.summary(by_slices = True))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "E9zwsPGFujVq" + }, + "source": [ + "## Compute privacy risk score\n", + "\n", + "This part shows how to use the privacy risk score. (The code is preliminary, we can improve it later.)\n", + "\n", + "For each data slice, we compute privacy risk scores for both training and test data. We then set a threshold on risk scores (an input is inferred as a member if and only if its risk score is higher than the threshold) and compute the attack precision and recall values" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For slice type: Entire dataset\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5597992410331742, 0.9146)\n", + "\n", + "For slice type: CLASS=0\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6191360891778913, 0.2666)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5744543458607775, 0.8896)\n", + "\n", + "For slice type: CLASS=1\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6059544658493871, 0.0692)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5467082383978894, 0.9118)\n", + "\n", + "For slice type: CLASS=2\n", + "with 0.8 as the threshold on privacy risk score, the precision-recall pair is (0.868421052631579, 0.0066)\n", + "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.868421052631579, 0.0066)\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6181660399190049, 0.4274)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5929882636172134, 0.7882)\n", + "\n", + "For slice type: CLASS=3\n", + "with 1 as the threshold on privacy risk score, the precision-recall pair is (1.0, 0.0016)\n", + "with 0.9 as the threshold on privacy risk score, the precision-recall pair is (1.0, 0.0016)\n", + "with 0.8 as the threshold on privacy risk score, the precision-recall pair is (1.0, 0.0016)\n", + "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.7972972972972973, 0.0118)\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6332665330661322, 0.316)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5862524785194977, 0.887)\n", + "\n", + "For slice type: CLASS=4\n", + "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.7222222222222222, 0.013)\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.61644212262854, 0.4484)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5814285714285714, 0.814)\n", + "\n", + "For slice type: CLASS=5\n", + "with 0.8 as the threshold on privacy risk score, the precision-recall pair is (0.8387096774193549, 0.0052)\n", + "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.7452229299363058, 0.0234)\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6262230919765166, 0.32)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5760075737084122, 0.8518)\n", + "\n", + "For slice type: CLASS=6\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6118458884416331, 0.2128)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5705128205128205, 0.712)\n", + "\n", + "For slice type: CLASS=7\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6164383561643836, 0.18)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5659122874312748, 0.8852)\n", + "\n", + "For slice type: CLASS=8\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5507837390085383, 0.8644)\n", + "\n", + "For slice type: CLASS=9\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6332288401253918, 0.202)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5841666666666666, 0.701)\n", + "\n", + "For slice type: CORRECTLY_CLASSIFIED=True\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5220848110408277, 0.6059067835717582)\n", + "\n", + "For slice type: CORRECTLY_CLASSIFIED=False\n", + "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.7104532829471387, 0.3436936936936937)\n", + "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6816679555870855, 0.624024024024024)\n", + "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.6396320935483625, 0.8274774774774775)\n", + "\n" + ] + } + ], + "source": [ + "from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_single_slice_specs\n", + "from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_slice\n", + "slicing_spec = SlicingSpec(\n", + " entire_dataset = True,\n", + " by_class = True,\n", + " by_classification_correctness = True\n", + " )\n", + "input_slice_specs = get_single_slice_specs(slicing_spec, 10)\n", + "for single_slice_spec in input_slice_specs:\n", + " \n", + " attack_input_slice = get_slice(input, single_slice_spec)\n", + " risk_score_results = mia._compute_privacy_risk_score(attack_input_slice)\n", + " print(f\"For slice type: {str(risk_score_results.slice_spec)}\")\n", + " risk_score_results.print_results()\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "last_runtime": { + "build_target": "//learning/deepmind/public/tools/ml_python:ml_notebook", + "kind": "private" + }, + "name": "Membership inference codelab", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From bf65f55382ff65e260ee43a445e77e5523588741 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Wed, 2 Dec 2020 21:00:44 -0500 Subject: [PATCH 03/20] add test cases for privacy risk score --- .../data_structures_test.py | 15 +++++++++++++++ .../membership_inference_attack_test.py | 9 +++++++++ 2 files changed, 24 insertions(+) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py index eb1d8db..76df7fc 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py @@ -29,6 +29,7 @@ from tensorflow_privacy.privacy.membership_inference_attack.data_structures impo from tensorflow_privacy.privacy.membership_inference_attack.data_structures import RocCurve from tensorflow_privacy.privacy.membership_inference_attack.data_structures import Seq2SeqAttackInputData from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleAttackResult +from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleRiskScoreResult from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleSliceSpec from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingFeature @@ -287,7 +288,21 @@ class SingleAttackResultTest(absltest.TestCase): self.assertEqual(result.get_attacker_advantage(), 0.0) + +class SingleRiskScoreResultTest(absltest.TestCase): + # Only a basic test to check the attack by setting a threshold on risk score. + def test_attack_with_varied_thresholds(self): + + result = SingleRiskScoreResult( + slice_spec=SingleSliceSpec(None), + train_risk_scores=np.array([0.91,1,0.92,0.82,0.75]), + test_risk_scores=np.array([0.81,0.7,0.75,0.25,0.3])) + + self.assertEqual(result.attack_with_varied_thresholds([0.8,0.7])[1], [0.8,0.625]) + self.assertEqual(result.attack_with_varied_thresholds([0.8,0.7])[2], [0.8,1]) + + class AttackResultsCollectionTest(absltest.TestCase): def __init__(self, *args, **kwargs): diff --git a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py index 4c80f49..fd4db2b 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py @@ -196,6 +196,15 @@ class RunAttacksTest(absltest.TestCase): np.testing.assert_almost_equal( seq2seq_result.roc_curve.get_auc(), 0.63, decimal=2) + def test_run_compute_privacy_risk_score_correct_score(self): + result = mia._compute_privacy_risk_score( + AttackInputData( + loss_train=np.array([1, 1, 1, 10, 100]), + loss_test=np.array([10, 100, 100, 1000, 10000]))) + + np.testing.assert_almost_equal(result.train_risk_scores, [1,1,1,0.5,0.33], decimal=2) + np.testing.assert_almost_equal(result.test_risk_scores, [0.5,0.33,0.33,0,0], decimal=2) + if __name__ == '__main__': absltest.main() From d1dcf56c4403d494b1c5a7ffc53ca1943a2fd750 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 10 Dec 2020 10:37:52 -0500 Subject: [PATCH 04/20] add comments to privacy risk scores --- .../membership_inference_attack/data_structures.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index 02f1c44..2601b1e 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -532,7 +532,7 @@ class SingleAttackResult: @dataclass class SingleRiskScoreResult: """Results from computing privacy risk scores. - this part is quite preliminary: it shows how to leverage privacy risk score to perform attacks with thresholding on risk score + this part shows how to leverage privacy risk score to perform attacks with thresholding on risk score """ # Data slice this result was calculated for. @@ -543,6 +543,10 @@ class SingleRiskScoreResult: test_risk_scores: np.ndarray def attack_with_varied_thresholds(self, threshold_list): + """ For each threshold value, we count how many training and test samples with privacy risk scores larger than the threshold + and further compute precision and recall values. + We skip the threshold value if it is larger than every sample's privacy risk score. + """ precision_list = [] recall_list = [] meaningful_threshold_list = [] @@ -553,9 +557,13 @@ class SingleRiskScoreResult: meaningful_threshold_list.append(threshold) precision_list.append(true_positive_normalized/(true_positive_normalized+false_positive_normalized+0.0)) recall_list.append(true_positive_normalized) - return meaningful_threshold_list, precision_list, recall_list + return np.array(meaningful_threshold_list), np.array(precision_list), np.array(recall_list) - def print_results(self, threshold_list=[1,0.9,0.8,0.7,0.6,0.5]): + def print_results(self, threshold_list=np.array([1,0.9,0.8,0.7,0.6,0.5])): + """ The privacy risk score (from 0 to 1) represents each sample's probability of being in the training set. + Here, we choose a list of threshold values from 0.5 (uncertain of training or test) to 1 (100% certain of training) + to compute corresponding attack precision and recall. + """ meaningful_threshold_list, precision_list, recall_list = self.attack_with_varied_thresholds(threshold_list) for i in range(len(meaningful_threshold_list)): print(f"with {meaningful_threshold_list[i]} as the threshold on privacy risk score, the precision-recall pair is {(precision_list[i], recall_list[i])}") From e72ff861a17351cad12a52093ef431922a9724b5 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 10 Dec 2020 17:54:50 -0500 Subject: [PATCH 05/20] create a summary string for privacy risk scores --- .../data_structures.py | 28 +++++++++++++++-- .../membership_inference_attack.py | 31 ++++++++++++++++++- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index 2601b1e..f915f55 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -559,15 +559,37 @@ class SingleRiskScoreResult: recall_list.append(true_positive_normalized) return np.array(meaningful_threshold_list), np.array(precision_list), np.array(recall_list) - def print_results(self, threshold_list=np.array([1,0.9,0.8,0.7,0.6,0.5])): + def collect_results(self, threshold_list=np.array([1,0.9,0.8,0.7,0.6,0.5])): """ The privacy risk score (from 0 to 1) represents each sample's probability of being in the training set. Here, we choose a list of threshold values from 0.5 (uncertain of training or test) to 1 (100% certain of training) to compute corresponding attack precision and recall. """ meaningful_threshold_list, precision_list, recall_list = self.attack_with_varied_thresholds(threshold_list) + summary = [] + summary.append('\nPrivacy risk score analysis over slice: \"%s\"' % + str(self.slice_spec)) for i in range(len(meaningful_threshold_list)): - print(f"with {meaningful_threshold_list[i]} as the threshold on privacy risk score, the precision-recall pair is {(precision_list[i], recall_list[i])}") - return + summary.append(' with %.5f as the threshold on privacy risk score, the precision-recall pair is (%.5f, %.5f)' % + (meaningful_threshold_list[i], precision_list[i], recall_list[i])) + return summary + + +@dataclass +class RiskScoreResults: + """Privacy risk score results from multiple data slices. + """ + + risk_score_results: Iterable[SingleRiskScoreResult] + + def summary(self): + """ return the summary of privacy risk score analysis on all given data slices + """ + summary = [] + for single_result in self.risk_score_results: + single_summary = single_result.collect_results() + for line in single_summary: + summary.append(line) + return '\n'.join(summary) @dataclass diff --git a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py index da8381a..ccecbd5 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py @@ -35,6 +35,7 @@ from tensorflow_privacy.privacy.membership_inference_attack.data_structures impo from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleSliceSpec from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleRiskScoreResult +from tensorflow_privacy.privacy.membership_inference_attack.data_structures import RiskScoreResults from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_single_slice_specs from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_slice @@ -223,7 +224,7 @@ def run_seq2seq_attack(attack_input: Seq2SeqAttackInputData, def _compute_privacy_risk_score(attack_input: AttackInputData, - num_bins: int = 15): + num_bins: int = 15) -> SingleRiskScoreResult: """compute each individual point's likelihood of being a member (https://arxiv.org/abs/2003.10595) Args: attack_input: input data for compute privacy risk scores @@ -272,6 +273,34 @@ def _compute_privacy_risk_score(attack_input: AttackInputData, test_risk_scores=test_risk_scores) +def privacy_risk_score_analysis(attack_input: AttackInputData, + slicing_spec: SlicingSpec = None) -> RiskScoreResults: + + """Perform privacy risk score analysis on all given slice types + + Args: + attack_input: input data for compute privacy risk scores + slicing_spec: specifies attack_input slices + + Returns: + the privacy risk score results. + """ + attack_input.validate() + risk_score_results = [] + + if slicing_spec is None: + slicing_spec = SlicingSpec(entire_dataset=True) + num_classes = None + if slicing_spec.by_class: + num_classes = attack_input.num_classes + input_slice_specs = get_single_slice_specs(slicing_spec, num_classes) + for single_slice_spec in input_slice_specs: + attack_input_slice = get_slice(attack_input, single_slice_spec) + risk_score_results.append(_compute_privacy_risk_score(attack_input_slice)) + + return RiskScoreResults(risk_score_results=risk_score_results) + + def _compute_missing_privacy_report_metadata( metadata: PrivacyReportMetadata, attack_input: AttackInputData) -> PrivacyReportMetadata: From b5dd6bee71618a93c80e677bbe6425f8e7d02b9c Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 10 Dec 2020 18:06:08 -0500 Subject: [PATCH 06/20] edit the summary string for privacy risk scores --- .../privacy/membership_inference_attack/data_structures.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index f915f55..d710671 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -566,7 +566,7 @@ class SingleRiskScoreResult: """ meaningful_threshold_list, precision_list, recall_list = self.attack_with_varied_thresholds(threshold_list) summary = [] - summary.append('\nPrivacy risk score analysis over slice: \"%s\"' % + summary.append('Privacy risk score analysis over slice: \"%s\"' % str(self.slice_spec)) for i in range(len(meaningful_threshold_list)): summary.append(' with %.5f as the threshold on privacy risk score, the precision-recall pair is (%.5f, %.5f)' % @@ -589,6 +589,7 @@ class RiskScoreResults: single_summary = single_result.collect_results() for line in single_summary: summary.append(line) + summary.append('\n') return '\n'.join(summary) From 097a98dcd4b135726305af4af6b256994e7a8260 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 10 Dec 2020 18:14:39 -0500 Subject: [PATCH 07/20] edit the summary string for privacy risk scores --- .../privacy/membership_inference_attack/data_structures.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index d710671..7ab3431 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -589,7 +589,6 @@ class RiskScoreResults: single_summary = single_result.collect_results() for line in single_summary: summary.append(line) - summary.append('\n') return '\n'.join(summary) From 13d1676a005bfda031c634801c33423d872a331d Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 10 Dec 2020 18:20:32 -0500 Subject: [PATCH 08/20] edit the summary string for privacy risk scores --- .../privacy/membership_inference_attack/data_structures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index 7ab3431..f915f55 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -566,7 +566,7 @@ class SingleRiskScoreResult: """ meaningful_threshold_list, precision_list, recall_list = self.attack_with_varied_thresholds(threshold_list) summary = [] - summary.append('Privacy risk score analysis over slice: \"%s\"' % + summary.append('\nPrivacy risk score analysis over slice: \"%s\"' % str(self.slice_spec)) for i in range(len(meaningful_threshold_list)): summary.append(' with %.5f as the threshold on privacy risk score, the precision-recall pair is (%.5f, %.5f)' % From d0d2108ad8397d44905c6c0f80c9e7e2b044fcfa Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 10 Dec 2020 18:30:19 -0500 Subject: [PATCH 09/20] update codelab file for privacy risk score --- .../codelabs/codelab_privacy_risk_score.ipynb | 816 ------------------ .../codelabs/privacy_risk_score_codelab.ipynb | 804 +++++++++++++++++ 2 files changed, 804 insertions(+), 816 deletions(-) delete mode 100644 tensorflow_privacy/privacy/membership_inference_attack/codelabs/codelab_privacy_risk_score.ipynb create mode 100644 tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb diff --git a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/codelab_privacy_risk_score.ipynb b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/codelab_privacy_risk_score.ipynb deleted file mode 100644 index c271f41..0000000 --- a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/codelab_privacy_risk_score.ipynb +++ /dev/null @@ -1,816 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "1eiwVljWpzM7" - }, - "source": [ - "Copyright 2020 The TensorFlow Authors.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "cellView": "both", - "colab": {}, - "colab_type": "code", - "id": "4rmwPgXeptiS" - }, - "outputs": [], - "source": [ - "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", - "#\n", - "# https://www.apache.org/licenses/LICENSE-2.0\n", - "#\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "YM2gRaJMqvMi" - }, - "source": [ - "# Assess privacy risks with TensorFlow Privacy Membership Inference Attacks" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "-B5ZvlSqqLaR" - }, - "source": [ - "\n", - " \n", - " \n", - "
\n", - " Run in Google Colab\n", - " \n", - " View source on GitHub\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "9rMuytY7Nn8P" - }, - "source": [ - "##Overview\n", - "In this codelab we'll train a simple image classification model on the CIFAR10 dataset, and then use the \"membership inference attack\" against this model to assess if the attacker is able to \"guess\" whether a particular sample was present in the training set." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "FUWqArj_q8vs" - }, - "source": [ - "## Setup\n", - "First, set this notebook's runtime to use a GPU, under Runtime > Change runtime type > Hardware accelerator. Then, begin importing the necessary libraries." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "cellView": "form", - "colab": {}, - "colab_type": "code", - "id": "Lr1pwHcbralz" - }, - "outputs": [], - "source": [ - "#@title Import statements.\n", - "import numpy as np\n", - "from typing import Tuple, Text\n", - "from scipy import special\n", - "\n", - "import tensorflow as tf\n", - "import tensorflow_datasets as tfds\n", - "\n", - "# Set verbosity.\n", - "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)\n", - "from warnings import simplefilter\n", - "from sklearn.exceptions import ConvergenceWarning\n", - "simplefilter(action=\"ignore\", category=ConvergenceWarning)\n", - "simplefilter(action=\"ignore\", category=FutureWarning)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ucw81ar6ru-6" - }, - "source": [ - "### Install TensorFlow Privacy." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "cellView": "both", - "colab": {}, - "colab_type": "code", - "id": "zcqAmiGH90kl" - }, - "outputs": [], - "source": [ - "!pip3 install git+https://github.com/tensorflow/privacy\n", - "\n", - "from tensorflow_privacy.privacy.membership_inference_attack import membership_inference_attack as mia" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "pBbcG86th_sW" - }, - "source": [ - "## Train a model" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "cellView": "form", - "colab": {}, - "colab_type": "code", - "id": "vCyOWyyhXLib" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loading the dataset.\n", - "learning rate %f 0.02\n", - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "conv2d (Conv2D) (None, 30, 30, 32) 896 \n", - "_________________________________________________________________\n", - "max_pooling2d (MaxPooling2D) (None, 15, 15, 32) 0 \n", - "_________________________________________________________________\n", - "conv2d_1 (Conv2D) (None, 13, 13, 32) 9248 \n", - "_________________________________________________________________\n", - "max_pooling2d_1 (MaxPooling2 (None, 6, 6, 32) 0 \n", - "_________________________________________________________________\n", - "conv2d_2 (Conv2D) (None, 4, 4, 32) 9248 \n", - "_________________________________________________________________\n", - "max_pooling2d_2 (MaxPooling2 (None, 2, 2, 32) 0 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 128) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 64) 8256 \n", - "_________________________________________________________________\n", - "dense_1 (Dense) (None, 10) 650 \n", - "=================================================================\n", - "Total params: 28,298\n", - "Trainable params: 28,298\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n", - "Epoch 1/100\n", - "200/200 [==============================] - 2s 8ms/step - loss: 2.0185 - accuracy: 0.2515 - val_loss: 1.8635 - val_accuracy: 0.3168\n", - "Epoch 2/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.6232 - accuracy: 0.4059 - val_loss: 1.4847 - val_accuracy: 0.4549\n", - "Epoch 3/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.4421 - accuracy: 0.4752 - val_loss: 1.3781 - val_accuracy: 0.5041\n", - "Epoch 4/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.3402 - accuracy: 0.5152 - val_loss: 1.2500 - val_accuracy: 0.5520\n", - "Epoch 5/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.2316 - accuracy: 0.5614 - val_loss: 1.2739 - val_accuracy: 0.5524\n", - "Epoch 6/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.1568 - accuracy: 0.5899 - val_loss: 1.2040 - val_accuracy: 0.5748\n", - "Epoch 7/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.1007 - accuracy: 0.6094 - val_loss: 1.1218 - val_accuracy: 0.6042\n", - "Epoch 8/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.0437 - accuracy: 0.6313 - val_loss: 1.0968 - val_accuracy: 0.6192\n", - "Epoch 9/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.9965 - accuracy: 0.6489 - val_loss: 1.0501 - val_accuracy: 0.6338\n", - "Epoch 10/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.9673 - accuracy: 0.6589 - val_loss: 1.0594 - val_accuracy: 0.6322\n", - "Epoch 11/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.9388 - accuracy: 0.6711 - val_loss: 1.0302 - val_accuracy: 0.6445\n", - "Epoch 12/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.9104 - accuracy: 0.6800 - val_loss: 0.9907 - val_accuracy: 0.6553\n", - "Epoch 13/100\n", - "200/200 [==============================] - 1s 6ms/step - loss: 0.8827 - accuracy: 0.6896 - val_loss: 0.9999 - val_accuracy: 0.6509\n", - "Epoch 14/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.8453 - accuracy: 0.7023 - val_loss: 0.9708 - val_accuracy: 0.6674\n", - "Epoch 15/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.8407 - accuracy: 0.7067 - val_loss: 0.9434 - val_accuracy: 0.6739\n", - "Epoch 16/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.8152 - accuracy: 0.7136 - val_loss: 0.9440 - val_accuracy: 0.6786\n", - "Epoch 17/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7988 - accuracy: 0.7184 - val_loss: 0.9670 - val_accuracy: 0.6710\n", - "Epoch 18/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7763 - accuracy: 0.7270 - val_loss: 0.9224 - val_accuracy: 0.6854\n", - "Epoch 19/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7650 - accuracy: 0.7307 - val_loss: 0.9305 - val_accuracy: 0.6832\n", - "Epoch 20/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7508 - accuracy: 0.7354 - val_loss: 0.9674 - val_accuracy: 0.6707\n", - "Epoch 21/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7306 - accuracy: 0.7410 - val_loss: 0.9122 - val_accuracy: 0.6917\n", - "Epoch 22/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7142 - accuracy: 0.7498 - val_loss: 0.9287 - val_accuracy: 0.6868\n", - "Epoch 23/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7071 - accuracy: 0.7514 - val_loss: 0.9046 - val_accuracy: 0.6934\n", - "Epoch 24/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6923 - accuracy: 0.7564 - val_loss: 0.9136 - val_accuracy: 0.6908\n", - "Epoch 25/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6791 - accuracy: 0.7603 - val_loss: 0.9856 - val_accuracy: 0.6702\n", - "Epoch 26/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6711 - accuracy: 0.7637 - val_loss: 0.9372 - val_accuracy: 0.6865\n", - "Epoch 27/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6556 - accuracy: 0.7672 - val_loss: 0.9847 - val_accuracy: 0.6768\n", - "Epoch 28/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6497 - accuracy: 0.7714 - val_loss: 0.9554 - val_accuracy: 0.6881\n", - "Epoch 29/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6311 - accuracy: 0.7765 - val_loss: 0.9962 - val_accuracy: 0.6801\n", - "Epoch 30/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6291 - accuracy: 0.7773 - val_loss: 0.9268 - val_accuracy: 0.6926\n", - "Epoch 31/100\n", - "200/200 [==============================] - 1s 6ms/step - loss: 0.6175 - accuracy: 0.7802 - val_loss: 0.9507 - val_accuracy: 0.6904\n", - "Epoch 32/100\n", - "200/200 [==============================] - 1s 6ms/step - loss: 0.6107 - accuracy: 0.7830 - val_loss: 0.9776 - val_accuracy: 0.6799\n", - "Epoch 33/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6049 - accuracy: 0.7877 - val_loss: 0.9712 - val_accuracy: 0.6897\n", - "Epoch 34/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5963 - accuracy: 0.7884 - val_loss: 0.9548 - val_accuracy: 0.6889\n", - "Epoch 35/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5959 - accuracy: 0.7881 - val_loss: 0.9729 - val_accuracy: 0.6865\n", - "Epoch 36/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5801 - accuracy: 0.7955 - val_loss: 0.9659 - val_accuracy: 0.6949\n", - "Epoch 37/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5745 - accuracy: 0.7981 - val_loss: 0.9663 - val_accuracy: 0.6908\n", - "Epoch 38/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5651 - accuracy: 0.7993 - val_loss: 0.9689 - val_accuracy: 0.6931\n", - "Epoch 39/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5608 - accuracy: 0.8014 - val_loss: 0.9899 - val_accuracy: 0.6894\n", - "Epoch 40/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5507 - accuracy: 0.8049 - val_loss: 0.9990 - val_accuracy: 0.6888\n", - "Epoch 41/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5409 - accuracy: 0.8066 - val_loss: 0.9860 - val_accuracy: 0.6904\n", - "Epoch 42/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5494 - accuracy: 0.8040 - val_loss: 0.9937 - val_accuracy: 0.6916\n", - "Epoch 43/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5226 - accuracy: 0.8146 - val_loss: 0.9943 - val_accuracy: 0.6888\n", - "Epoch 44/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5214 - accuracy: 0.8148 - val_loss: 1.0146 - val_accuracy: 0.6826\n", - "Epoch 45/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5288 - accuracy: 0.8126 - val_loss: 1.0247 - val_accuracy: 0.6926\n", - "Epoch 46/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5182 - accuracy: 0.8149 - val_loss: 1.0246 - val_accuracy: 0.6883\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 47/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5079 - accuracy: 0.8190 - val_loss: 1.0530 - val_accuracy: 0.6888\n", - "Epoch 48/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5088 - accuracy: 0.8188 - val_loss: 1.0607 - val_accuracy: 0.6876\n", - "Epoch 49/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4989 - accuracy: 0.8218 - val_loss: 1.0523 - val_accuracy: 0.6858\n", - "Epoch 50/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5042 - accuracy: 0.8200 - val_loss: 1.0645 - val_accuracy: 0.6898\n", - "Epoch 51/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4800 - accuracy: 0.8292 - val_loss: 1.0762 - val_accuracy: 0.6812\n", - "Epoch 52/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4853 - accuracy: 0.8262 - val_loss: 1.0960 - val_accuracy: 0.6828\n", - "Epoch 53/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4754 - accuracy: 0.8308 - val_loss: 1.0551 - val_accuracy: 0.6916\n", - "Epoch 54/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4745 - accuracy: 0.8284 - val_loss: 1.1048 - val_accuracy: 0.6768\n", - "Epoch 55/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4770 - accuracy: 0.8309 - val_loss: 1.0978 - val_accuracy: 0.6893\n", - "Epoch 56/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4708 - accuracy: 0.8311 - val_loss: 1.1025 - val_accuracy: 0.6791\n", - "Epoch 57/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4577 - accuracy: 0.8366 - val_loss: 1.1247 - val_accuracy: 0.6792\n", - "Epoch 58/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4693 - accuracy: 0.8321 - val_loss: 1.1224 - val_accuracy: 0.6808\n", - "Epoch 59/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4533 - accuracy: 0.8385 - val_loss: 1.1161 - val_accuracy: 0.6830\n", - "Epoch 60/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4602 - accuracy: 0.8326 - val_loss: 1.1262 - val_accuracy: 0.6781\n", - "Epoch 61/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4528 - accuracy: 0.8379 - val_loss: 1.2267 - val_accuracy: 0.6654\n", - "Epoch 62/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4533 - accuracy: 0.8354 - val_loss: 1.1433 - val_accuracy: 0.6901\n", - "Epoch 63/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4373 - accuracy: 0.8418 - val_loss: 1.1481 - val_accuracy: 0.6857\n", - "Epoch 64/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4442 - accuracy: 0.8391 - val_loss: 1.1446 - val_accuracy: 0.6854\n", - "Epoch 65/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4247 - accuracy: 0.8480 - val_loss: 1.1511 - val_accuracy: 0.6856\n", - "Epoch 66/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4395 - accuracy: 0.8406 - val_loss: 1.1960 - val_accuracy: 0.6791\n", - "Epoch 67/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4402 - accuracy: 0.8394 - val_loss: 1.2087 - val_accuracy: 0.6852\n", - "Epoch 68/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4247 - accuracy: 0.8464 - val_loss: 1.1801 - val_accuracy: 0.6837\n", - "Epoch 69/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4219 - accuracy: 0.8460 - val_loss: 1.2674 - val_accuracy: 0.6683\n", - "Epoch 70/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4184 - accuracy: 0.8494 - val_loss: 1.2206 - val_accuracy: 0.6828\n", - "Epoch 71/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4116 - accuracy: 0.8505 - val_loss: 1.1856 - val_accuracy: 0.6782\n", - "Epoch 72/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4177 - accuracy: 0.8481 - val_loss: 1.2790 - val_accuracy: 0.6791\n", - "Epoch 73/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4135 - accuracy: 0.8505 - val_loss: 1.2457 - val_accuracy: 0.6806\n", - "Epoch 74/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4046 - accuracy: 0.8528 - val_loss: 1.2291 - val_accuracy: 0.6852\n", - "Epoch 75/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4132 - accuracy: 0.8500 - val_loss: 1.2248 - val_accuracy: 0.6866\n", - "Epoch 76/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4116 - accuracy: 0.8501 - val_loss: 1.2619 - val_accuracy: 0.6793\n", - "Epoch 77/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4146 - accuracy: 0.8500 - val_loss: 1.2497 - val_accuracy: 0.6780\n", - "Epoch 78/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3922 - accuracy: 0.8579 - val_loss: 1.2788 - val_accuracy: 0.6718\n", - "Epoch 79/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4084 - accuracy: 0.8499 - val_loss: 1.2568 - val_accuracy: 0.6876\n", - "Epoch 80/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3976 - accuracy: 0.8559 - val_loss: 1.3637 - val_accuracy: 0.6652\n", - "Epoch 81/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4061 - accuracy: 0.8511 - val_loss: 1.2873 - val_accuracy: 0.6775\n", - "Epoch 82/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3781 - accuracy: 0.8623 - val_loss: 1.3062 - val_accuracy: 0.6756\n", - "Epoch 83/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3825 - accuracy: 0.8606 - val_loss: 1.2976 - val_accuracy: 0.6825\n", - "Epoch 84/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3913 - accuracy: 0.8571 - val_loss: 1.4069 - val_accuracy: 0.6528\n", - "Epoch 85/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3876 - accuracy: 0.8591 - val_loss: 1.3395 - val_accuracy: 0.6753\n", - "Epoch 86/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3879 - accuracy: 0.8580 - val_loss: 1.3092 - val_accuracy: 0.6741\n", - "Epoch 87/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3695 - accuracy: 0.8665 - val_loss: 1.3327 - val_accuracy: 0.6762\n", - "Epoch 88/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3835 - accuracy: 0.8608 - val_loss: 1.3579 - val_accuracy: 0.6775\n", - "Epoch 89/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3816 - accuracy: 0.8619 - val_loss: 1.3944 - val_accuracy: 0.6622\n", - "Epoch 90/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3804 - accuracy: 0.8609 - val_loss: 1.3264 - val_accuracy: 0.6854\n", - "Epoch 91/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3718 - accuracy: 0.8647 - val_loss: 1.3646 - val_accuracy: 0.6713\n", - "Epoch 92/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3676 - accuracy: 0.8661 - val_loss: 1.3926 - val_accuracy: 0.6759\n", - "Epoch 93/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3767 - accuracy: 0.8623 - val_loss: 1.3605 - val_accuracy: 0.6701\n", - "Epoch 94/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3813 - accuracy: 0.8612 - val_loss: 1.3938 - val_accuracy: 0.6659\n", - "Epoch 95/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3631 - accuracy: 0.8667 - val_loss: 1.4130 - val_accuracy: 0.6749\n", - "Epoch 96/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3604 - accuracy: 0.8694 - val_loss: 1.3780 - val_accuracy: 0.6832\n", - "Epoch 97/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3657 - accuracy: 0.8666 - val_loss: 1.4425 - val_accuracy: 0.6719\n", - "Epoch 98/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3726 - accuracy: 0.8636 - val_loss: 1.4077 - val_accuracy: 0.6699\n", - "Epoch 99/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3671 - accuracy: 0.8663 - val_loss: 1.4207 - val_accuracy: 0.6769\n", - "Epoch 100/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3529 - accuracy: 0.8706 - val_loss: 1.4817 - val_accuracy: 0.6716\n", - "Finished training.\n" - ] - } - ], - "source": [ - "#@markdown Train a simple model on CIFAR10 with Keras.\n", - "\n", - "dataset = 'cifar10'\n", - "num_classes = 10\n", - "num_conv = 3\n", - "activation = 'relu'\n", - "lr = 0.02\n", - "momentum = 0.9\n", - "batch_size = 250\n", - "epochs = 100 # Privacy risks are especially visible with lots of epochs.\n", - "\n", - "\n", - "def small_cnn(input_shape: Tuple[int],\n", - " num_classes: int,\n", - " num_conv: int,\n", - " activation: Text = 'relu') -> tf.keras.models.Sequential:\n", - " \"\"\"Setup a small CNN for image classification.\n", - "\n", - " Args:\n", - " input_shape: Integer tuple for the shape of the images.\n", - " num_classes: Number of prediction classes.\n", - " num_conv: Number of convolutional layers.\n", - " activation: The activation function to use for conv and dense layers.\n", - "\n", - " Returns:\n", - " The Keras model.\n", - " \"\"\"\n", - " model = tf.keras.models.Sequential()\n", - " model.add(tf.keras.layers.Input(shape=input_shape))\n", - "\n", - " # Conv layers\n", - " for _ in range(num_conv):\n", - " model.add(tf.keras.layers.Conv2D(32, (3, 3), activation=activation))\n", - " model.add(tf.keras.layers.MaxPooling2D())\n", - "\n", - " model.add(tf.keras.layers.Flatten())\n", - " model.add(tf.keras.layers.Dense(64, activation=activation))\n", - " model.add(tf.keras.layers.Dense(num_classes))\n", - " return model\n", - "\n", - "\n", - "print('Loading the dataset.')\n", - "train_ds = tfds.as_numpy(\n", - " tfds.load(dataset, split=tfds.Split.TRAIN, batch_size=-1))\n", - "test_ds = tfds.as_numpy(\n", - " tfds.load(dataset, split=tfds.Split.TEST, batch_size=-1))\n", - "x_train = train_ds['image'].astype('float32') / 255.\n", - "y_train_indices = train_ds['label'][:, np.newaxis]\n", - "x_test = test_ds['image'].astype('float32') / 255.\n", - "y_test_indices = test_ds['label'][:, np.newaxis]\n", - "\n", - "# Convert class vectors to binary class matrices.\n", - "y_train = tf.keras.utils.to_categorical(y_train_indices, num_classes)\n", - "y_test = tf.keras.utils.to_categorical(y_test_indices, num_classes)\n", - "\n", - "input_shape = x_train.shape[1:]\n", - "\n", - "model = small_cnn(\n", - " input_shape, num_classes, num_conv=num_conv, activation=activation)\n", - "\n", - "print('learning rate %f', lr)\n", - "\n", - "optimizer = tf.keras.optimizers.SGD(lr=lr, momentum=momentum)\n", - "\n", - "loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)\n", - "model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])\n", - "model.summary()\n", - "model.fit(\n", - " x_train,\n", - " y_train,\n", - " batch_size=batch_size,\n", - " epochs=epochs,\n", - " validation_data=(x_test, y_test),\n", - " shuffle=True)\n", - "print('Finished training.')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ee-zjGGGV1DC" - }, - "source": [ - "## Calculate logits, probabilities and loss values for training and test sets.\n", - "\n", - "We will use these values later in the membership inference attack to separate training and test samples." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "cellView": "both", - "colab": {}, - "colab_type": "code", - "id": "um9r0tSiPx4u" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Predict on train...\n", - "Predict on test...\n", - "Apply softmax to get probabilities from logits...\n", - "Compute losses...\n" - ] - } - ], - "source": [ - "print('Predict on train...')\n", - "logits_train = model.predict(x_train, batch_size=batch_size)\n", - "print('Predict on test...')\n", - "logits_test = model.predict(x_test, batch_size=batch_size)\n", - "\n", - "print('Apply softmax to get probabilities from logits...')\n", - "prob_train = special.softmax(logits_train, axis=1)\n", - "prob_test = special.softmax(logits_test, axis=1)\n", - "\n", - "print('Compute losses...')\n", - "cce = tf.keras.backend.categorical_crossentropy\n", - "constant = tf.keras.backend.constant\n", - "\n", - "loss_train = cce(constant(y_train), constant(prob_train), from_logits=False).numpy()\n", - "loss_test = cce(constant(y_test), constant(prob_test), from_logits=False).numpy()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "QETxVOHLiHP4" - }, - "source": [ - "## Run membership inference attacks.\n", - "\n", - "We will now execute a membership inference attack against the previously trained CIFAR10 model. This will generate a number of scores, most notably, attacker advantage and AUC for the membership inference classifier.\n", - "\n", - "An AUC of close to 0.5 means that the attack wasn't able to identify training samples, which means that the model doesn't have privacy issues according to this test. Higher values, on the contrary, indicate potential privacy issues." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "B8NIwhVwQT7I" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Best-performing attacks over all slices\n", - " THRESHOLD_ATTACK achieved an AUC of 0.74 on slice CORRECTLY_CLASSIFIED=False\n", - " THRESHOLD_ATTACK achieved an advantage of 0.37 on slice CORRECTLY_CLASSIFIED=False\n", - "\n", - "Best-performing attacks over slice: \"Entire dataset\"\n", - " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.60\n", - " THRESHOLD_ATTACK achieved an advantage of 0.20\n", - "\n", - "Best-performing attacks over slice: \"CLASS=0\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.64\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.24\n", - "\n", - "Best-performing attacks over slice: \"CLASS=1\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.57\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.16\n", - "\n", - "Best-performing attacks over slice: \"CLASS=2\"\n", - " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.64\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.26\n", - "\n", - "Best-performing attacks over slice: \"CLASS=3\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.68\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.29\n", - "\n", - "Best-performing attacks over slice: \"CLASS=4\"\n", - " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.64\n", - " THRESHOLD_ATTACK achieved an advantage of 0.24\n", - "\n", - "Best-performing attacks over slice: \"CLASS=5\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.63\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.23\n", - "\n", - "Best-performing attacks over slice: \"CLASS=6\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.63\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.21\n", - "\n", - "Best-performing attacks over slice: \"CLASS=7\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.60\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.21\n", - "\n", - "Best-performing attacks over slice: \"CLASS=8\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.60\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.19\n", - "\n", - "Best-performing attacks over slice: \"CLASS=9\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.62\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.20\n", - "\n", - "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=True\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.50\n", - " THRESHOLD_ATTACK achieved an advantage of 0.04\n", - "\n", - "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=False\"\n", - " THRESHOLD_ATTACK achieved an AUC of 0.74\n", - " THRESHOLD_ATTACK achieved an advantage of 0.37\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackInputData\n", - "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec\n", - "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackType\n", - "\n", - "import tensorflow_privacy.privacy.membership_inference_attack.plotting as plotting\n", - "\n", - "labels_train = np.argmax(y_train, axis=1)\n", - "labels_test = np.argmax(y_test, axis=1)\n", - "\n", - "input = AttackInputData(\n", - " logits_train = logits_train,\n", - " logits_test = logits_test,\n", - " loss_train = loss_train,\n", - " loss_test = loss_test,\n", - " labels_train = labels_train,\n", - " labels_test = labels_test\n", - ")\n", - "\n", - "# Run several attacks for different data slices\n", - "attacks_result = mia.run_attacks(input,\n", - " SlicingSpec(\n", - " entire_dataset = True,\n", - " by_class = True,\n", - " by_classification_correctness = True\n", - " ),\n", - " attack_types = [\n", - " AttackType.THRESHOLD_ATTACK,\n", - " AttackType.THRESHOLD_ENTROPY_ATTACK,\n", - " AttackType.LOGISTIC_REGRESSION])\n", - "\n", - "# Plot the ROC curve of the best classifier\n", - "fig = plotting.plot_roc_curve(\n", - " attacks_result.get_result_with_max_auc().roc_curve)\n", - "\n", - "# Print a user-friendly summary of the attacks\n", - "print(attacks_result.summary(by_slices = True))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "E9zwsPGFujVq" - }, - "source": [ - "## Compute privacy risk score\n", - "\n", - "This part shows how to use the privacy risk score. (The code is preliminary, we can improve it later.)\n", - "\n", - "For each data slice, we compute privacy risk scores for both training and test data. We then set a threshold on risk scores (an input is inferred as a member if and only if its risk score is higher than the threshold) and compute the attack precision and recall values" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "For slice type: Entire dataset\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5597992410331742, 0.9146)\n", - "\n", - "For slice type: CLASS=0\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6191360891778913, 0.2666)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5744543458607775, 0.8896)\n", - "\n", - "For slice type: CLASS=1\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6059544658493871, 0.0692)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5467082383978894, 0.9118)\n", - "\n", - "For slice type: CLASS=2\n", - "with 0.8 as the threshold on privacy risk score, the precision-recall pair is (0.868421052631579, 0.0066)\n", - "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.868421052631579, 0.0066)\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6181660399190049, 0.4274)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5929882636172134, 0.7882)\n", - "\n", - "For slice type: CLASS=3\n", - "with 1 as the threshold on privacy risk score, the precision-recall pair is (1.0, 0.0016)\n", - "with 0.9 as the threshold on privacy risk score, the precision-recall pair is (1.0, 0.0016)\n", - "with 0.8 as the threshold on privacy risk score, the precision-recall pair is (1.0, 0.0016)\n", - "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.7972972972972973, 0.0118)\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6332665330661322, 0.316)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5862524785194977, 0.887)\n", - "\n", - "For slice type: CLASS=4\n", - "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.7222222222222222, 0.013)\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.61644212262854, 0.4484)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5814285714285714, 0.814)\n", - "\n", - "For slice type: CLASS=5\n", - "with 0.8 as the threshold on privacy risk score, the precision-recall pair is (0.8387096774193549, 0.0052)\n", - "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.7452229299363058, 0.0234)\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6262230919765166, 0.32)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5760075737084122, 0.8518)\n", - "\n", - "For slice type: CLASS=6\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6118458884416331, 0.2128)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5705128205128205, 0.712)\n", - "\n", - "For slice type: CLASS=7\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6164383561643836, 0.18)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5659122874312748, 0.8852)\n", - "\n", - "For slice type: CLASS=8\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5507837390085383, 0.8644)\n", - "\n", - "For slice type: CLASS=9\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6332288401253918, 0.202)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5841666666666666, 0.701)\n", - "\n", - "For slice type: CORRECTLY_CLASSIFIED=True\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.5220848110408277, 0.6059067835717582)\n", - "\n", - "For slice type: CORRECTLY_CLASSIFIED=False\n", - "with 0.7 as the threshold on privacy risk score, the precision-recall pair is (0.7104532829471387, 0.3436936936936937)\n", - "with 0.6 as the threshold on privacy risk score, the precision-recall pair is (0.6816679555870855, 0.624024024024024)\n", - "with 0.5 as the threshold on privacy risk score, the precision-recall pair is (0.6396320935483625, 0.8274774774774775)\n", - "\n" - ] - } - ], - "source": [ - "from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_single_slice_specs\n", - "from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_slice\n", - "slicing_spec = SlicingSpec(\n", - " entire_dataset = True,\n", - " by_class = True,\n", - " by_classification_correctness = True\n", - " )\n", - "input_slice_specs = get_single_slice_specs(slicing_spec, 10)\n", - "for single_slice_spec in input_slice_specs:\n", - " \n", - " attack_input_slice = get_slice(input, single_slice_spec)\n", - " risk_score_results = mia._compute_privacy_risk_score(attack_input_slice)\n", - " print(f\"For slice type: {str(risk_score_results.slice_spec)}\")\n", - " risk_score_results.print_results()\n", - " print()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [], - "last_runtime": { - "build_target": "//learning/deepmind/public/tools/ml_python:ml_notebook", - "kind": "private" - }, - "name": "Membership inference codelab", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.10" - }, - "pycharm": { - "stem_cell": { - "cell_type": "raw", - "metadata": { - "collapsed": false - }, - "source": [] - } - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb new file mode 100644 index 0000000..9809a87 --- /dev/null +++ b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb @@ -0,0 +1,804 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "1eiwVljWpzM7" + }, + "source": [ + "Copyright 2020 The TensorFlow Authors.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "cellView": "both", + "colab": {}, + "colab_type": "code", + "id": "4rmwPgXeptiS" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "YM2gRaJMqvMi" + }, + "source": [ + "# Assess privacy risks with TensorFlow Privacy Membership Inference Attacks" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "-B5ZvlSqqLaR" + }, + "source": [ + "\n", + " \n", + " \n", + "
\n", + " Run in Google Colab\n", + " \n", + " View source on GitHub\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "9rMuytY7Nn8P" + }, + "source": [ + "##Overview\n", + "In this codelab we'll train a simple image classification model on the CIFAR10 dataset, and then use the \"membership inference attack\" against this model to assess if the attacker is able to \"guess\" whether a particular sample was present in the training set. We further compute each sample's probability of being in the training set, denoted as the privacy risk score (https://arxiv.org/abs/2003.10595)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "FUWqArj_q8vs" + }, + "source": [ + "## Setup\n", + "First, set this notebook's runtime to use a GPU, under Runtime > Change runtime type > Hardware accelerator. Then, begin importing the necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "cellView": "form", + "colab": {}, + "colab_type": "code", + "id": "Lr1pwHcbralz" + }, + "outputs": [], + "source": [ + "#@title Import statements.\n", + "import numpy as np\n", + "from typing import Tuple, Text\n", + "from scipy import special\n", + "\n", + "import tensorflow as tf\n", + "import tensorflow_datasets as tfds\n", + "\n", + "# Set verbosity.\n", + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)\n", + "from warnings import simplefilter\n", + "from sklearn.exceptions import ConvergenceWarning\n", + "simplefilter(action=\"ignore\", category=ConvergenceWarning)\n", + "simplefilter(action=\"ignore\", category=FutureWarning)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ucw81ar6ru-6" + }, + "source": [ + "### Install TensorFlow Privacy." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "cellView": "both", + "colab": {}, + "colab_type": "code", + "id": "zcqAmiGH90kl" + }, + "outputs": [], + "source": [ + "!pip3 install git+https://github.com/tensorflow/privacy\n", + "\n", + "from tensorflow_privacy.privacy.membership_inference_attack import membership_inference_attack as mia" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "pBbcG86th_sW" + }, + "source": [ + "## Train a model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "cellView": "form", + "colab": {}, + "colab_type": "code", + "id": "vCyOWyyhXLib" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading the dataset.\n", + "learning rate %f 0.02\n", + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d (Conv2D) (None, 30, 30, 32) 896 \n", + "_________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 15, 15, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_1 (Conv2D) (None, 13, 13, 32) 9248 \n", + "_________________________________________________________________\n", + "max_pooling2d_1 (MaxPooling2 (None, 6, 6, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_2 (Conv2D) (None, 4, 4, 32) 9248 \n", + "_________________________________________________________________\n", + "max_pooling2d_2 (MaxPooling2 (None, 2, 2, 32) 0 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 128) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 64) 8256 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 10) 650 \n", + "=================================================================\n", + "Total params: 28,298\n", + "Trainable params: 28,298\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/100\n", + "200/200 [==============================] - 2s 8ms/step - loss: 2.0358 - accuracy: 0.2449 - val_loss: 1.7640 - val_accuracy: 0.3603\n", + "Epoch 2/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.6132 - accuracy: 0.4126 - val_loss: 1.4455 - val_accuracy: 0.4848\n", + "Epoch 3/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.4018 - accuracy: 0.4956 - val_loss: 1.3218 - val_accuracy: 0.5261\n", + "Epoch 4/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.2939 - accuracy: 0.5394 - val_loss: 1.2748 - val_accuracy: 0.5392\n", + "Epoch 5/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.2074 - accuracy: 0.5735 - val_loss: 1.1824 - val_accuracy: 0.5801\n", + "Epoch 6/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.1278 - accuracy: 0.6020 - val_loss: 1.1652 - val_accuracy: 0.5881\n", + "Epoch 7/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.0936 - accuracy: 0.6150 - val_loss: 1.1092 - val_accuracy: 0.6069\n", + "Epoch 8/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.0410 - accuracy: 0.6349 - val_loss: 1.0702 - val_accuracy: 0.6230\n", + "Epoch 9/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.9952 - accuracy: 0.6493 - val_loss: 1.0984 - val_accuracy: 0.6175\n", + "Epoch 10/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9682 - accuracy: 0.6600 - val_loss: 1.0346 - val_accuracy: 0.6408\n", + "Epoch 11/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9370 - accuracy: 0.6719 - val_loss: 1.0140 - val_accuracy: 0.6442\n", + "Epoch 12/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9146 - accuracy: 0.6792 - val_loss: 0.9974 - val_accuracy: 0.6564\n", + "Epoch 13/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8839 - accuracy: 0.6880 - val_loss: 1.0525 - val_accuracy: 0.6343\n", + "Epoch 14/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8554 - accuracy: 0.7000 - val_loss: 1.0280 - val_accuracy: 0.6574\n", + "Epoch 15/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8444 - accuracy: 0.7030 - val_loss: 0.9596 - val_accuracy: 0.6697\n", + "Epoch 16/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8255 - accuracy: 0.7095 - val_loss: 0.9406 - val_accuracy: 0.6798\n", + "Epoch 17/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8038 - accuracy: 0.7172 - val_loss: 1.0018 - val_accuracy: 0.6632\n", + "Epoch 18/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8045 - accuracy: 0.7172 - val_loss: 0.9343 - val_accuracy: 0.6810\n", + "Epoch 19/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7672 - accuracy: 0.7308 - val_loss: 0.9666 - val_accuracy: 0.6752\n", + "Epoch 20/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7660 - accuracy: 0.7309 - val_loss: 0.9823 - val_accuracy: 0.6676\n", + "Epoch 21/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7396 - accuracy: 0.7391 - val_loss: 0.9548 - val_accuracy: 0.6777\n", + "Epoch 22/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.7285 - accuracy: 0.7415 - val_loss: 0.9568 - val_accuracy: 0.6856\n", + "Epoch 23/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.7235 - accuracy: 0.7454 - val_loss: 0.9302 - val_accuracy: 0.6886\n", + "Epoch 24/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7017 - accuracy: 0.7525 - val_loss: 0.9557 - val_accuracy: 0.6867\n", + "Epoch 25/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6921 - accuracy: 0.7562 - val_loss: 0.9379 - val_accuracy: 0.6921\n", + "Epoch 26/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6752 - accuracy: 0.7606 - val_loss: 0.9930 - val_accuracy: 0.6720\n", + "Epoch 27/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6769 - accuracy: 0.7590 - val_loss: 0.9484 - val_accuracy: 0.6923\n", + "Epoch 28/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6629 - accuracy: 0.7656 - val_loss: 0.9388 - val_accuracy: 0.6917\n", + "Epoch 29/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6571 - accuracy: 0.7672 - val_loss: 0.9473 - val_accuracy: 0.6898\n", + "Epoch 30/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.6494 - accuracy: 0.7690 - val_loss: 0.9819 - val_accuracy: 0.6849\n", + "Epoch 31/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6554 - accuracy: 0.7663 - val_loss: 0.9548 - val_accuracy: 0.6901\n", + "Epoch 32/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6218 - accuracy: 0.7806 - val_loss: 0.9712 - val_accuracy: 0.6741\n", + "Epoch 33/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6199 - accuracy: 0.7808 - val_loss: 0.9795 - val_accuracy: 0.6824\n", + "Epoch 34/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6096 - accuracy: 0.7825 - val_loss: 0.9969 - val_accuracy: 0.6802\n", + "Epoch 35/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6156 - accuracy: 0.7806 - val_loss: 0.9656 - val_accuracy: 0.6839\n", + "Epoch 36/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5957 - accuracy: 0.7885 - val_loss: 0.9679 - val_accuracy: 0.6905\n", + "Epoch 37/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5996 - accuracy: 0.7862 - val_loss: 1.0140 - val_accuracy: 0.6847\n", + "Epoch 38/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5943 - accuracy: 0.7890 - val_loss: 0.9588 - val_accuracy: 0.6992\n", + "Epoch 39/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5895 - accuracy: 0.7924 - val_loss: 1.0227 - val_accuracy: 0.6876\n", + "Epoch 40/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5755 - accuracy: 0.7959 - val_loss: 0.9813 - val_accuracy: 0.6912\n", + "Epoch 41/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5767 - accuracy: 0.7946 - val_loss: 1.0326 - val_accuracy: 0.6819\n", + "Epoch 42/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5606 - accuracy: 0.7993 - val_loss: 1.1191 - val_accuracy: 0.6622\n", + "Epoch 43/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5489 - accuracy: 0.8054 - val_loss: 1.0608 - val_accuracy: 0.6795\n", + "Epoch 44/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5465 - accuracy: 0.8066 - val_loss: 1.0195 - val_accuracy: 0.6887\n", + "Epoch 45/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5403 - accuracy: 0.8073 - val_loss: 1.0288 - val_accuracy: 0.6901\n", + "Epoch 46/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5375 - accuracy: 0.8092 - val_loss: 1.0732 - val_accuracy: 0.6793\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 47/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5312 - accuracy: 0.8089 - val_loss: 1.0477 - val_accuracy: 0.6851\n", + "Epoch 48/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5348 - accuracy: 0.8073 - val_loss: 1.0623 - val_accuracy: 0.6823\n", + "Epoch 49/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.5392 - accuracy: 0.8071 - val_loss: 1.0662 - val_accuracy: 0.6852\n", + "Epoch 50/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5270 - accuracy: 0.8115 - val_loss: 1.0746 - val_accuracy: 0.6802\n", + "Epoch 51/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5112 - accuracy: 0.8167 - val_loss: 1.0665 - val_accuracy: 0.6789\n", + "Epoch 52/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5082 - accuracy: 0.8185 - val_loss: 1.0820 - val_accuracy: 0.6839\n", + "Epoch 53/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5062 - accuracy: 0.8195 - val_loss: 1.1127 - val_accuracy: 0.6836\n", + "Epoch 54/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5046 - accuracy: 0.8194 - val_loss: 1.1327 - val_accuracy: 0.6810\n", + "Epoch 55/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4952 - accuracy: 0.8237 - val_loss: 1.0908 - val_accuracy: 0.6868\n", + "Epoch 56/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5086 - accuracy: 0.8181 - val_loss: 1.0766 - val_accuracy: 0.6876\n", + "Epoch 57/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4831 - accuracy: 0.8266 - val_loss: 1.1173 - val_accuracy: 0.6884\n", + "Epoch 58/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4883 - accuracy: 0.8230 - val_loss: 1.1164 - val_accuracy: 0.6855\n", + "Epoch 59/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4881 - accuracy: 0.8249 - val_loss: 1.1151 - val_accuracy: 0.6828\n", + "Epoch 60/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4891 - accuracy: 0.8250 - val_loss: 1.1092 - val_accuracy: 0.6842\n", + "Epoch 61/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4806 - accuracy: 0.8279 - val_loss: 1.1259 - val_accuracy: 0.6821\n", + "Epoch 62/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4816 - accuracy: 0.8267 - val_loss: 1.1461 - val_accuracy: 0.6736\n", + "Epoch 63/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4599 - accuracy: 0.8349 - val_loss: 1.1267 - val_accuracy: 0.6877\n", + "Epoch 64/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4650 - accuracy: 0.8325 - val_loss: 1.1498 - val_accuracy: 0.6827\n", + "Epoch 65/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4720 - accuracy: 0.8303 - val_loss: 1.1468 - val_accuracy: 0.6819\n", + "Epoch 66/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4769 - accuracy: 0.8293 - val_loss: 1.1620 - val_accuracy: 0.6857\n", + "Epoch 67/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4621 - accuracy: 0.8326 - val_loss: 1.1993 - val_accuracy: 0.6746\n", + "Epoch 68/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4496 - accuracy: 0.8381 - val_loss: 1.1665 - val_accuracy: 0.6803\n", + "Epoch 69/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4463 - accuracy: 0.8378 - val_loss: 1.2094 - val_accuracy: 0.6858\n", + "Epoch 70/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4453 - accuracy: 0.8399 - val_loss: 1.2300 - val_accuracy: 0.6736\n", + "Epoch 71/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4554 - accuracy: 0.8365 - val_loss: 1.1662 - val_accuracy: 0.6776\n", + "Epoch 72/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4416 - accuracy: 0.8411 - val_loss: 1.2145 - val_accuracy: 0.6784\n", + "Epoch 73/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4474 - accuracy: 0.8381 - val_loss: 1.2112 - val_accuracy: 0.6781\n", + "Epoch 74/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4365 - accuracy: 0.8422 - val_loss: 1.2111 - val_accuracy: 0.6738\n", + "Epoch 75/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4354 - accuracy: 0.8431 - val_loss: 1.2956 - val_accuracy: 0.6663\n", + "Epoch 76/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4268 - accuracy: 0.8457 - val_loss: 1.2118 - val_accuracy: 0.6826\n", + "Epoch 77/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4190 - accuracy: 0.8479 - val_loss: 1.2825 - val_accuracy: 0.6732\n", + "Epoch 78/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4423 - accuracy: 0.8407 - val_loss: 1.2410 - val_accuracy: 0.6757\n", + "Epoch 79/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4301 - accuracy: 0.8438 - val_loss: 1.2291 - val_accuracy: 0.6786\n", + "Epoch 80/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4337 - accuracy: 0.8418 - val_loss: 1.2695 - val_accuracy: 0.6854\n", + "Epoch 81/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4209 - accuracy: 0.8480 - val_loss: 1.2480 - val_accuracy: 0.6764\n", + "Epoch 82/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4267 - accuracy: 0.8456 - val_loss: 1.2956 - val_accuracy: 0.6762\n", + "Epoch 83/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4112 - accuracy: 0.8517 - val_loss: 1.2998 - val_accuracy: 0.6745\n", + "Epoch 84/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4202 - accuracy: 0.8487 - val_loss: 1.2688 - val_accuracy: 0.6775\n", + "Epoch 85/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4338 - accuracy: 0.8434 - val_loss: 1.3085 - val_accuracy: 0.6786\n", + "Epoch 86/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4105 - accuracy: 0.8525 - val_loss: 1.3298 - val_accuracy: 0.6762\n", + "Epoch 87/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4154 - accuracy: 0.8493 - val_loss: 1.2965 - val_accuracy: 0.6755\n", + "Epoch 88/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4042 - accuracy: 0.8543 - val_loss: 1.3223 - val_accuracy: 0.6790\n", + "Epoch 89/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4088 - accuracy: 0.8523 - val_loss: 1.3251 - val_accuracy: 0.6754\n", + "Epoch 90/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4008 - accuracy: 0.8557 - val_loss: 1.2946 - val_accuracy: 0.6830\n", + "Epoch 91/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4057 - accuracy: 0.8530 - val_loss: 1.3121 - val_accuracy: 0.6815\n", + "Epoch 92/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4049 - accuracy: 0.8543 - val_loss: 1.3541 - val_accuracy: 0.6765\n", + "Epoch 93/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4090 - accuracy: 0.8529 - val_loss: 1.2951 - val_accuracy: 0.6746\n", + "Epoch 94/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4057 - accuracy: 0.8545 - val_loss: 1.3573 - val_accuracy: 0.6743\n", + "Epoch 95/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4067 - accuracy: 0.8524 - val_loss: 1.3811 - val_accuracy: 0.6710\n", + "Epoch 96/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3892 - accuracy: 0.8591 - val_loss: 1.3791 - val_accuracy: 0.6712\n", + "Epoch 97/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3978 - accuracy: 0.8550 - val_loss: 1.3702 - val_accuracy: 0.6680\n", + "Epoch 98/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4045 - accuracy: 0.8554 - val_loss: 1.4202 - val_accuracy: 0.6670\n", + "Epoch 99/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3891 - accuracy: 0.8602 - val_loss: 1.3683 - val_accuracy: 0.6712\n", + "Epoch 100/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4081 - accuracy: 0.8506 - val_loss: 1.3715 - val_accuracy: 0.6707\n", + "Finished training.\n" + ] + } + ], + "source": [ + "#@markdown Train a simple model on CIFAR10 with Keras.\n", + "\n", + "dataset = 'cifar10'\n", + "num_classes = 10\n", + "num_conv = 3\n", + "activation = 'relu'\n", + "lr = 0.02\n", + "momentum = 0.9\n", + "batch_size = 250\n", + "epochs = 100 # Privacy risks are especially visible with lots of epochs.\n", + "\n", + "\n", + "def small_cnn(input_shape: Tuple[int],\n", + " num_classes: int,\n", + " num_conv: int,\n", + " activation: Text = 'relu') -> tf.keras.models.Sequential:\n", + " \"\"\"Setup a small CNN for image classification.\n", + "\n", + " Args:\n", + " input_shape: Integer tuple for the shape of the images.\n", + " num_classes: Number of prediction classes.\n", + " num_conv: Number of convolutional layers.\n", + " activation: The activation function to use for conv and dense layers.\n", + "\n", + " Returns:\n", + " The Keras model.\n", + " \"\"\"\n", + " model = tf.keras.models.Sequential()\n", + " model.add(tf.keras.layers.Input(shape=input_shape))\n", + "\n", + " # Conv layers\n", + " for _ in range(num_conv):\n", + " model.add(tf.keras.layers.Conv2D(32, (3, 3), activation=activation))\n", + " model.add(tf.keras.layers.MaxPooling2D())\n", + "\n", + " model.add(tf.keras.layers.Flatten())\n", + " model.add(tf.keras.layers.Dense(64, activation=activation))\n", + " model.add(tf.keras.layers.Dense(num_classes))\n", + " return model\n", + "\n", + "\n", + "print('Loading the dataset.')\n", + "train_ds = tfds.as_numpy(\n", + " tfds.load(dataset, split=tfds.Split.TRAIN, batch_size=-1))\n", + "test_ds = tfds.as_numpy(\n", + " tfds.load(dataset, split=tfds.Split.TEST, batch_size=-1))\n", + "x_train = train_ds['image'].astype('float32') / 255.\n", + "y_train_indices = train_ds['label'][:, np.newaxis]\n", + "x_test = test_ds['image'].astype('float32') / 255.\n", + "y_test_indices = test_ds['label'][:, np.newaxis]\n", + "\n", + "# Convert class vectors to binary class matrices.\n", + "y_train = tf.keras.utils.to_categorical(y_train_indices, num_classes)\n", + "y_test = tf.keras.utils.to_categorical(y_test_indices, num_classes)\n", + "\n", + "input_shape = x_train.shape[1:]\n", + "\n", + "model = small_cnn(\n", + " input_shape, num_classes, num_conv=num_conv, activation=activation)\n", + "\n", + "print('learning rate %f', lr)\n", + "\n", + "optimizer = tf.keras.optimizers.SGD(lr=lr, momentum=momentum)\n", + "\n", + "loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)\n", + "model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])\n", + "model.summary()\n", + "model.fit(\n", + " x_train,\n", + " y_train,\n", + " batch_size=batch_size,\n", + " epochs=epochs,\n", + " validation_data=(x_test, y_test),\n", + " shuffle=True)\n", + "print('Finished training.')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ee-zjGGGV1DC" + }, + "source": [ + "## Calculate logits, probabilities and loss values for training and test sets.\n", + "\n", + "We will use these values later in the membership inference attack and privacy risk score analysis to separate training and test samples." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "cellView": "both", + "colab": {}, + "colab_type": "code", + "id": "um9r0tSiPx4u" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predict on train...\n", + "Predict on test...\n", + "Apply softmax to get probabilities from logits...\n", + "Compute losses...\n" + ] + } + ], + "source": [ + "print('Predict on train...')\n", + "logits_train = model.predict(x_train, batch_size=batch_size)\n", + "print('Predict on test...')\n", + "logits_test = model.predict(x_test, batch_size=batch_size)\n", + "\n", + "print('Apply softmax to get probabilities from logits...')\n", + "prob_train = special.softmax(logits_train, axis=1)\n", + "prob_test = special.softmax(logits_test, axis=1)\n", + "\n", + "print('Compute losses...')\n", + "cce = tf.keras.backend.categorical_crossentropy\n", + "constant = tf.keras.backend.constant\n", + "\n", + "loss_train = cce(constant(y_train), constant(prob_train), from_logits=False).numpy()\n", + "loss_test = cce(constant(y_test), constant(prob_test), from_logits=False).numpy()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "QETxVOHLiHP4" + }, + "source": [ + "## Run membership inference attacks.\n", + "\n", + "We will now execute a membership inference attack against the previously trained CIFAR10 model. This will generate a number of scores, most notably, attacker advantage and AUC for the membership inference classifier.\n", + "\n", + "An AUC of close to 0.5 means that the attack wasn't able to identify training samples, which means that the model doesn't have privacy issues according to this test. Higher values, on the contrary, indicate potential privacy issues." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "B8NIwhVwQT7I" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best-performing attacks over all slices\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.74 on slice CORRECTLY_CLASSIFIED=False\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.40 on slice CORRECTLY_CLASSIFIED=False\n", + "\n", + "Best-performing attacks over slice: \"Entire dataset\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.61\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.21\n", + "\n", + "Best-performing attacks over slice: \"CLASS=0\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.66\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.25\n", + "\n", + "Best-performing attacks over slice: \"CLASS=1\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.58\n", + " THRESHOLD_ATTACK achieved an advantage of 0.17\n", + "\n", + "Best-performing attacks over slice: \"CLASS=2\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.66\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.31\n", + "\n", + "Best-performing attacks over slice: \"CLASS=3\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.71\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.35\n", + "\n", + "Best-performing attacks over slice: \"CLASS=4\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.64\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.25\n", + "\n", + "Best-performing attacks over slice: \"CLASS=5\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.65\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.26\n", + "\n", + "Best-performing attacks over slice: \"CLASS=6\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.60\n", + " THRESHOLD_ATTACK achieved an advantage of 0.16\n", + "\n", + "Best-performing attacks over slice: \"CLASS=7\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.61\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.25\n", + "\n", + "Best-performing attacks over slice: \"CLASS=8\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.58\n", + " THRESHOLD_ATTACK achieved an advantage of 0.16\n", + "\n", + "Best-performing attacks over slice: \"CLASS=9\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.59\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.19\n", + "\n", + "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=True\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.51\n", + " THRESHOLD_ATTACK achieved an advantage of 0.05\n", + "\n", + "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=False\"\n", + " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.75\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.40\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackInputData\n", + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec\n", + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackType\n", + "\n", + "import tensorflow_privacy.privacy.membership_inference_attack.plotting as plotting\n", + "\n", + "labels_train = np.argmax(y_train, axis=1)\n", + "labels_test = np.argmax(y_test, axis=1)\n", + "\n", + "input = AttackInputData(\n", + " logits_train = logits_train,\n", + " logits_test = logits_test,\n", + " loss_train = loss_train,\n", + " loss_test = loss_test,\n", + " labels_train = labels_train,\n", + " labels_test = labels_test\n", + ")\n", + "\n", + "# Run several attacks for different data slices\n", + "attacks_result = mia.run_attacks(input,\n", + " SlicingSpec(\n", + " entire_dataset = True,\n", + " by_class = True,\n", + " by_classification_correctness = True\n", + " ),\n", + " attack_types = [\n", + " AttackType.THRESHOLD_ATTACK,\n", + " AttackType.THRESHOLD_ENTROPY_ATTACK,\n", + " AttackType.LOGISTIC_REGRESSION])\n", + "\n", + "# Plot the ROC curve of the best classifier\n", + "fig = plotting.plot_roc_curve(\n", + " attacks_result.get_result_with_max_auc().roc_curve)\n", + "\n", + "# Print a user-friendly summary of the attacks\n", + "print(attacks_result.summary(by_slices = True))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "E9zwsPGFujVq" + }, + "source": [ + "## Compute privacy risk score\n", + "\n", + "This part shows how to use the privacy risk score.\n", + "\n", + "For each data slice, we compute privacy risk scores for both training and test data. We then set a threshold on risk scores (an input is inferred as a member if and only if its risk score is higher than the threshold) and compute the attack precision and recall values" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Privacy risk score analysis over slice: \"Entire dataset\"\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56143, 0.92450)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=0\"\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62567, 0.16380)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56207, 0.89200)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=1\"\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61458, 0.29340)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56183, 0.79240)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=2\"\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.63724, 0.56740)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.61159, 0.84400)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=3\"\n", + " with 1.00000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00100)\n", + " with 0.90000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00100)\n", + " with 0.80000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00100)\n", + " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (0.77273, 0.00340)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.65255, 0.35120)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.60833, 0.77660)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=4\"\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61174, 0.41280)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.59076, 0.74920)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=5\"\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.60540, 0.34520)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.58148, 0.89060)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=6\"\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.60929, 0.10760)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57011, 0.69360)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=7\"\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61250, 0.29400)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56678, 0.85040)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=8\"\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.54417, 0.92520)\n", + "\n", + "Privacy risk score analysis over slice: \"CLASS=9\"\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61538, 0.08640)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56456, 0.78440)\n", + "\n", + "Privacy risk score analysis over slice: \"CORRECTLY_CLASSIFIED=True\"\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.52433, 0.59775)\n", + "\n", + "Privacy risk score analysis over slice: \"CORRECTLY_CLASSIFIED=False\"\n", + " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (0.70957, 0.36504)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.68111, 0.67130)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.63809, 0.87166)\n" + ] + } + ], + "source": [ + "# compute privacy risk scores on all given data slices\n", + "risk_score_results = mia.privacy_risk_score_analysis(input,\n", + " SlicingSpec(\n", + " entire_dataset = True,\n", + " by_class = True,\n", + " by_classification_correctness = True))\n", + "# print the summary of privacy risk score analysis\n", + "print(risk_score_results.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "last_runtime": { + "build_target": "//learning/deepmind/public/tools/ml_python:ml_notebook", + "kind": "private" + }, + "name": "Membership inference codelab", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 60f63408e9010dd2be4eaf63b11a6cd473dce7aa Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 10 Dec 2020 18:33:35 -0500 Subject: [PATCH 10/20] Update privacy_risk_score_codelab.ipynb --- .../codelabs/privacy_risk_score_codelab.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb index 9809a87..e400289 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb +++ b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb @@ -769,7 +769,7 @@ "build_target": "//learning/deepmind/public/tools/ml_python:ml_notebook", "kind": "private" }, - "name": "Membership inference codelab", + "name": "Membership inference privacy risk score codelab", "provenance": [] }, "kernelspec": { From d6d70f6211abb577a8144cac66c5a86a69dec61b Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 10 Dec 2020 18:44:52 -0500 Subject: [PATCH 11/20] update data_structures_test --- .../membership_inference_attack/data_structures_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py index 76df7fc..d0dd7a8 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py @@ -299,8 +299,8 @@ class SingleRiskScoreResultTest(absltest.TestCase): train_risk_scores=np.array([0.91,1,0.92,0.82,0.75]), test_risk_scores=np.array([0.81,0.7,0.75,0.25,0.3])) - self.assertEqual(result.attack_with_varied_thresholds([0.8,0.7])[1], [0.8,0.625]) - self.assertEqual(result.attack_with_varied_thresholds([0.8,0.7])[2], [0.8,1]) + self.assertEqual(result.attack_with_varied_thresholds(np.array([0.8,0.7]))[1].tolist(), [0.8,0.625]) + self.assertEqual(result.attack_with_varied_thresholds(np.array([0.8,0.7]))[2].tolist(), [0.8,1]) class AttackResultsCollectionTest(absltest.TestCase): From 3f40b8c465e01fd88c2ab0953d0669fcbbf6b863 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Mon, 14 Dec 2020 14:49:30 -0500 Subject: [PATCH 12/20] update attack code --- .../membership_inference_attack.py | 49 ------------------- 1 file changed, 49 deletions(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py index ccecbd5..28ddc75 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py @@ -30,7 +30,6 @@ from tensorflow_privacy.privacy.membership_inference_attack.data_structures impo from tensorflow_privacy.privacy.membership_inference_attack.data_structures import \ PrivacyReportMetadata from tensorflow_privacy.privacy.membership_inference_attack.data_structures import RocCurve -from tensorflow_privacy.privacy.membership_inference_attack.data_structures import Seq2SeqAttackInputData from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleAttackResult from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleSliceSpec from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec @@ -175,54 +174,6 @@ def run_attacks(attack_input: AttackInputData, privacy_report_metadata=privacy_report_metadata) -def run_seq2seq_attack(attack_input: Seq2SeqAttackInputData, - unused_report_metadata: PrivacyReportMetadata = None, - balance_attacker_training: bool = True) -> AttackResults: - """Runs membership inference attacks on a seq2seq model. - - Args: - attack_input: input data for running an attack - unused_report_metadata: the metadata of the model under attack. - balance_attacker_training: Whether the training and test sets for the - membership inference attacker should have a balanced (roughly equal) - number of samples from the training and test sets used to develop the - model under attack. - - Returns: - the attack result. - """ - attack_input.validate() - - # The attacker uses the average rank (a single number) of a seq2seq dataset - # record to determine membership. So only Logistic Regression is supported, - # as it makes the most sense for single-number features. - attacker = models.LogisticRegressionAttacker() - - prepared_attacker_data = models.create_seq2seq_attacker_data( - attack_input, balance=balance_attacker_training) - - attacker.train_model(prepared_attacker_data.features_train, - prepared_attacker_data.is_training_labels_train) - - # Run the attacker on (permuted) test examples. - predictions_test = attacker.predict(prepared_attacker_data.features_test) - - # Generate ROC curves with predictions. - fpr, tpr, thresholds = metrics.roc_curve( - prepared_attacker_data.is_training_labels_test, predictions_test) - - roc_curve = RocCurve(tpr=tpr, fpr=fpr, thresholds=thresholds) - - attack_results = [ - SingleAttackResult( - slice_spec=SingleSliceSpec(), - attack_type=AttackType.LOGISTIC_REGRESSION, - roc_curve=roc_curve) - ] - - return AttackResults(single_attack_results=attack_results) - - def _compute_privacy_risk_score(attack_input: AttackInputData, num_bins: int = 15) -> SingleRiskScoreResult: """compute each individual point's likelihood of being a member (https://arxiv.org/abs/2003.10595) From 2312192573fcaea997da085638675bef34eef30b Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Mon, 14 Dec 2020 15:02:56 -0500 Subject: [PATCH 13/20] update test code --- .../membership_inference_attack_test.py | 98 ------------------- 1 file changed, 98 deletions(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py index fd4db2b..be3092a 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py @@ -19,7 +19,6 @@ import numpy as np from tensorflow_privacy.privacy.membership_inference_attack import membership_inference_attack as mia from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackInputData from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackType -from tensorflow_privacy.privacy.membership_inference_attack.data_structures import Seq2SeqAttackInputData from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleSliceSpec from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingFeature from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec @@ -35,67 +34,6 @@ def get_test_input(n_train, n_test): labels_test=np.array([i % 5 for i in range(n_test)])) -def get_seq2seq_test_input(n_train, - n_test, - max_seq_in_batch, - max_tokens_in_sequence, - vocab_size, - seed=None): - """Returns example inputs for attacks on seq2seq models.""" - if seed is not None: - np.random.seed(seed=seed) - - logits_train, labels_train = [], [] - for _ in range(n_train): - num_sequences = np.random.choice(max_seq_in_batch, 1)[0] + 1 - batch_logits, batch_labels = _get_batch_logits_and_labels( - num_sequences, max_tokens_in_sequence, vocab_size) - logits_train.append(batch_logits) - labels_train.append(batch_labels) - - logits_test, labels_test = [], [] - for _ in range(n_test): - num_sequences = np.random.choice(max_seq_in_batch, 1)[0] + 1 - batch_logits, batch_labels = _get_batch_logits_and_labels( - num_sequences, max_tokens_in_sequence, vocab_size) - logits_test.append(batch_logits) - labels_test.append(batch_labels) - - return Seq2SeqAttackInputData( - logits_train=iter(logits_train), - logits_test=iter(logits_test), - labels_train=iter(labels_train), - labels_test=iter(labels_test), - vocab_size=vocab_size, - train_size=n_train, - test_size=n_test) - - -def _get_batch_logits_and_labels(num_sequences, max_tokens_in_sequence, - vocab_size): - num_tokens_in_sequence = np.random.choice(max_tokens_in_sequence, - num_sequences) + 1 - batch_logits, batch_labels = [], [] - for num_tokens in num_tokens_in_sequence: - logits, labels = _get_sequence_logits_and_labels(num_tokens, vocab_size) - batch_logits.append(logits) - batch_labels.append(labels) - return np.array( - batch_logits, dtype=object), np.array( - batch_labels, dtype=object) - - -def _get_sequence_logits_and_labels(num_tokens, vocab_size): - sequence_logits = [] - for _ in range(num_tokens): - token_logits = np.random.random(vocab_size) - token_logits /= token_logits.sum() - sequence_logits.append(token_logits) - sequence_labels = np.random.choice(vocab_size, num_tokens) - return np.array( - sequence_logits, dtype=np.float32), np.array( - sequence_labels, dtype=np.float32) - class RunAttacksTest(absltest.TestCase): @@ -160,42 +98,6 @@ class RunAttacksTest(absltest.TestCase): # If accuracy is already present, simply return it. self.assertIsNone(mia._get_accuracy(None, labels)) - def test_run_seq2seq_attack_size(self): - result = mia.run_seq2seq_attack( - get_seq2seq_test_input( - n_train=10, - n_test=5, - max_seq_in_batch=3, - max_tokens_in_sequence=5, - vocab_size=2)) - - self.assertLen(result.single_attack_results, 1) - - def test_run_seq2seq_attack_trained_sets_attack_type(self): - result = mia.run_seq2seq_attack( - get_seq2seq_test_input( - n_train=10, - n_test=5, - max_seq_in_batch=3, - max_tokens_in_sequence=5, - vocab_size=2)) - seq2seq_result = list(result.single_attack_results)[0] - self.assertEqual(seq2seq_result.attack_type, AttackType.LOGISTIC_REGRESSION) - - def test_run_seq2seq_attack_calculates_correct_auc(self): - result = mia.run_seq2seq_attack( - get_seq2seq_test_input( - n_train=20, - n_test=10, - max_seq_in_batch=3, - max_tokens_in_sequence=5, - vocab_size=3, - seed=12345), - balance_attacker_training=False) - seq2seq_result = list(result.single_attack_results)[0] - np.testing.assert_almost_equal( - seq2seq_result.roc_curve.get_auc(), 0.63, decimal=2) - def test_run_compute_privacy_risk_score_correct_score(self): result = mia._compute_privacy_risk_score( AttackInputData( From a4d108f270830ddacb24a7caf339898564ca9d78 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Wed, 16 Dec 2020 15:47:15 -0500 Subject: [PATCH 14/20] update code --- .../data_structures.py | 30 +++++++------ .../data_structures_test.py | 4 +- .../membership_inference_attack.py | 42 +++++++++++-------- 3 files changed, 44 insertions(+), 32 deletions(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index 06670a6..cc1557f 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -462,21 +462,28 @@ class SingleRiskScoreResult: and further compute precision and recall values. We skip the threshold value if it is larger than every sample's privacy risk score. """ + fpr, tpr, thresholds = metrics.roc_curve( + np.concatenate((np.ones(len(self.train_risk_scores)), + np.zeros(len(self.test_risk_scores)))), + np.concatenate((self.train_risk_scores, self.test_risk_scores)), + drop_intermediate=False) + precision_list = [] recall_list = [] meaningful_threshold_list = [] + max_risk_score = max(train_risk_scores.max(), test_risk_scores.max()) for threshold in threshold_list: - true_positive_normalized = np.sum(self.train_risk_scores>=threshold)/(len(self.train_risk_scores)+0.0) - false_positive_normalized = np.sum(self.test_risk_scores>=threshold)/(len(self.test_risk_scores)+0.0) - if true_positive_normalized+false_positive_normalized>0: - meaningful_threshold_list.append(threshold) - precision_list.append(true_positive_normalized/(true_positive_normalized+false_positive_normalized+0.0)) - recall_list.append(true_positive_normalized) + if threshold <= max_risk_score: + idx = np.argwhere(thresholds>=threshold)[-1][0] + meaningful_threshold_list.append(threshold) + precision_list.append(tpr[idx]/(tpr[idx]+fpr[idx])) + recall_list.append(tpr[idx]) + return np.array(meaningful_threshold_list), np.array(precision_list), np.array(recall_list) - def collect_results(self, threshold_list=np.array([1,0.9,0.8,0.7,0.6,0.5])): + def collect_results(self, threshold_list): """ The privacy risk score (from 0 to 1) represents each sample's probability of being in the training set. - Here, we choose a list of threshold values from 0.5 (uncertain of training or test) to 1 (100% certain of training) + Usually, we choose a list of threshold values from 0.5 (uncertain of training or test) to 1 (100% certain of training) to compute corresponding attack precision and recall. """ meaningful_threshold_list, precision_list, recall_list = self.attack_with_varied_thresholds(threshold_list) @@ -496,14 +503,13 @@ class RiskScoreResults: risk_score_results: Iterable[SingleRiskScoreResult] - def summary(self): + def summary(self, threshold_list): """ return the summary of privacy risk score analysis on all given data slices """ summary = [] for single_result in self.risk_score_results: - single_summary = single_result.collect_results() - for line in single_summary: - summary.append(line) + single_summary = single_result.collect_results(threshold_list) + summary.extend(single_summary) return '\n'.join(summary) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py index 67c959d..d61c5ca 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py @@ -229,8 +229,8 @@ class SingleRiskScoreResultTest(absltest.TestCase): train_risk_scores=np.array([0.91,1,0.92,0.82,0.75]), test_risk_scores=np.array([0.81,0.7,0.75,0.25,0.3])) - self.assertEqual(result.attack_with_varied_thresholds(np.array([0.8,0.7]))[1].tolist(), [0.8,0.625]) - self.assertEqual(result.attack_with_varied_thresholds(np.array([0.8,0.7]))[2].tolist(), [0.8,1]) + self.assertEqual(result.attack_with_varied_thresholds(threshold_list=np.array([0.8,0.7]))[1].tolist(), [0.8,0.625]) + self.assertEqual(result.attack_with_varied_thresholds(threshold_list=np.array([0.8,0.7]))[2].tolist(), [0.8,1]) class AttackResultsCollectionTest(absltest.TestCase): diff --git a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py index d17f99d..7b51b81 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py @@ -176,10 +176,13 @@ def run_attacks(attack_input: AttackInputData, def _compute_privacy_risk_score(attack_input: AttackInputData, num_bins: int = 15) -> SingleRiskScoreResult: - """compute each individual point's likelihood of being a member (https://arxiv.org/abs/2003.10595) + """Computes each individual point's likelihood of being a member (https://arxiv.org/abs/2003.10595). + For an individual sample, its privacy risk score is computed as the posterior probability of being in the training set + after observing its prediction output by the target machine learning model. + Args: attack_input: input data for compute privacy risk scores - num_bins: the number of bins used to compute the training/test histogram; we set the default as 15 + num_bins: the number of bins used to compute the training/test histogram Returns: privacy risk score results @@ -188,28 +191,31 @@ def _compute_privacy_risk_score(attack_input: AttackInputData, # If the loss or the entropy is provided, just use it; # Otherwise, call the function to compute the loss (you can also choose to compute entropy) if attack_input.loss_train is not None and attack_input.loss_test is not None: - train_values, test_values = attack_input.loss_train, attack_input.loss_test + train_values = attack_input.loss_train + test_values = attack_input.loss_test elif attack_input.entropy_train is not None and attack_input.entropy_test is not None: - train_values, test_values = attack_input.entropy_train, attack_input.entropy_test + train_values = attack_input.entropy_train + test_values = attack_input.entropy_test else: - train_values, test_values = attack_input.get_loss_train(), attack_input.get_loss_test() + train_values = attack_input.get_loss_train() + test_values = attack_input.get_loss_test() # Compute the histogram in the log scale small_value = 1e-10 - train_log_values = np.log(np.maximum(train_values, small_value)) - test_log_values = np.log(np.maximum(test_values, small_value)) + train_values = np.maximum(train_values, small_value) + test_values = np.maximum(test_values, small_value) - min_log_value = np.amin(np.concatenate((train_log_values, test_log_values))) - max_log_value = np.amax(np.concatenate((train_log_values, test_log_values))) - bins_hist = np.linspace(min_log_value, max_log_value, num_bins+1) + min_value = min(train_values.min(), test_values.min()) + max_value = max(train_values.max(), test_values.max()) + bins_hist = np.logspace(np.log10(min_value), np.log10(max_value), num_bins+1) - train_hist, _ = np.histogram(train_log_values, bins=bins_hist) - train_hist = train_hist/(len(train_log_values)+0.0) - train_hist_indices = np.fmin(np.digitize(train_log_values, bins=bins_hist),num_bins)-1 + train_hist, _ = np.histogram(train_values, bins=bins_hist) + train_hist = train_hist/(len(train_values)+0.0) + train_hist_indices = np.fmin(np.digitize(train_values, bins=bins_hist),num_bins)-1 - test_hist, _ = np.histogram(test_log_values, bins=bins_hist) - test_hist = test_hist/(len(test_log_values)+0.0) - test_hist_indices = np.fmin(np.digitize(test_log_values, bins=bins_hist),num_bins)-1 + test_hist, _ = np.histogram(test_values, bins=bins_hist) + test_hist = test_hist/(len(test_values)+0.0) + test_hist_indices = np.fmin(np.digitize(test_values, bins=bins_hist),num_bins)-1 combined_hist = train_hist+test_hist combined_hist[combined_hist==0] = small_value @@ -224,8 +230,8 @@ def _compute_privacy_risk_score(attack_input: AttackInputData, test_risk_scores=test_risk_scores) -def privacy_risk_score_analysis(attack_input: AttackInputData, - slicing_spec: SlicingSpec = None) -> RiskScoreResults: +def run_privacy_risk_score_analysis(attack_input: AttackInputData, + slicing_spec: SlicingSpec = None) -> RiskScoreResults: """Perform privacy risk score analysis on all given slice types From 59bccb3a8260df273162bede10b09e3a7387d68a Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Wed, 16 Dec 2020 16:01:29 -0500 Subject: [PATCH 15/20] update privacy risk score code --- .../privacy/membership_inference_attack/data_structures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index cc1557f..8d83582 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -471,7 +471,7 @@ class SingleRiskScoreResult: precision_list = [] recall_list = [] meaningful_threshold_list = [] - max_risk_score = max(train_risk_scores.max(), test_risk_scores.max()) + max_risk_score = max(self.train_risk_scores.max(), self.test_risk_scores.max()) for threshold in threshold_list: if threshold <= max_risk_score: idx = np.argwhere(thresholds>=threshold)[-1][0] From b7f7fe07e792a31dd269fb7cb484b6ef50a4b615 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Wed, 16 Dec 2020 16:50:45 -0500 Subject: [PATCH 16/20] update privacy risk score codelab --- .../codelabs/privacy_risk_score_codelab.ipynb | 341 +++++++++--------- 1 file changed, 173 insertions(+), 168 deletions(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb index e400289..21a83c4 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb +++ b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb @@ -189,211 +189,211 @@ "Non-trainable params: 0\n", "_________________________________________________________________\n", "Epoch 1/100\n", - "200/200 [==============================] - 2s 8ms/step - loss: 2.0358 - accuracy: 0.2449 - val_loss: 1.7640 - val_accuracy: 0.3603\n", + "200/200 [==============================] - 2s 11ms/step - loss: 2.0612 - accuracy: 0.2296 - val_loss: 1.7651 - val_accuracy: 0.3543\n", "Epoch 2/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.6132 - accuracy: 0.4126 - val_loss: 1.4455 - val_accuracy: 0.4848\n", + "200/200 [==============================] - 2s 10ms/step - loss: 1.6134 - accuracy: 0.4093 - val_loss: 1.4970 - val_accuracy: 0.4533\n", "Epoch 3/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.4018 - accuracy: 0.4956 - val_loss: 1.3218 - val_accuracy: 0.5261\n", + "200/200 [==============================] - 2s 10ms/step - loss: 1.4312 - accuracy: 0.4798 - val_loss: 1.3316 - val_accuracy: 0.5254\n", "Epoch 4/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.2939 - accuracy: 0.5394 - val_loss: 1.2748 - val_accuracy: 0.5392\n", + "200/200 [==============================] - 2s 9ms/step - loss: 1.3117 - accuracy: 0.5308 - val_loss: 1.2511 - val_accuracy: 0.5495\n", "Epoch 5/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.2074 - accuracy: 0.5735 - val_loss: 1.1824 - val_accuracy: 0.5801\n", + "200/200 [==============================] - 2s 10ms/step - loss: 1.2103 - accuracy: 0.5715 - val_loss: 1.1634 - val_accuracy: 0.5906\n", "Epoch 6/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.1278 - accuracy: 0.6020 - val_loss: 1.1652 - val_accuracy: 0.5881\n", + "200/200 [==============================] - 2s 10ms/step - loss: 1.1535 - accuracy: 0.5943 - val_loss: 1.1286 - val_accuracy: 0.6007\n", "Epoch 7/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.0936 - accuracy: 0.6150 - val_loss: 1.1092 - val_accuracy: 0.6069\n", + "200/200 [==============================] - 2s 10ms/step - loss: 1.0921 - accuracy: 0.6147 - val_loss: 1.1256 - val_accuracy: 0.6005\n", "Epoch 8/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 1.0410 - accuracy: 0.6349 - val_loss: 1.0702 - val_accuracy: 0.6230\n", + "200/200 [==============================] - 2s 10ms/step - loss: 1.0472 - accuracy: 0.6319 - val_loss: 1.0726 - val_accuracy: 0.6266\n", "Epoch 9/100\n", - "200/200 [==============================] - 1s 6ms/step - loss: 0.9952 - accuracy: 0.6493 - val_loss: 1.0984 - val_accuracy: 0.6175\n", + "200/200 [==============================] - 2s 10ms/step - loss: 1.0173 - accuracy: 0.6434 - val_loss: 1.0692 - val_accuracy: 0.6228\n", "Epoch 10/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.9682 - accuracy: 0.6600 - val_loss: 1.0346 - val_accuracy: 0.6408\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.9775 - accuracy: 0.6543 - val_loss: 0.9961 - val_accuracy: 0.6544\n", "Epoch 11/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.9370 - accuracy: 0.6719 - val_loss: 1.0140 - val_accuracy: 0.6442\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.9361 - accuracy: 0.6747 - val_loss: 0.9996 - val_accuracy: 0.6519\n", "Epoch 12/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.9146 - accuracy: 0.6792 - val_loss: 0.9974 - val_accuracy: 0.6564\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.9077 - accuracy: 0.6815 - val_loss: 1.0096 - val_accuracy: 0.6526\n", "Epoch 13/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.8839 - accuracy: 0.6880 - val_loss: 1.0525 - val_accuracy: 0.6343\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.8918 - accuracy: 0.6865 - val_loss: 0.9685 - val_accuracy: 0.6624\n", "Epoch 14/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.8554 - accuracy: 0.7000 - val_loss: 1.0280 - val_accuracy: 0.6574\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.8501 - accuracy: 0.7016 - val_loss: 0.9513 - val_accuracy: 0.6737\n", "Epoch 15/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.8444 - accuracy: 0.7030 - val_loss: 0.9596 - val_accuracy: 0.6697\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.8402 - accuracy: 0.7041 - val_loss: 1.0338 - val_accuracy: 0.6449\n", "Epoch 16/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.8255 - accuracy: 0.7095 - val_loss: 0.9406 - val_accuracy: 0.6798\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.8218 - accuracy: 0.7099 - val_loss: 0.9843 - val_accuracy: 0.6588\n", "Epoch 17/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.8038 - accuracy: 0.7172 - val_loss: 1.0018 - val_accuracy: 0.6632\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.8029 - accuracy: 0.7167 - val_loss: 0.9515 - val_accuracy: 0.6724\n", "Epoch 18/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.8045 - accuracy: 0.7172 - val_loss: 0.9343 - val_accuracy: 0.6810\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.7858 - accuracy: 0.7230 - val_loss: 0.9279 - val_accuracy: 0.6790\n", "Epoch 19/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7672 - accuracy: 0.7308 - val_loss: 0.9666 - val_accuracy: 0.6752\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.7609 - accuracy: 0.7316 - val_loss: 0.9664 - val_accuracy: 0.6705\n", "Epoch 20/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7660 - accuracy: 0.7309 - val_loss: 0.9823 - val_accuracy: 0.6676\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.7452 - accuracy: 0.7352 - val_loss: 0.9328 - val_accuracy: 0.6880\n", "Epoch 21/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7396 - accuracy: 0.7391 - val_loss: 0.9548 - val_accuracy: 0.6777\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.7412 - accuracy: 0.7378 - val_loss: 0.9045 - val_accuracy: 0.6869\n", "Epoch 22/100\n", - "200/200 [==============================] - 1s 6ms/step - loss: 0.7285 - accuracy: 0.7415 - val_loss: 0.9568 - val_accuracy: 0.6856\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.7174 - accuracy: 0.7468 - val_loss: 0.9313 - val_accuracy: 0.6844\n", "Epoch 23/100\n", - "200/200 [==============================] - 1s 6ms/step - loss: 0.7235 - accuracy: 0.7454 - val_loss: 0.9302 - val_accuracy: 0.6886\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.7113 - accuracy: 0.7481 - val_loss: 0.9915 - val_accuracy: 0.6594\n", "Epoch 24/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.7017 - accuracy: 0.7525 - val_loss: 0.9557 - val_accuracy: 0.6867\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6890 - accuracy: 0.7575 - val_loss: 0.9174 - val_accuracy: 0.6922\n", "Epoch 25/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6921 - accuracy: 0.7562 - val_loss: 0.9379 - val_accuracy: 0.6921\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6839 - accuracy: 0.7578 - val_loss: 0.9313 - val_accuracy: 0.6891\n", "Epoch 26/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6752 - accuracy: 0.7606 - val_loss: 0.9930 - val_accuracy: 0.6720\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6696 - accuracy: 0.7627 - val_loss: 0.9411 - val_accuracy: 0.6838\n", "Epoch 27/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6769 - accuracy: 0.7590 - val_loss: 0.9484 - val_accuracy: 0.6923\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6581 - accuracy: 0.7673 - val_loss: 0.9240 - val_accuracy: 0.6900\n", "Epoch 28/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6629 - accuracy: 0.7656 - val_loss: 0.9388 - val_accuracy: 0.6917\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6504 - accuracy: 0.7717 - val_loss: 0.9469 - val_accuracy: 0.6872\n", "Epoch 29/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6571 - accuracy: 0.7672 - val_loss: 0.9473 - val_accuracy: 0.6898\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6486 - accuracy: 0.7700 - val_loss: 0.9310 - val_accuracy: 0.6924\n", "Epoch 30/100\n", - "200/200 [==============================] - 1s 6ms/step - loss: 0.6494 - accuracy: 0.7690 - val_loss: 0.9819 - val_accuracy: 0.6849\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6389 - accuracy: 0.7761 - val_loss: 0.9203 - val_accuracy: 0.6977\n", "Epoch 31/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6554 - accuracy: 0.7663 - val_loss: 0.9548 - val_accuracy: 0.6901\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6198 - accuracy: 0.7808 - val_loss: 0.9639 - val_accuracy: 0.6865\n", "Epoch 32/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6218 - accuracy: 0.7806 - val_loss: 0.9712 - val_accuracy: 0.6741\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6234 - accuracy: 0.7810 - val_loss: 0.9300 - val_accuracy: 0.6978\n", "Epoch 33/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6199 - accuracy: 0.7808 - val_loss: 0.9795 - val_accuracy: 0.6824\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.6213 - accuracy: 0.7801 - val_loss: 0.9401 - val_accuracy: 0.6939\n", "Epoch 34/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6096 - accuracy: 0.7825 - val_loss: 0.9969 - val_accuracy: 0.6802\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5966 - accuracy: 0.7881 - val_loss: 0.9759 - val_accuracy: 0.6893\n", "Epoch 35/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.6156 - accuracy: 0.7806 - val_loss: 0.9656 - val_accuracy: 0.6839\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5935 - accuracy: 0.7905 - val_loss: 0.9545 - val_accuracy: 0.6918\n", "Epoch 36/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5957 - accuracy: 0.7885 - val_loss: 0.9679 - val_accuracy: 0.6905\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5843 - accuracy: 0.7943 - val_loss: 0.9762 - val_accuracy: 0.6881\n", "Epoch 37/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5996 - accuracy: 0.7862 - val_loss: 1.0140 - val_accuracy: 0.6847\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5841 - accuracy: 0.7923 - val_loss: 0.9974 - val_accuracy: 0.6932\n", "Epoch 38/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5943 - accuracy: 0.7890 - val_loss: 0.9588 - val_accuracy: 0.6992\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5705 - accuracy: 0.8001 - val_loss: 0.9882 - val_accuracy: 0.6956\n", "Epoch 39/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5895 - accuracy: 0.7924 - val_loss: 1.0227 - val_accuracy: 0.6876\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5755 - accuracy: 0.7966 - val_loss: 1.0226 - val_accuracy: 0.6828\n", "Epoch 40/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5755 - accuracy: 0.7959 - val_loss: 0.9813 - val_accuracy: 0.6912\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5720 - accuracy: 0.7977 - val_loss: 1.0234 - val_accuracy: 0.6865\n", "Epoch 41/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5767 - accuracy: 0.7946 - val_loss: 1.0326 - val_accuracy: 0.6819\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5625 - accuracy: 0.7990 - val_loss: 1.0069 - val_accuracy: 0.6901\n", "Epoch 42/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5606 - accuracy: 0.7993 - val_loss: 1.1191 - val_accuracy: 0.6622\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5516 - accuracy: 0.8031 - val_loss: 1.0525 - val_accuracy: 0.6834\n", "Epoch 43/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5489 - accuracy: 0.8054 - val_loss: 1.0608 - val_accuracy: 0.6795\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5506 - accuracy: 0.8029 - val_loss: 0.9840 - val_accuracy: 0.6958\n", "Epoch 44/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5465 - accuracy: 0.8066 - val_loss: 1.0195 - val_accuracy: 0.6887\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5461 - accuracy: 0.8055 - val_loss: 1.0448 - val_accuracy: 0.6848\n", "Epoch 45/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5403 - accuracy: 0.8073 - val_loss: 1.0288 - val_accuracy: 0.6901\n", - "Epoch 46/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5375 - accuracy: 0.8092 - val_loss: 1.0732 - val_accuracy: 0.6793\n" + "200/200 [==============================] - 2s 10ms/step - loss: 0.5351 - accuracy: 0.8098 - val_loss: 1.0133 - val_accuracy: 0.6991\n", + "Epoch 46/100\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ + "200/200 [==============================] - 2s 9ms/step - loss: 0.5219 - accuracy: 0.8157 - val_loss: 1.0694 - val_accuracy: 0.6729\n", "Epoch 47/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5312 - accuracy: 0.8089 - val_loss: 1.0477 - val_accuracy: 0.6851\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5232 - accuracy: 0.8121 - val_loss: 1.0447 - val_accuracy: 0.6902\n", "Epoch 48/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5348 - accuracy: 0.8073 - val_loss: 1.0623 - val_accuracy: 0.6823\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5180 - accuracy: 0.8149 - val_loss: 1.0495 - val_accuracy: 0.6907\n", "Epoch 49/100\n", - "200/200 [==============================] - 1s 6ms/step - loss: 0.5392 - accuracy: 0.8071 - val_loss: 1.0662 - val_accuracy: 0.6852\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5022 - accuracy: 0.8217 - val_loss: 1.0147 - val_accuracy: 0.6941\n", "Epoch 50/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5270 - accuracy: 0.8115 - val_loss: 1.0746 - val_accuracy: 0.6802\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5017 - accuracy: 0.8210 - val_loss: 1.0510 - val_accuracy: 0.6925\n", "Epoch 51/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5112 - accuracy: 0.8167 - val_loss: 1.0665 - val_accuracy: 0.6789\n", + "200/200 [==============================] - 2s 9ms/step - loss: 0.4997 - accuracy: 0.8230 - val_loss: 1.0620 - val_accuracy: 0.6935\n", "Epoch 52/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5082 - accuracy: 0.8185 - val_loss: 1.0820 - val_accuracy: 0.6839\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.5001 - accuracy: 0.8214 - val_loss: 1.1083 - val_accuracy: 0.6832\n", "Epoch 53/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5062 - accuracy: 0.8195 - val_loss: 1.1127 - val_accuracy: 0.6836\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4976 - accuracy: 0.8213 - val_loss: 1.0512 - val_accuracy: 0.6924\n", "Epoch 54/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5046 - accuracy: 0.8194 - val_loss: 1.1327 - val_accuracy: 0.6810\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4858 - accuracy: 0.8250 - val_loss: 1.0825 - val_accuracy: 0.6936\n", "Epoch 55/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4952 - accuracy: 0.8237 - val_loss: 1.0908 - val_accuracy: 0.6868\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4859 - accuracy: 0.8241 - val_loss: 1.1278 - val_accuracy: 0.6763\n", "Epoch 56/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.5086 - accuracy: 0.8181 - val_loss: 1.0766 - val_accuracy: 0.6876\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4839 - accuracy: 0.8275 - val_loss: 1.1310 - val_accuracy: 0.6900\n", "Epoch 57/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4831 - accuracy: 0.8266 - val_loss: 1.1173 - val_accuracy: 0.6884\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4805 - accuracy: 0.8295 - val_loss: 1.1174 - val_accuracy: 0.6838\n", "Epoch 58/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4883 - accuracy: 0.8230 - val_loss: 1.1164 - val_accuracy: 0.6855\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4836 - accuracy: 0.8278 - val_loss: 1.1538 - val_accuracy: 0.6884\n", "Epoch 59/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4881 - accuracy: 0.8249 - val_loss: 1.1151 - val_accuracy: 0.6828\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4816 - accuracy: 0.8278 - val_loss: 1.1088 - val_accuracy: 0.6831\n", "Epoch 60/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4891 - accuracy: 0.8250 - val_loss: 1.1092 - val_accuracy: 0.6842\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4589 - accuracy: 0.8351 - val_loss: 1.1430 - val_accuracy: 0.6827\n", "Epoch 61/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4806 - accuracy: 0.8279 - val_loss: 1.1259 - val_accuracy: 0.6821\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4633 - accuracy: 0.8337 - val_loss: 1.0974 - val_accuracy: 0.6935\n", "Epoch 62/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4816 - accuracy: 0.8267 - val_loss: 1.1461 - val_accuracy: 0.6736\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4562 - accuracy: 0.8362 - val_loss: 1.1591 - val_accuracy: 0.6809\n", "Epoch 63/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4599 - accuracy: 0.8349 - val_loss: 1.1267 - val_accuracy: 0.6877\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4604 - accuracy: 0.8340 - val_loss: 1.1722 - val_accuracy: 0.6778\n", "Epoch 64/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4650 - accuracy: 0.8325 - val_loss: 1.1498 - val_accuracy: 0.6827\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4536 - accuracy: 0.8378 - val_loss: 1.1837 - val_accuracy: 0.6740\n", "Epoch 65/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4720 - accuracy: 0.8303 - val_loss: 1.1468 - val_accuracy: 0.6819\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4773 - accuracy: 0.8281 - val_loss: 1.2039 - val_accuracy: 0.6746\n", "Epoch 66/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4769 - accuracy: 0.8293 - val_loss: 1.1620 - val_accuracy: 0.6857\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4444 - accuracy: 0.8400 - val_loss: 1.1762 - val_accuracy: 0.6784\n", "Epoch 67/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4621 - accuracy: 0.8326 - val_loss: 1.1993 - val_accuracy: 0.6746\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4452 - accuracy: 0.8404 - val_loss: 1.2105 - val_accuracy: 0.6767\n", "Epoch 68/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4496 - accuracy: 0.8381 - val_loss: 1.1665 - val_accuracy: 0.6803\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4444 - accuracy: 0.8387 - val_loss: 1.2040 - val_accuracy: 0.6763\n", "Epoch 69/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4463 - accuracy: 0.8378 - val_loss: 1.2094 - val_accuracy: 0.6858\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4482 - accuracy: 0.8383 - val_loss: 1.2023 - val_accuracy: 0.6807\n", "Epoch 70/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4453 - accuracy: 0.8399 - val_loss: 1.2300 - val_accuracy: 0.6736\n", + "200/200 [==============================] - 2s 9ms/step - loss: 0.4482 - accuracy: 0.8388 - val_loss: 1.1758 - val_accuracy: 0.6891\n", "Epoch 71/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4554 - accuracy: 0.8365 - val_loss: 1.1662 - val_accuracy: 0.6776\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4323 - accuracy: 0.8447 - val_loss: 1.1958 - val_accuracy: 0.6883\n", "Epoch 72/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4416 - accuracy: 0.8411 - val_loss: 1.2145 - val_accuracy: 0.6784\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4402 - accuracy: 0.8399 - val_loss: 1.2304 - val_accuracy: 0.6834\n", "Epoch 73/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4474 - accuracy: 0.8381 - val_loss: 1.2112 - val_accuracy: 0.6781\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4259 - accuracy: 0.8479 - val_loss: 1.2637 - val_accuracy: 0.6711\n", "Epoch 74/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4365 - accuracy: 0.8422 - val_loss: 1.2111 - val_accuracy: 0.6738\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4319 - accuracy: 0.8444 - val_loss: 1.1960 - val_accuracy: 0.6826\n", "Epoch 75/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4354 - accuracy: 0.8431 - val_loss: 1.2956 - val_accuracy: 0.6663\n", + "200/200 [==============================] - 2s 9ms/step - loss: 0.4332 - accuracy: 0.8420 - val_loss: 1.2422 - val_accuracy: 0.6868\n", "Epoch 76/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4268 - accuracy: 0.8457 - val_loss: 1.2118 - val_accuracy: 0.6826\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4207 - accuracy: 0.8477 - val_loss: 1.2335 - val_accuracy: 0.6802\n", "Epoch 77/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4190 - accuracy: 0.8479 - val_loss: 1.2825 - val_accuracy: 0.6732\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4284 - accuracy: 0.8452 - val_loss: 1.2575 - val_accuracy: 0.6802\n", "Epoch 78/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4423 - accuracy: 0.8407 - val_loss: 1.2410 - val_accuracy: 0.6757\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4129 - accuracy: 0.8502 - val_loss: 1.3147 - val_accuracy: 0.6734\n", "Epoch 79/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4301 - accuracy: 0.8438 - val_loss: 1.2291 - val_accuracy: 0.6786\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4300 - accuracy: 0.8448 - val_loss: 1.2489 - val_accuracy: 0.6795\n", "Epoch 80/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4337 - accuracy: 0.8418 - val_loss: 1.2695 - val_accuracy: 0.6854\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4190 - accuracy: 0.8490 - val_loss: 1.3098 - val_accuracy: 0.6658\n", "Epoch 81/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4209 - accuracy: 0.8480 - val_loss: 1.2480 - val_accuracy: 0.6764\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4192 - accuracy: 0.8475 - val_loss: 1.3094 - val_accuracy: 0.6794\n", "Epoch 82/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4267 - accuracy: 0.8456 - val_loss: 1.2956 - val_accuracy: 0.6762\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4179 - accuracy: 0.8474 - val_loss: 1.2586 - val_accuracy: 0.6812\n", "Epoch 83/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4112 - accuracy: 0.8517 - val_loss: 1.2998 - val_accuracy: 0.6745\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4101 - accuracy: 0.8509 - val_loss: 1.2885 - val_accuracy: 0.6766\n", "Epoch 84/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4202 - accuracy: 0.8487 - val_loss: 1.2688 - val_accuracy: 0.6775\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4076 - accuracy: 0.8521 - val_loss: 1.3107 - val_accuracy: 0.6728\n", "Epoch 85/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4338 - accuracy: 0.8434 - val_loss: 1.3085 - val_accuracy: 0.6786\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4095 - accuracy: 0.8510 - val_loss: 1.3321 - val_accuracy: 0.6797\n", "Epoch 86/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4105 - accuracy: 0.8525 - val_loss: 1.3298 - val_accuracy: 0.6762\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4051 - accuracy: 0.8535 - val_loss: 1.3349 - val_accuracy: 0.6755\n", "Epoch 87/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4154 - accuracy: 0.8493 - val_loss: 1.2965 - val_accuracy: 0.6755\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3985 - accuracy: 0.8536 - val_loss: 1.2849 - val_accuracy: 0.6760\n", "Epoch 88/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4042 - accuracy: 0.8543 - val_loss: 1.3223 - val_accuracy: 0.6790\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3933 - accuracy: 0.8576 - val_loss: 1.3214 - val_accuracy: 0.6799\n", "Epoch 89/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4088 - accuracy: 0.8523 - val_loss: 1.3251 - val_accuracy: 0.6754\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4005 - accuracy: 0.8537 - val_loss: 1.3200 - val_accuracy: 0.6793\n", "Epoch 90/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4008 - accuracy: 0.8557 - val_loss: 1.2946 - val_accuracy: 0.6830\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3939 - accuracy: 0.8561 - val_loss: 1.3327 - val_accuracy: 0.6755\n", "Epoch 91/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4057 - accuracy: 0.8530 - val_loss: 1.3121 - val_accuracy: 0.6815\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3904 - accuracy: 0.8565 - val_loss: 1.3969 - val_accuracy: 0.6770\n", "Epoch 92/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4049 - accuracy: 0.8543 - val_loss: 1.3541 - val_accuracy: 0.6765\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3989 - accuracy: 0.8554 - val_loss: 1.3437 - val_accuracy: 0.6761\n", "Epoch 93/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4090 - accuracy: 0.8529 - val_loss: 1.2951 - val_accuracy: 0.6746\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3921 - accuracy: 0.8578 - val_loss: 1.4248 - val_accuracy: 0.6763\n", "Epoch 94/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4057 - accuracy: 0.8545 - val_loss: 1.3573 - val_accuracy: 0.6743\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3781 - accuracy: 0.8609 - val_loss: 1.3771 - val_accuracy: 0.6728\n", "Epoch 95/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4067 - accuracy: 0.8524 - val_loss: 1.3811 - val_accuracy: 0.6710\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.4045 - accuracy: 0.8528 - val_loss: 1.4156 - val_accuracy: 0.6735\n", "Epoch 96/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3892 - accuracy: 0.8591 - val_loss: 1.3791 - val_accuracy: 0.6712\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3998 - accuracy: 0.8536 - val_loss: 1.3608 - val_accuracy: 0.6770\n", "Epoch 97/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3978 - accuracy: 0.8550 - val_loss: 1.3702 - val_accuracy: 0.6680\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3875 - accuracy: 0.8587 - val_loss: 1.4172 - val_accuracy: 0.6642\n", "Epoch 98/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4045 - accuracy: 0.8554 - val_loss: 1.4202 - val_accuracy: 0.6670\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3975 - accuracy: 0.8537 - val_loss: 1.3898 - val_accuracy: 0.6758\n", "Epoch 99/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.3891 - accuracy: 0.8602 - val_loss: 1.3683 - val_accuracy: 0.6712\n", + "200/200 [==============================] - 2s 9ms/step - loss: 0.3779 - accuracy: 0.8610 - val_loss: 1.3825 - val_accuracy: 0.6743\n", "Epoch 100/100\n", - "200/200 [==============================] - 1s 5ms/step - loss: 0.4081 - accuracy: 0.8506 - val_loss: 1.3715 - val_accuracy: 0.6707\n", + "200/200 [==============================] - 2s 10ms/step - loss: 0.3836 - accuracy: 0.8613 - val_loss: 1.4445 - val_accuracy: 0.6738\n", "Finished training.\n" ] } @@ -555,65 +555,65 @@ "output_type": "stream", "text": [ "Best-performing attacks over all slices\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.74 on slice CORRECTLY_CLASSIFIED=False\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.40 on slice CORRECTLY_CLASSIFIED=False\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.75 on slice CORRECTLY_CLASSIFIED=False\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.39 on slice CORRECTLY_CLASSIFIED=False\n", "\n", "Best-performing attacks over slice: \"Entire dataset\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.61\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.21\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.62\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.21\n", "\n", "Best-performing attacks over slice: \"CLASS=0\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.66\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.25\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.65\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.28\n", "\n", "Best-performing attacks over slice: \"CLASS=1\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.58\n", - " THRESHOLD_ATTACK achieved an advantage of 0.17\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.59\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.18\n", "\n", "Best-performing attacks over slice: \"CLASS=2\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.66\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.31\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.72\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.33\n", "\n", "Best-performing attacks over slice: \"CLASS=3\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.71\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.35\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.68\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.30\n", "\n", "Best-performing attacks over slice: \"CLASS=4\"\n", - " THRESHOLD_ATTACK achieved an AUC of 0.64\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.25\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.68\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.28\n", "\n", "Best-performing attacks over slice: \"CLASS=5\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.65\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.26\n", + " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.63\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.23\n", "\n", "Best-performing attacks over slice: \"CLASS=6\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.60\n", - " THRESHOLD_ATTACK achieved an advantage of 0.16\n", - "\n", - "Best-performing attacks over slice: \"CLASS=7\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.61\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.25\n", - "\n", - "Best-performing attacks over slice: \"CLASS=8\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.58\n", - " THRESHOLD_ATTACK achieved an advantage of 0.16\n", - "\n", - "Best-performing attacks over slice: \"CLASS=9\"\n", " LOGISTIC_REGRESSION achieved an AUC of 0.59\n", " LOGISTIC_REGRESSION achieved an advantage of 0.19\n", "\n", + "Best-performing attacks over slice: \"CLASS=7\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.62\n", + " THRESHOLD_ATTACK achieved an advantage of 0.21\n", + "\n", + "Best-performing attacks over slice: \"CLASS=8\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.59\n", + " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.17\n", + "\n", + "Best-performing attacks over slice: \"CLASS=9\"\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.64\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.22\n", + "\n", "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=True\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.51\n", - " THRESHOLD_ATTACK achieved an advantage of 0.05\n", + " LOGISTIC_REGRESSION achieved an AUC of 0.52\n", + " THRESHOLD_ATTACK achieved an advantage of 0.06\n", "\n", "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=False\"\n", - " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.75\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.40\n" + " LOGISTIC_REGRESSION achieved an AUC of 0.75\n", + " LOGISTIC_REGRESSION achieved an advantage of 0.39\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -688,70 +688,75 @@ "text": [ "\n", "Privacy risk score analysis over slice: \"Entire dataset\"\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56143, 0.92450)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.60966, 0.10730)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56588, 0.87102)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=0\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62567, 0.16380)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56207, 0.89200)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62251, 0.26880)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57677, 0.74680)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=1\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61458, 0.29340)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56183, 0.79240)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61579, 0.23560)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.58356, 0.64880)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=2\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.63724, 0.56740)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.61159, 0.84400)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.64815, 0.58580)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.62353, 0.80660)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=3\"\n", - " with 1.00000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00100)\n", - " with 0.90000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00100)\n", - " with 0.80000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00100)\n", - " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (0.77273, 0.00340)\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.65255, 0.35120)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.60833, 0.77660)\n", + " with 1.00000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00060)\n", + " with 0.90000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00060)\n", + " with 0.80000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00060)\n", + " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00060)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62839, 0.60200)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.59257, 0.90320)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=4\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61174, 0.41280)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.59076, 0.74920)\n", + " with 1.00000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00140)\n", + " with 0.90000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00140)\n", + " with 0.80000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00140)\n", + " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00140)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.63558, 0.16220)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57909, 0.87500)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=5\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.60540, 0.34520)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.58148, 0.89060)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62834, 0.10820)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57398, 0.87440)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=6\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.60929, 0.10760)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57011, 0.69360)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61623, 0.11240)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57273, 0.70640)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=7\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61250, 0.29400)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56678, 0.85040)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62541, 0.15360)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57991, 0.77720)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=8\"\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.54417, 0.92520)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62054, 0.11120)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.55600, 0.81520)\n", "\n", "Privacy risk score analysis over slice: \"CLASS=9\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61538, 0.08640)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56456, 0.78440)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56808, 0.68920)\n", "\n", "Privacy risk score analysis over slice: \"CORRECTLY_CLASSIFIED=True\"\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.52433, 0.59775)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.53422, 0.43662)\n", "\n", "Privacy risk score analysis over slice: \"CORRECTLY_CLASSIFIED=False\"\n", - " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (0.70957, 0.36504)\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.68111, 0.67130)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.63809, 0.87166)\n" + " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (0.71764, 0.35140)\n", + " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.68704, 0.64067)\n", + " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.64406, 0.84983)\n" ] } ], "source": [ "# compute privacy risk scores on all given data slices\n", - "risk_score_results = mia.privacy_risk_score_analysis(input,\n", - " SlicingSpec(\n", - " entire_dataset = True,\n", - " by_class = True,\n", - " by_classification_correctness = True))\n", + "risk_score_results = mia.run_privacy_risk_score_analysis(input,\n", + " SlicingSpec(\n", + " entire_dataset = True,\n", + " by_class = True,\n", + " by_classification_correctness = True))\n", "# print the summary of privacy risk score analysis\n", - "print(risk_score_results.summary())" + "print(risk_score_results.summary(threshold_list=[1, 0.9, 0.8, 0.7, 0.6, 0.5]))" ] }, { From fd0ae811a6e72425d34de462222eab4844b6ab45 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Wed, 16 Dec 2020 16:56:01 -0500 Subject: [PATCH 17/20] update privacy risk score codelab --- .../codelabs/privacy_risk_score_codelab.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb index 21a83c4..742ce8b 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb +++ b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb @@ -53,10 +53,10 @@ "source": [ "\n", " \n", " \n", "
\n", - " Run in Google Colab\n", + " Run in Google Colab\n", " \n", - " View source on GitHub\n", + " View source on GitHub\n", "
" ] From b1993344cf61946cbd690a8b4e80f86687f1488c Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 17 Dec 2020 15:18:02 -0500 Subject: [PATCH 18/20] update risk score analysis --- .../membership_inference_attack/data_structures.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index 8d83582..1415b4e 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -481,7 +481,7 @@ class SingleRiskScoreResult: return np.array(meaningful_threshold_list), np.array(precision_list), np.array(recall_list) - def collect_results(self, threshold_list): + def collect_results(self, threshold_list, return_roc_results=True): """ The privacy risk score (from 0 to 1) represents each sample's probability of being in the training set. Usually, we choose a list of threshold values from 0.5 (uncertain of training or test) to 1 (100% certain of training) to compute corresponding attack precision and recall. @@ -493,6 +493,14 @@ class SingleRiskScoreResult: for i in range(len(meaningful_threshold_list)): summary.append(' with %.5f as the threshold on privacy risk score, the precision-recall pair is (%.5f, %.5f)' % (meaningful_threshold_list[i], precision_list[i], recall_list[i])) + if return_roc_results: + fpr, tpr, thresholds = metrics.roc_curve( + np.concatenate((np.ones(len(self.train_risk_scores)), + np.zeros(len(self.test_risk_scores)))), + np.concatenate((self.train_risk_scores, self.test_risk_scores))) + roc_curve = RocCurve(tpr=tpr, fpr=fpr, thresholds=thresholds) + summary.append(' thresholding on privacy risk score achieved an AUC of %.2f' %(roc_curve.get_auc())) + summary.append(' thresholding on privacy risk score achieved an advantage of %.2f' %(roc_curve.get_attacker_advantage())) return summary From abd8912e6ca3201ad2f97b64e6c49e94483149d1 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 17 Dec 2020 15:55:46 -0500 Subject: [PATCH 19/20] change risk score to membership probability --- .../data_structures.py | 50 +++++++++---------- .../data_structures_test.py | 12 ++--- .../membership_inference_attack.py | 42 ++++++++-------- .../membership_inference_attack_test.py | 8 +-- 4 files changed, 56 insertions(+), 56 deletions(-) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py index 1415b4e..5eedb06 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures.py @@ -445,35 +445,35 @@ class SingleAttackResult: @dataclass -class SingleRiskScoreResult: - """Results from computing privacy risk scores. - this part shows how to leverage privacy risk score to perform attacks with thresholding on risk score +class SingleMembershipProbabilityResult: + """Results from computing membership probabilities (denoted as privacy risk score in https://arxiv.org/abs/2003.10595). + this part shows how to leverage membership probabilities to perform attacks with thresholding on them. """ # Data slice this result was calculated for. slice_spec: SingleSliceSpec - train_risk_scores: np.ndarray + train_membership_probs: np.ndarray - test_risk_scores: np.ndarray + test_membership_probs: np.ndarray def attack_with_varied_thresholds(self, threshold_list): - """ For each threshold value, we count how many training and test samples with privacy risk scores larger than the threshold + """ For each threshold value, we count how many training and test samples with membership probabilities larger than the threshold and further compute precision and recall values. - We skip the threshold value if it is larger than every sample's privacy risk score. + We skip the threshold value if it is larger than every sample's membership probability. """ fpr, tpr, thresholds = metrics.roc_curve( - np.concatenate((np.ones(len(self.train_risk_scores)), - np.zeros(len(self.test_risk_scores)))), - np.concatenate((self.train_risk_scores, self.test_risk_scores)), + np.concatenate((np.ones(len(self.train_membership_probs)), + np.zeros(len(self.test_membership_probs)))), + np.concatenate((self.train_membership_probs, self.test_membership_probs)), drop_intermediate=False) precision_list = [] recall_list = [] meaningful_threshold_list = [] - max_risk_score = max(self.train_risk_scores.max(), self.test_risk_scores.max()) + max_prob = max(self.train_membership_probs.max(), self.test_membership_probs.max()) for threshold in threshold_list: - if threshold <= max_risk_score: + if threshold <= max_prob: idx = np.argwhere(thresholds>=threshold)[-1][0] meaningful_threshold_list.append(threshold) precision_list.append(tpr[idx]/(tpr[idx]+fpr[idx])) @@ -482,40 +482,40 @@ class SingleRiskScoreResult: return np.array(meaningful_threshold_list), np.array(precision_list), np.array(recall_list) def collect_results(self, threshold_list, return_roc_results=True): - """ The privacy risk score (from 0 to 1) represents each sample's probability of being in the training set. + """ The membership probability (from 0 to 1) represents each sample's probability of being in the training set. Usually, we choose a list of threshold values from 0.5 (uncertain of training or test) to 1 (100% certain of training) to compute corresponding attack precision and recall. """ meaningful_threshold_list, precision_list, recall_list = self.attack_with_varied_thresholds(threshold_list) summary = [] - summary.append('\nPrivacy risk score analysis over slice: \"%s\"' % + summary.append('\nMembership probability analysis over slice: \"%s\"' % str(self.slice_spec)) for i in range(len(meaningful_threshold_list)): - summary.append(' with %.5f as the threshold on privacy risk score, the precision-recall pair is (%.5f, %.5f)' % + summary.append(' with %.4f as the threshold on membership probability, the precision-recall pair is (%.4f, %.4f)' % (meaningful_threshold_list[i], precision_list[i], recall_list[i])) if return_roc_results: fpr, tpr, thresholds = metrics.roc_curve( - np.concatenate((np.ones(len(self.train_risk_scores)), - np.zeros(len(self.test_risk_scores)))), - np.concatenate((self.train_risk_scores, self.test_risk_scores))) + np.concatenate((np.ones(len(self.train_membership_probs)), + np.zeros(len(self.test_membership_probs)))), + np.concatenate((self.train_membership_probs, self.test_membership_probs))) roc_curve = RocCurve(tpr=tpr, fpr=fpr, thresholds=thresholds) - summary.append(' thresholding on privacy risk score achieved an AUC of %.2f' %(roc_curve.get_auc())) - summary.append(' thresholding on privacy risk score achieved an advantage of %.2f' %(roc_curve.get_attacker_advantage())) + summary.append(' thresholding on membership probability achieved an AUC of %.2f' %(roc_curve.get_auc())) + summary.append(' thresholding on membership probability achieved an advantage of %.2f' %(roc_curve.get_attacker_advantage())) return summary @dataclass -class RiskScoreResults: - """Privacy risk score results from multiple data slices. +class MembershipProbabilityResults: + """Membership probability results from multiple data slices. """ - risk_score_results: Iterable[SingleRiskScoreResult] + membership_prob_results: Iterable[SingleMembershipProbabilityResult] def summary(self, threshold_list): - """ return the summary of privacy risk score analysis on all given data slices + """ return the summary of membership probability analysis on all given data slices """ summary = [] - for single_result in self.risk_score_results: + for single_result in self.membership_prob_results: single_summary = single_result.collect_results(threshold_list) summary.extend(single_summary) return '\n'.join(summary) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py b/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py index d61c5ca..2658ad6 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/data_structures_test.py @@ -28,7 +28,7 @@ from tensorflow_privacy.privacy.membership_inference_attack.data_structures impo from tensorflow_privacy.privacy.membership_inference_attack.data_structures import PrivacyReportMetadata from tensorflow_privacy.privacy.membership_inference_attack.data_structures import RocCurve from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleAttackResult -from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleRiskScoreResult +from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleMembershipProbabilityResult from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleSliceSpec from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingFeature @@ -219,15 +219,15 @@ class SingleAttackResultTest(absltest.TestCase): self.assertEqual(result.get_attacker_advantage(), 0.0) -class SingleRiskScoreResultTest(absltest.TestCase): +class SingleMembershipProbabilityResultTest(absltest.TestCase): - # Only a basic test to check the attack by setting a threshold on risk score. + # Only a basic test to check the attack by setting a threshold on membership probability. def test_attack_with_varied_thresholds(self): - result = SingleRiskScoreResult( + result = SingleMembershipProbabilityResult( slice_spec=SingleSliceSpec(None), - train_risk_scores=np.array([0.91,1,0.92,0.82,0.75]), - test_risk_scores=np.array([0.81,0.7,0.75,0.25,0.3])) + train_membership_probs=np.array([0.91,1,0.92,0.82,0.75]), + test_membership_probs=np.array([0.81,0.7,0.75,0.25,0.3])) self.assertEqual(result.attack_with_varied_thresholds(threshold_list=np.array([0.8,0.7]))[1].tolist(), [0.8,0.625]) self.assertEqual(result.attack_with_varied_thresholds(threshold_list=np.array([0.8,0.7]))[2].tolist(), [0.8,1]) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py index 7b51b81..80e345f 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack.py @@ -33,8 +33,8 @@ from tensorflow_privacy.privacy.membership_inference_attack.data_structures impo from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleAttackResult from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleSliceSpec from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec -from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleRiskScoreResult -from tensorflow_privacy.privacy.membership_inference_attack.data_structures import RiskScoreResults +from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleMembershipProbabilityResult +from tensorflow_privacy.privacy.membership_inference_attack.data_structures import MembershipProbabilityResults from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_single_slice_specs from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_slice @@ -174,18 +174,18 @@ def run_attacks(attack_input: AttackInputData, privacy_report_metadata=privacy_report_metadata) -def _compute_privacy_risk_score(attack_input: AttackInputData, - num_bins: int = 15) -> SingleRiskScoreResult: - """Computes each individual point's likelihood of being a member (https://arxiv.org/abs/2003.10595). +def _compute_membership_probability(attack_input: AttackInputData, + num_bins: int = 15) -> SingleMembershipProbabilityResult: + """Computes each individual point's likelihood of being a member (denoted as privacy risk score in https://arxiv.org/abs/2003.10595). For an individual sample, its privacy risk score is computed as the posterior probability of being in the training set after observing its prediction output by the target machine learning model. Args: - attack_input: input data for compute privacy risk scores + attack_input: input data for compute membership probability num_bins: the number of bins used to compute the training/test histogram Returns: - privacy risk score results + membership probability results """ # If the loss or the entropy is provided, just use it; @@ -219,31 +219,31 @@ def _compute_privacy_risk_score(attack_input: AttackInputData, combined_hist = train_hist+test_hist combined_hist[combined_hist==0] = small_value - privacy_risk_list = train_hist/(combined_hist+0.0) - train_risk_scores = privacy_risk_list[train_hist_indices] - test_risk_scores = privacy_risk_list[test_hist_indices] + membership_prob_list = train_hist/(combined_hist+0.0) + train_membership_probs = membership_prob_list[train_hist_indices] + test_membership_probs = membership_prob_list[test_hist_indices] - return SingleRiskScoreResult(slice_spec=_get_slice_spec(attack_input), - train_risk_scores=train_risk_scores, - test_risk_scores=test_risk_scores) + return SingleMembershipProbabilityResult(slice_spec=_get_slice_spec(attack_input), + train_membership_probs=train_membership_probs, + test_membership_probs=test_membership_probs) -def run_privacy_risk_score_analysis(attack_input: AttackInputData, - slicing_spec: SlicingSpec = None) -> RiskScoreResults: +def run_membership_probability_analysis(attack_input: AttackInputData, + slicing_spec: SlicingSpec = None) -> MembershipProbabilityResults: - """Perform privacy risk score analysis on all given slice types + """Perform membership probability analysis on all given slice types Args: - attack_input: input data for compute privacy risk scores + attack_input: input data for compute membership probabilities slicing_spec: specifies attack_input slices Returns: - the privacy risk score results. + the membership probability results. """ attack_input.validate() - risk_score_results = [] + membership_prob_results = [] if slicing_spec is None: slicing_spec = SlicingSpec(entire_dataset=True) @@ -253,9 +253,9 @@ def run_privacy_risk_score_analysis(attack_input: AttackInputData, input_slice_specs = get_single_slice_specs(slicing_spec, num_classes) for single_slice_spec in input_slice_specs: attack_input_slice = get_slice(attack_input, single_slice_spec) - risk_score_results.append(_compute_privacy_risk_score(attack_input_slice)) + membership_prob_results.append(_compute_membership_probability(attack_input_slice)) - return RiskScoreResults(risk_score_results=risk_score_results) + return MembershipProbabilityResults(membership_prob_results=membership_prob_results) diff --git a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py index b996f3d..d08e279 100644 --- a/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py +++ b/tensorflow_privacy/privacy/membership_inference_attack/membership_inference_attack_test.py @@ -100,14 +100,14 @@ class RunAttacksTest(absltest.TestCase): self.assertIsNone(mia._get_accuracy(None, labels)) - def test_run_compute_privacy_risk_score_correct_score(self): - result = mia._compute_privacy_risk_score( + def test_run_compute_membership_probability_correct_probs(self): + result = mia._compute_membership_probability( AttackInputData( loss_train=np.array([1, 1, 1, 10, 100]), loss_test=np.array([10, 100, 100, 1000, 10000]))) - np.testing.assert_almost_equal(result.train_risk_scores, [1,1,1,0.5,0.33], decimal=2) - np.testing.assert_almost_equal(result.test_risk_scores, [0.5,0.33,0.33,0,0], decimal=2) + np.testing.assert_almost_equal(result.train_membership_probs, [1,1,1,0.5,0.33], decimal=2) + np.testing.assert_almost_equal(result.test_membership_probs, [0.5,0.33,0.33,0,0], decimal=2) if __name__ == '__main__': From 29c66c522087dd296dd33f57db6e44d89d7f19c6 Mon Sep 17 00:00:00 2001 From: Liwei Song Date: Thu, 17 Dec 2020 16:17:20 -0500 Subject: [PATCH 20/20] update codelab file --- .../membership_probability_codelab.ipynb | 1278 +++++++++++++++++ .../codelabs/privacy_risk_score_codelab.ipynb | 809 ----------- 2 files changed, 1278 insertions(+), 809 deletions(-) create mode 100644 tensorflow_privacy/privacy/membership_inference_attack/codelabs/membership_probability_codelab.ipynb delete mode 100644 tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb diff --git a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/membership_probability_codelab.ipynb b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/membership_probability_codelab.ipynb new file mode 100644 index 0000000..f942e93 --- /dev/null +++ b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/membership_probability_codelab.ipynb @@ -0,0 +1,1278 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "1eiwVljWpzM7" + }, + "source": [ + "Copyright 2020 The TensorFlow Authors.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "cellView": "both", + "colab": {}, + "colab_type": "code", + "id": "4rmwPgXeptiS" + }, + "outputs": [], + "source": [ + "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "YM2gRaJMqvMi" + }, + "source": [ + "# Assess privacy risks with TensorFlow Privacy Membership Inference Attacks" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "-B5ZvlSqqLaR" + }, + "source": [ + "\n", + " \n", + " \n", + "
\n", + " Run in Google Colab\n", + " \n", + " View source on GitHub\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "9rMuytY7Nn8P" + }, + "source": [ + "##Overview\n", + "In this codelab we'll train a simple image classification model on the CIFAR10 dataset, and then use the \"membership inference attack\" against this model to assess if the attacker is able to \"guess\" whether a particular sample was present in the training set. We further compute each sample's probability of being in the training set, denoted as membership probability (also called privacy risk score in https://arxiv.org/abs/2003.10595)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "FUWqArj_q8vs" + }, + "source": [ + "## Setup\n", + "First, set this notebook's runtime to use a GPU, under Runtime > Change runtime type > Hardware accelerator. Then, begin importing the necessary libraries." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "cellView": "form", + "colab": {}, + "colab_type": "code", + "id": "Lr1pwHcbralz" + }, + "outputs": [], + "source": [ + "#@title Import statements.\n", + "import numpy as np\n", + "from typing import Tuple, Text\n", + "from scipy import special\n", + "\n", + "import tensorflow as tf\n", + "import tensorflow_datasets as tfds\n", + "\n", + "# Set verbosity.\n", + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)\n", + "from warnings import simplefilter\n", + "from sklearn.exceptions import ConvergenceWarning\n", + "simplefilter(action=\"ignore\", category=ConvergenceWarning)\n", + "simplefilter(action=\"ignore\", category=FutureWarning)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ucw81ar6ru-6" + }, + "source": [ + "### Install TensorFlow Privacy." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "cellView": "both", + "colab": {}, + "colab_type": "code", + "id": "zcqAmiGH90kl" + }, + "outputs": [], + "source": [ + "!pip3 install git+https://github.com/tensorflow/privacy\n", + "\n", + "from tensorflow_privacy.privacy.membership_inference_attack import membership_inference_attack as mia" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "pBbcG86th_sW" + }, + "source": [ + "## Train a model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "cellView": "form", + "colab": {}, + "colab_type": "code", + "id": "vCyOWyyhXLib" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading the dataset.\n", + "learning rate %f 0.02\n", + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "conv2d (Conv2D) (None, 30, 30, 32) 896 \n", + "_________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 15, 15, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_1 (Conv2D) (None, 13, 13, 32) 9248 \n", + "_________________________________________________________________\n", + "max_pooling2d_1 (MaxPooling2 (None, 6, 6, 32) 0 \n", + "_________________________________________________________________\n", + "conv2d_2 (Conv2D) (None, 4, 4, 32) 9248 \n", + "_________________________________________________________________\n", + "max_pooling2d_2 (MaxPooling2 (None, 2, 2, 32) 0 \n", + "_________________________________________________________________\n", + "flatten (Flatten) (None, 128) 0 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 64) 8256 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 10) 650 \n", + "=================================================================\n", + "Total params: 28,298\n", + "Trainable params: 28,298\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n", + "Epoch 1/100\n", + "200/200 [==============================] - 2s 8ms/step - loss: 2.0930 - accuracy: 0.2198 - val_loss: 1.7698 - val_accuracy: 0.3608\n", + "Epoch 2/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.6091 - accuracy: 0.4121 - val_loss: 1.5084 - val_accuracy: 0.4486\n", + "Epoch 3/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.4071 - accuracy: 0.4906 - val_loss: 1.3092 - val_accuracy: 0.5314\n", + "Epoch 4/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.2850 - accuracy: 0.5377 - val_loss: 1.2988 - val_accuracy: 0.5378\n", + "Epoch 5/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.2113 - accuracy: 0.5679 - val_loss: 1.2258 - val_accuracy: 0.5700\n", + "Epoch 6/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.1571 - accuracy: 0.5888 - val_loss: 1.1821 - val_accuracy: 0.5803\n", + "Epoch 7/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.1005 - accuracy: 0.6101 - val_loss: 1.1269 - val_accuracy: 0.6054\n", + "Epoch 8/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.0607 - accuracy: 0.6268 - val_loss: 1.1337 - val_accuracy: 0.6024\n", + "Epoch 9/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 1.0233 - accuracy: 0.6427 - val_loss: 1.0603 - val_accuracy: 0.6245\n", + "Epoch 10/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9838 - accuracy: 0.6543 - val_loss: 1.0552 - val_accuracy: 0.6279\n", + "Epoch 11/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9485 - accuracy: 0.6651 - val_loss: 1.0529 - val_accuracy: 0.6331\n", + "Epoch 12/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.9340 - accuracy: 0.6701 - val_loss: 1.0530 - val_accuracy: 0.6347\n", + "Epoch 13/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.9062 - accuracy: 0.6826 - val_loss: 0.9814 - val_accuracy: 0.6559\n", + "Epoch 14/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.8795 - accuracy: 0.6900 - val_loss: 0.9736 - val_accuracy: 0.6611\n", + "Epoch 15/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8520 - accuracy: 0.7012 - val_loss: 0.9815 - val_accuracy: 0.6603\n", + "Epoch 16/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8355 - accuracy: 0.7061 - val_loss: 0.9624 - val_accuracy: 0.6667\n", + "Epoch 17/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8275 - accuracy: 0.7070 - val_loss: 0.9532 - val_accuracy: 0.6688\n", + "Epoch 18/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.8063 - accuracy: 0.7176 - val_loss: 0.9509 - val_accuracy: 0.6731\n", + "Epoch 19/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7977 - accuracy: 0.7187 - val_loss: 0.9552 - val_accuracy: 0.6714\n", + "Epoch 20/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7694 - accuracy: 0.7311 - val_loss: 0.9365 - val_accuracy: 0.6778\n", + "Epoch 21/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7577 - accuracy: 0.7332 - val_loss: 0.9535 - val_accuracy: 0.6742\n", + "Epoch 22/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7426 - accuracy: 0.7397 - val_loss: 0.9355 - val_accuracy: 0.6832\n", + "Epoch 23/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7369 - accuracy: 0.7397 - val_loss: 0.9162 - val_accuracy: 0.6846\n", + "Epoch 24/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7156 - accuracy: 0.7490 - val_loss: 0.9445 - val_accuracy: 0.6741\n", + "Epoch 25/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7136 - accuracy: 0.7478 - val_loss: 0.9920 - val_accuracy: 0.6647\n", + "Epoch 26/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.7003 - accuracy: 0.7542 - val_loss: 0.9611 - val_accuracy: 0.6710\n", + "Epoch 27/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6812 - accuracy: 0.7604 - val_loss: 0.9575 - val_accuracy: 0.6787\n", + "Epoch 28/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6736 - accuracy: 0.7612 - val_loss: 0.9574 - val_accuracy: 0.6814\n", + "Epoch 29/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6560 - accuracy: 0.7673 - val_loss: 0.9552 - val_accuracy: 0.6840\n", + "Epoch 30/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6505 - accuracy: 0.7708 - val_loss: 0.9528 - val_accuracy: 0.6878\n", + "Epoch 31/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6447 - accuracy: 0.7712 - val_loss: 0.9949 - val_accuracy: 0.6835\n", + "Epoch 32/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6402 - accuracy: 0.7747 - val_loss: 0.9628 - val_accuracy: 0.6794\n", + "Epoch 33/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6333 - accuracy: 0.7748 - val_loss: 0.9735 - val_accuracy: 0.6877\n", + "Epoch 34/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6116 - accuracy: 0.7846 - val_loss: 1.0004 - val_accuracy: 0.6727\n", + "Epoch 35/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6108 - accuracy: 0.7837 - val_loss: 1.0057 - val_accuracy: 0.6802\n", + "Epoch 36/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.6157 - accuracy: 0.7815 - val_loss: 0.9964 - val_accuracy: 0.6814\n", + "Epoch 37/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5947 - accuracy: 0.7891 - val_loss: 0.9903 - val_accuracy: 0.6820\n", + "Epoch 38/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5878 - accuracy: 0.7921 - val_loss: 1.0062 - val_accuracy: 0.6728\n", + "Epoch 39/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5796 - accuracy: 0.7958 - val_loss: 0.9860 - val_accuracy: 0.6804\n", + "Epoch 40/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5982 - accuracy: 0.7883 - val_loss: 0.9707 - val_accuracy: 0.6876\n", + "Epoch 41/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5744 - accuracy: 0.7958 - val_loss: 1.0108 - val_accuracy: 0.6895\n", + "Epoch 42/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5732 - accuracy: 0.7960 - val_loss: 1.0306 - val_accuracy: 0.6836\n", + "Epoch 43/100\n", + "200/200 [==============================] - 1s 6ms/step - loss: 0.5666 - accuracy: 0.8002 - val_loss: 1.0309 - val_accuracy: 0.6772\n", + "Epoch 44/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5633 - accuracy: 0.7987 - val_loss: 1.0249 - val_accuracy: 0.6817\n", + "Epoch 45/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5425 - accuracy: 0.8066 - val_loss: 1.0539 - val_accuracy: 0.6788\n", + "Epoch 46/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5421 - accuracy: 0.8067 - val_loss: 1.0570 - val_accuracy: 0.6791\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 47/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5407 - accuracy: 0.8072 - val_loss: 1.0616 - val_accuracy: 0.6804\n", + "Epoch 48/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5302 - accuracy: 0.8108 - val_loss: 1.0639 - val_accuracy: 0.6843\n", + "Epoch 49/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5354 - accuracy: 0.8100 - val_loss: 1.0413 - val_accuracy: 0.6779\n", + "Epoch 50/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5269 - accuracy: 0.8126 - val_loss: 1.0934 - val_accuracy: 0.6748\n", + "Epoch 51/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5195 - accuracy: 0.8146 - val_loss: 1.0981 - val_accuracy: 0.6779\n", + "Epoch 52/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5171 - accuracy: 0.8161 - val_loss: 1.0979 - val_accuracy: 0.6755\n", + "Epoch 53/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5108 - accuracy: 0.8179 - val_loss: 1.0986 - val_accuracy: 0.6796\n", + "Epoch 54/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5052 - accuracy: 0.8190 - val_loss: 1.1232 - val_accuracy: 0.6736\n", + "Epoch 55/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.5052 - accuracy: 0.8203 - val_loss: 1.1259 - val_accuracy: 0.6798\n", + "Epoch 56/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4998 - accuracy: 0.8215 - val_loss: 1.1352 - val_accuracy: 0.6790\n", + "Epoch 57/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4934 - accuracy: 0.8224 - val_loss: 1.1311 - val_accuracy: 0.6755\n", + "Epoch 58/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4855 - accuracy: 0.8271 - val_loss: 1.1364 - val_accuracy: 0.6782\n", + "Epoch 59/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4816 - accuracy: 0.8269 - val_loss: 1.1209 - val_accuracy: 0.6820\n", + "Epoch 60/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4823 - accuracy: 0.8260 - val_loss: 1.1343 - val_accuracy: 0.6776\n", + "Epoch 61/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4804 - accuracy: 0.8277 - val_loss: 1.1591 - val_accuracy: 0.6611\n", + "Epoch 62/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4737 - accuracy: 0.8312 - val_loss: 1.1828 - val_accuracy: 0.6701\n", + "Epoch 63/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4850 - accuracy: 0.8256 - val_loss: 1.1826 - val_accuracy: 0.6739\n", + "Epoch 64/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4700 - accuracy: 0.8325 - val_loss: 1.1647 - val_accuracy: 0.6843\n", + "Epoch 65/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4613 - accuracy: 0.8342 - val_loss: 1.1689 - val_accuracy: 0.6761\n", + "Epoch 66/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4674 - accuracy: 0.8315 - val_loss: 1.1811 - val_accuracy: 0.6790\n", + "Epoch 67/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4547 - accuracy: 0.8367 - val_loss: 1.2061 - val_accuracy: 0.6770\n", + "Epoch 68/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4578 - accuracy: 0.8337 - val_loss: 1.1907 - val_accuracy: 0.6664\n", + "Epoch 69/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4512 - accuracy: 0.8368 - val_loss: 1.2001 - val_accuracy: 0.6744\n", + "Epoch 70/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4414 - accuracy: 0.8393 - val_loss: 1.2204 - val_accuracy: 0.6651\n", + "Epoch 71/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4518 - accuracy: 0.8370 - val_loss: 1.2291 - val_accuracy: 0.6772\n", + "Epoch 72/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4360 - accuracy: 0.8432 - val_loss: 1.2683 - val_accuracy: 0.6767\n", + "Epoch 73/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4332 - accuracy: 0.8450 - val_loss: 1.2477 - val_accuracy: 0.6723\n", + "Epoch 74/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4421 - accuracy: 0.8399 - val_loss: 1.2652 - val_accuracy: 0.6757\n", + "Epoch 75/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4366 - accuracy: 0.8439 - val_loss: 1.2680 - val_accuracy: 0.6740\n", + "Epoch 76/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4414 - accuracy: 0.8411 - val_loss: 1.2742 - val_accuracy: 0.6645\n", + "Epoch 77/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4323 - accuracy: 0.8445 - val_loss: 1.2843 - val_accuracy: 0.6688\n", + "Epoch 78/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4336 - accuracy: 0.8432 - val_loss: 1.3271 - val_accuracy: 0.6589\n", + "Epoch 79/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4246 - accuracy: 0.8467 - val_loss: 1.3313 - val_accuracy: 0.6671\n", + "Epoch 80/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4229 - accuracy: 0.8471 - val_loss: 1.3182 - val_accuracy: 0.6665\n", + "Epoch 81/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4206 - accuracy: 0.8473 - val_loss: 1.3285 - val_accuracy: 0.6681\n", + "Epoch 82/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4291 - accuracy: 0.8449 - val_loss: 1.3572 - val_accuracy: 0.6638\n", + "Epoch 83/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4091 - accuracy: 0.8521 - val_loss: 1.3253 - val_accuracy: 0.6633\n", + "Epoch 84/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4080 - accuracy: 0.8525 - val_loss: 1.3506 - val_accuracy: 0.6726\n", + "Epoch 85/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4112 - accuracy: 0.8498 - val_loss: 1.3412 - val_accuracy: 0.6572\n", + "Epoch 86/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4081 - accuracy: 0.8518 - val_loss: 1.3353 - val_accuracy: 0.6649\n", + "Epoch 87/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4039 - accuracy: 0.8538 - val_loss: 1.4257 - val_accuracy: 0.6648\n", + "Epoch 88/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4127 - accuracy: 0.8502 - val_loss: 1.3950 - val_accuracy: 0.6680\n", + "Epoch 89/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4081 - accuracy: 0.8532 - val_loss: 1.3847 - val_accuracy: 0.6723\n", + "Epoch 90/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3964 - accuracy: 0.8578 - val_loss: 1.3938 - val_accuracy: 0.6646\n", + "Epoch 91/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4145 - accuracy: 0.8495 - val_loss: 1.4003 - val_accuracy: 0.6658\n", + "Epoch 92/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4036 - accuracy: 0.8529 - val_loss: 1.4180 - val_accuracy: 0.6586\n", + "Epoch 93/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3876 - accuracy: 0.8589 - val_loss: 1.4513 - val_accuracy: 0.6572\n", + "Epoch 94/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3950 - accuracy: 0.8564 - val_loss: 1.4425 - val_accuracy: 0.6586\n", + "Epoch 95/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3919 - accuracy: 0.8585 - val_loss: 1.4105 - val_accuracy: 0.6677\n", + "Epoch 96/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3982 - accuracy: 0.8556 - val_loss: 1.4089 - val_accuracy: 0.6653\n", + "Epoch 97/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3978 - accuracy: 0.8565 - val_loss: 1.4066 - val_accuracy: 0.6665\n", + "Epoch 98/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4014 - accuracy: 0.8536 - val_loss: 1.4905 - val_accuracy: 0.6514\n", + "Epoch 99/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.4059 - accuracy: 0.8531 - val_loss: 1.4303 - val_accuracy: 0.6608\n", + "Epoch 100/100\n", + "200/200 [==============================] - 1s 5ms/step - loss: 0.3881 - accuracy: 0.8588 - val_loss: 1.4523 - val_accuracy: 0.6540\n", + "Finished training.\n" + ] + } + ], + "source": [ + "#@markdown Train a simple model on CIFAR10 with Keras.\n", + "\n", + "dataset = 'cifar10'\n", + "num_classes = 10\n", + "num_conv = 3\n", + "activation = 'relu'\n", + "lr = 0.02\n", + "momentum = 0.9\n", + "batch_size = 250\n", + "epochs = 100 # Privacy risks are especially visible with lots of epochs.\n", + "\n", + "\n", + "def small_cnn(input_shape: Tuple[int],\n", + " num_classes: int,\n", + " num_conv: int,\n", + " activation: Text = 'relu') -> tf.keras.models.Sequential:\n", + " \"\"\"Setup a small CNN for image classification.\n", + "\n", + " Args:\n", + " input_shape: Integer tuple for the shape of the images.\n", + " num_classes: Number of prediction classes.\n", + " num_conv: Number of convolutional layers.\n", + " activation: The activation function to use for conv and dense layers.\n", + "\n", + " Returns:\n", + " The Keras model.\n", + " \"\"\"\n", + " model = tf.keras.models.Sequential()\n", + " model.add(tf.keras.layers.Input(shape=input_shape))\n", + "\n", + " # Conv layers\n", + " for _ in range(num_conv):\n", + " model.add(tf.keras.layers.Conv2D(32, (3, 3), activation=activation))\n", + " model.add(tf.keras.layers.MaxPooling2D())\n", + "\n", + " model.add(tf.keras.layers.Flatten())\n", + " model.add(tf.keras.layers.Dense(64, activation=activation))\n", + " model.add(tf.keras.layers.Dense(num_classes))\n", + " return model\n", + "\n", + "\n", + "print('Loading the dataset.')\n", + "train_ds = tfds.as_numpy(\n", + " tfds.load(dataset, split=tfds.Split.TRAIN, batch_size=-1))\n", + "test_ds = tfds.as_numpy(\n", + " tfds.load(dataset, split=tfds.Split.TEST, batch_size=-1))\n", + "x_train = train_ds['image'].astype('float32') / 255.\n", + "y_train_indices = train_ds['label'][:, np.newaxis]\n", + "x_test = test_ds['image'].astype('float32') / 255.\n", + "y_test_indices = test_ds['label'][:, np.newaxis]\n", + "\n", + "# Convert class vectors to binary class matrices.\n", + "y_train = tf.keras.utils.to_categorical(y_train_indices, num_classes)\n", + "y_test = tf.keras.utils.to_categorical(y_test_indices, num_classes)\n", + "\n", + "input_shape = x_train.shape[1:]\n", + "\n", + "model = small_cnn(\n", + " input_shape, num_classes, num_conv=num_conv, activation=activation)\n", + "\n", + "print('learning rate %f', lr)\n", + "\n", + "optimizer = tf.keras.optimizers.SGD(lr=lr, momentum=momentum)\n", + "\n", + "loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)\n", + "model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])\n", + "model.summary()\n", + "model.fit(\n", + " x_train,\n", + " y_train,\n", + " batch_size=batch_size,\n", + " epochs=epochs,\n", + " validation_data=(x_test, y_test),\n", + " shuffle=True)\n", + "print('Finished training.')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ee-zjGGGV1DC" + }, + "source": [ + "## Calculate logits, probabilities and loss values for training and test sets.\n", + "\n", + "We will use these values later in the membership inference attack and membership probability analysis to separate training and test samples." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "cellView": "both", + "colab": {}, + "colab_type": "code", + "id": "um9r0tSiPx4u" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predict on train...\n", + "Predict on test...\n", + "Apply softmax to get probabilities from logits...\n", + "Compute losses...\n" + ] + } + ], + "source": [ + "print('Predict on train...')\n", + "logits_train = model.predict(x_train, batch_size=batch_size)\n", + "print('Predict on test...')\n", + "logits_test = model.predict(x_test, batch_size=batch_size)\n", + "\n", + "print('Apply softmax to get probabilities from logits...')\n", + "prob_train = special.softmax(logits_train, axis=1)\n", + "prob_test = special.softmax(logits_test, axis=1)\n", + "\n", + "print('Compute losses...')\n", + "cce = tf.keras.backend.categorical_crossentropy\n", + "constant = tf.keras.backend.constant\n", + "\n", + "loss_train = cce(constant(y_train), constant(prob_train), from_logits=False).numpy()\n", + "loss_test = cce(constant(y_test), constant(prob_test), from_logits=False).numpy()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "QETxVOHLiHP4" + }, + "source": [ + "## Run membership inference attacks.\n", + "\n", + "We will now execute a membership inference attack against the previously trained CIFAR10 model. This will generate a number of scores, most notably, attacker advantage and AUC for the membership inference classifier.\n", + "\n", + "An AUC of close to 0.5 means that the attack wasn't able to identify training samples, which means that the model doesn't have privacy issues according to this test. Higher values, on the contrary, indicate potential privacy issues.\n", + "\n", + "For comparison with the following membership probability analysis, here we only perform threshold attack." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "B8NIwhVwQT7I" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Best-performing attacks over all slices\n", + " THRESHOLD_ATTACK achieved an AUC of 0.72 on slice CORRECTLY_CLASSIFIED=False\n", + " THRESHOLD_ATTACK achieved an advantage of 0.36 on slice CORRECTLY_CLASSIFIED=False\n", + "\n", + "Best-performing attacks over slice: \"Entire dataset\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.60\n", + " THRESHOLD_ATTACK achieved an advantage of 0.20\n", + "\n", + "Best-performing attacks over slice: \"CLASS=0\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.61\n", + " THRESHOLD_ATTACK achieved an advantage of 0.20\n", + "\n", + "Best-performing attacks over slice: \"CLASS=1\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.56\n", + " THRESHOLD_ATTACK achieved an advantage of 0.17\n", + "\n", + "Best-performing attacks over slice: \"CLASS=2\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.64\n", + " THRESHOLD_ATTACK achieved an advantage of 0.26\n", + "\n", + "Best-performing attacks over slice: \"CLASS=3\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.66\n", + " THRESHOLD_ATTACK achieved an advantage of 0.30\n", + "\n", + "Best-performing attacks over slice: \"CLASS=4\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.62\n", + " THRESHOLD_ATTACK achieved an advantage of 0.22\n", + "\n", + "Best-performing attacks over slice: \"CLASS=5\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.63\n", + " THRESHOLD_ATTACK achieved an advantage of 0.24\n", + "\n", + "Best-performing attacks over slice: \"CLASS=6\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.57\n", + " THRESHOLD_ATTACK achieved an advantage of 0.16\n", + "\n", + "Best-performing attacks over slice: \"CLASS=7\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.60\n", + " THRESHOLD_ATTACK achieved an advantage of 0.23\n", + "\n", + "Best-performing attacks over slice: \"CLASS=8\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.56\n", + " THRESHOLD_ATTACK achieved an advantage of 0.14\n", + "\n", + "Best-performing attacks over slice: \"CLASS=9\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.56\n", + " THRESHOLD_ATTACK achieved an advantage of 0.16\n", + "\n", + "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=True\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.47\n", + " THRESHOLD_ATTACK achieved an advantage of 0.05\n", + "\n", + "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=False\"\n", + " THRESHOLD_ATTACK achieved an AUC of 0.72\n", + " THRESHOLD_ATTACK achieved an advantage of 0.36\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackInputData\n", + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec\n", + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackType\n", + "\n", + "import tensorflow_privacy.privacy.membership_inference_attack.plotting as plotting\n", + "\n", + "labels_train = np.argmax(y_train, axis=1)\n", + "labels_test = np.argmax(y_test, axis=1)\n", + "\n", + "input = AttackInputData(\n", + " logits_train = logits_train,\n", + " logits_test = logits_test,\n", + " loss_train = loss_train,\n", + " loss_test = loss_test,\n", + " labels_train = labels_train,\n", + " labels_test = labels_test\n", + ")\n", + "\n", + "# Run several attacks for different data slices\n", + "attacks_result = mia.run_attacks(input,\n", + " SlicingSpec(\n", + " entire_dataset = True,\n", + " by_class = True,\n", + " by_classification_correctness = True\n", + " ),\n", + " attack_types = [\n", + " AttackType.THRESHOLD_ATTACK])\n", + "\n", + "# Plot the ROC curve of the best classifier\n", + "fig = plotting.plot_roc_curve(\n", + " attacks_result.get_result_with_max_auc().roc_curve)\n", + "\n", + "# Print a user-friendly summary of the attacks\n", + "print(attacks_result.summary(by_slices = True))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "E9zwsPGFujVq" + }, + "source": [ + "## Membership probability analysis\n", + "\n", + "This part shows how to use the membership probability.\n", + "\n", + "For each data slice, we compute membership probabilities for both training and test data. We then set a threshold on membership probability (an input is inferred as a member if and only if its membership probability is higher than the threshold) and compute the attack precision and recall values. We also report AUC and advantange values here for comparison with threshold attacks." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Membership probability analysis over slice: \"Entire dataset\"\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6031, 0.1281)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5647, 0.8502)\n", + " thresholding on membership probability achieved an AUC of 0.62\n", + " thresholding on membership probability achieved an advantage of 0.19\n", + "\n", + "Membership probability analysis over slice: \"CLASS=0\"\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6178, 0.1956)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5685, 0.8090)\n", + " thresholding on membership probability achieved an AUC of 0.62\n", + " thresholding on membership probability achieved an advantage of 0.20\n", + "\n", + "Membership probability analysis over slice: \"CLASS=1\"\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6006, 0.0842)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5602, 0.7528)\n", + " thresholding on membership probability achieved an AUC of 0.60\n", + " thresholding on membership probability achieved an advantage of 0.16\n", + "\n", + "Membership probability analysis over slice: \"CLASS=2\"\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6100, 0.4348)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5888, 0.8562)\n", + " thresholding on membership probability achieved an AUC of 0.65\n", + " thresholding on membership probability achieved an advantage of 0.26\n", + "\n", + "Membership probability analysis over slice: \"CLASS=3\"\n", + " with 1.0000 as the threshold on membership probability, the precision-recall pair is (1.0000, 0.0016)\n", + " with 0.9000 as the threshold on membership probability, the precision-recall pair is (1.0000, 0.0016)\n", + " with 0.8000 as the threshold on membership probability, the precision-recall pair is (1.0000, 0.0016)\n", + " with 0.7000 as the threshold on membership probability, the precision-recall pair is (0.8387, 0.0052)\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6323, 0.5640)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.6036, 0.8512)\n", + " thresholding on membership probability achieved an AUC of 0.68\n", + " thresholding on membership probability achieved an advantage of 0.29\n", + "\n", + "Membership probability analysis over slice: \"CLASS=4\"\n", + " with 1.0000 as the threshold on membership probability, the precision-recall pair is (1.0000, 0.0038)\n", + " with 0.9000 as the threshold on membership probability, the precision-recall pair is (1.0000, 0.0038)\n", + " with 0.8000 as the threshold on membership probability, the precision-recall pair is (0.8592, 0.0122)\n", + " with 0.7000 as the threshold on membership probability, the precision-recall pair is (0.8592, 0.0122)\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6291, 0.2816)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5751, 0.8392)\n", + " thresholding on membership probability achieved an AUC of 0.65\n", + " thresholding on membership probability achieved an advantage of 0.22\n", + "\n", + "Membership probability analysis over slice: \"CLASS=5\"\n", + " with 0.7000 as the threshold on membership probability, the precision-recall pair is (0.7727, 0.0034)\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6287, 0.1710)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5822, 0.8500)\n", + " thresholding on membership probability achieved an AUC of 0.64\n", + " thresholding on membership probability achieved an advantage of 0.24\n", + "\n", + "Membership probability analysis over slice: \"CLASS=6\"\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6429, 0.0936)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5569, 0.7868)\n", + " thresholding on membership probability achieved an AUC of 0.61\n", + " thresholding on membership probability achieved an advantage of 0.16\n", + "\n", + "Membership probability analysis over slice: \"CLASS=7\"\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6528, 0.1448)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5806, 0.7850)\n", + " thresholding on membership probability achieved an AUC of 0.63\n", + " thresholding on membership probability achieved an advantage of 0.22\n", + "\n", + "Membership probability analysis over slice: \"CLASS=8\"\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5423, 0.8070)\n", + " thresholding on membership probability achieved an AUC of 0.58\n", + " thresholding on membership probability achieved an advantage of 0.13\n", + "\n", + "Membership probability analysis over slice: \"CLASS=9\"\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5624, 0.8238)\n", + " thresholding on membership probability achieved an AUC of 0.61\n", + " thresholding on membership probability achieved an advantage of 0.18\n", + "\n", + "Membership probability analysis over slice: \"CORRECTLY_CLASSIFIED=True\"\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.5223, 0.5833)\n", + " thresholding on membership probability achieved an AUC of 0.53\n", + " thresholding on membership probability achieved an advantage of 0.05\n", + "\n", + "Membership probability analysis over slice: \"CORRECTLY_CLASSIFIED=False\"\n", + " with 0.6000 as the threshold on membership probability, the precision-recall pair is (0.6569, 0.7427)\n", + " with 0.5000 as the threshold on membership probability, the precision-recall pair is (0.6569, 0.7427)\n", + " thresholding on membership probability achieved an AUC of 0.72\n", + " thresholding on membership probability achieved an advantage of 0.35\n" + ] + } + ], + "source": [ + "# compute membership probabilities on all given data slices\n", + "membership_probability_results = mia.run_membership_probability_analysis(input,\n", + " SlicingSpec(\n", + " entire_dataset = True,\n", + " by_class = True,\n", + " by_classification_correctness = True))\n", + "# print the summary of membership probability analysis\n", + "print(membership_probability_results.summary(threshold_list=[1, 0.9, 0.8, 0.7, 0.6, 0.5]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Manually plot training samples with high and low membership risks\n", + "\n", + "For samples with low membership risks, I pick samples whose membership probabilities are closest to 0.5." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 0\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 1\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAABuCAYAAAAj1slPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAAsTAAALEwEAmpwYAAA/1klEQVR4nO2d6Y8kV3bdY8u1Kquytu6u3tndZHPXcIachaKkkWQZMvRBgC3DsAUYBmTAhmDLX/wPyBAMWIAhQxBkwYBgGxYMGwZsjTzWLi9ayKGG5AyHS5OcZrPZa1XXlrXkHos/jB3n92oiqovDKglI3PPpVlRkZMR7L15E3vPOuX6WZZ7BYDAYDAbDJCP4yz4Bg8FgMBgMhuOGvfAYDAaDwWCYeNgLj8FgMBgMhomHvfAYDAaDwWCYeNgLj8FgMBgMhomHvfAYDAaDwWCYeEQH/fOXfv6f5Zr1977xzXz70rlzeXzl+57J4/F4lMdZkubx7t5OHu/1e3nc7+3lca+7g3ig48RJHvt4PUvjcR4PR/re3qiP89FnPc/zokqoz3s6v2qtksdh5CsO9IWNqabixpQ+G9UVV3Sc1NN3h5623757L4/n59o4TjWP40RWAf/ql39NJ/Qp8Ru//Ev5geM4zrdXcN5RhV+XFe5TrVYL9vC8eDz2ilCr1fI4oQ0Crnk81vnEiWK2aRi57+e7uzteEZpN9ZWfoj8xgAYDjbGtTiePg0zjYrrZyOM6YhzSGwyGeTwa6forkW4tttdP/czPHkl//sKvf6XQT8L3cXg/RBwU7hNgjHO8hyX708aCn/U9fq9XuA8RBPtO/1Ctop14mRxSGfovTfUPP8BnccQk4Ryh/dNMfclrTlMd/5/+nZ84snvzJ37qJ/MvmZmZz7cP+prbVu/f13nE2r7b2c7jCO39937mZ/L4h3/8r+bx3p7m3TDEnIh5J/B1z+7tdvL41//Nr+qzgdri9OmzzvWM0A8nl0/mcS3DnDqN+xRzMMcS2ztNNS+Mcf1nTl/I4yuXH8/jXk/7+Phtn2Z4pqDPX3rhuSPpz9/+2hv5Qc+dXsy3h76uZTDU+Jqamsnj3/rKV/P4v/3mb+mzaB/Oj0GAexzwMaxD7OPcj7yHAjyv9s2zCZ7lCZ7HQaZzSnCvhVU8K+p6PgahtlcqmhM5Hk+c0Fhp1PF8GGmedR46uDd31lfz+Kv/6d8V9qVleAwGg8FgMEw8DszwfOU3/n0e91O9JT4zqzevk/15fEIvVbWaDj27oP2nkwr2n9MnM/zSSPUWWQ3r2F/H4S/rFG95G/i1s4tMked5XhTpO+rNGrbrXONYnwlSvYXz7XyY6pfDcIxf+PjVESf4hZjqmK15XUNvvJvHfZzqsIe32SNEo65rDkJlLPgGzx8MI7xV85ez84sfv8D4S5j78Fekj3342zoK9e4d+OoPZh38fe/sjQayLjiPssxD2S9HZqaaaCOCv0Ja7dk8zvBzI8J1MiPG6z8q+H5xu/i49tT5NcfYScEUb8+YTUGMTEngF/9aZDe5GSf8A9mB7+z3cAPUICg+p7IMjJNccjJC+DWK/kv4WWbHPGY+juc3YgMZxEqFv8g1/820p/N4hEz5eISMOO7lCn5pc47jeOScmKAP/JJs2mis79rpbOTxxx996FwP7+0z58/ncWd9M48XTpzI48WTik9gO8+7hl/8zSm110l8Ngx5ncqE+Ji//ZTzw9Hfm//7z17L4y88/1Qenzu7lMd1ZH3b7ba2MyPC+w63RwWTdIh/kPXwfB2f2RSO5eEQz1D0dzJ2J1oyDuOh2jQZiE3pg92ZO60szb0VZSUbjXYeR7iGu7c/zuObt27n8eyM9p+a1tjPMA+05/QOMXfmUe9hsAyPwWAwGAyGiYe98BgMBoPBYJh4HEhpDetKG3oRFp7WlR68vvLNPA4rSqlV60xZIy0Z6jjVCigWLGaLPG1fnHsuj0+dvKx9QBm0Wlr0xTz2GIu7PM+lGdzUoc5vMFSqeOP+nTyOe6LKmPCLsYhrDGqEi3DHWMyaJMX7xIhHw+OhtMaJ0o5sb6bpeU79vlKWnqex0GgUUwtcCE3agIt2Q6SoU7QF6QRnFSpeyZPYpT3cBY2gHNF+1ZBp/Wrh/ly4WradCwVHWCTPxc+NGmmJ46W0Mi425YAkNeiV0U9+YZwhTvlTKHBIKuzPwxRTUlyc7H7tJ2+TDN9BKpEH9p22Ju1VssrZI43F45dg/2LrIwJpDS5457UlaSuPhwPtU69rrI1A9dcb2l5WM9FZ8O0s8mZbqI26XVG7t2/fyuM5LED2PM+bnW3rD9wv250tbcZ8sbMren9vR/HmpiiwWkP374lTorEevfKEV4QMi5M9n9S72m4/TX4UuPmxaJnu3noeX7q4nMdLc1oKMt28kccrK1p4S3pudkE00QB05jqeUdub+q6opv6YmtbzcWlJtBrn+rVV9Ws8dscK5/VqlYun9XyIQWI2QXvt7uhcW7On8nhvW89TXs8I4qVqgHENAdIY49HHO0o2Q+quGJbhMRgMBoPBMPGwFx6DwWAwGAwTjwMprcef+2weDzOloCqNbh7HSC+NY6VTh314HSCdmIJiSIailXwsMJ9qytOh0VIqr7VQvHqfqVgqtsLKvstDaj4ew4enos/UqjinitKCia+0W81Xyi6swm8FiocUlF6aFFMvED45lI7rDXJ0oNJqNCpJUyJ96airSrxbCF5b2WedHDopKSgM2LdkU+j1sP/7CFfBU7w/r4Exr7+O8VNvUNWWFMakvXgc/xjy5g7l4FBaiKm08or7j2ovVwVVvN3xwvGKKRDnPEvUZNm+NnEZpxLaKPuE7eio1/gFCNEWpMnKKaDjobR2d5TKn5tv5zHprZlZ+X8Fc6K3qtingutZOin6ouy8XcEelZXsN/pxaYBNg8aamaaa1vMy+KHtbKzlMb3aAlDPpFxHLdHEq/ek8vEjnqxC3tfuvVY8/n3nd/7R9+du50EeB4nmjSjDMoeernFhXl49GxuipTbhDzZ7+lIet5rtPD596rS2g8Kcm1/I42ks+VhYEJW2uwt68ubdPF5b1Tl4nuetPhDNtrWlcxqHUqtGULcmUFl7MfoG8+PGqr5vjOUiEWjIuAtlFjyYtnqiPBszat+48nCa3DI8BoPBYDAYJh72wmMwGAwGg2HicSCl9eKXfiCP40Qp17fffzWPsz1a91NdoJCp0pT7REj3wWCrGj2Sx+NUadMbWP0egj5yaIuEtuFuCrwK+qkGGofW20zHdbaV8kv6Sr+2qyghAOqG9MZhUt8x0n1UeB1X2pxp6jJaiii7HtI13a7oTaqjqDopo4wytDUNCT1SgB6Mrva1S1k7UQk2HhaXO+FnHVM2jFUqrXweMy0eY6RWP+lY+KRw1U9UtYG6cpR4/KxfHFPtVEIHldFzpdtL/sgCv3TH/fdt/hnn91lxqYiscA/PdW4ro3cYO/Qpqa7Cj35q3L2rFP/MrFL5a2uidLb3OvoATrYOY7l5qKMq1eIUP8cjr8elgkn/avvlK1LKnjoh0zevL1rC8zxvqqq5/e49USRDsSDeEKrLfq9XGPP+HQ+ocMUcjLncoegck8his8EgdJW8R4HxWHPi7LQopOGetr+/2cnjpUUp17wAitYp0VIPOppbZ6d0vc+/KBXzhXPav7OjY+5CAXcLJn8sE5E2QFWe0XE8z/MaJ2Hu12GZKKh4A82PPRjnRg3RaY06n7+iwHxQdAOc68amxtSVJ7TMhSUqMhjCUpVYBsvwGAwGg8FgmHjYC4/BYDAYDIaJx4GU1uKiVoB//KFSZFO+DIROYpV4hHwia7Q4qhvErF4+TJCLnFZKza+hijhW+KdZsaqJ8f4su6PyQe2uLKaKSp9vQS2xval9dnalOpibwup0noejxiqmUmhayPg4VD2e516bS2lRhaH+YRV6ppAHqKFC471S0z7QWEyPj8akt6Dwwjk46prYVWWV1esqU2+VbS9T55AaC3D8kVOzRmGZMu04KC0KEF2fRvwRQi0RkKIoqTt2CLqqbP9PTHUdUDurrP6WwzKBhj4UpUXqkfuz/ls5H8YPFJzxp8cQ5qSkIEao1cftMe6vyHckS3lYVtvOHY/FF81DUlm1vd3J4woo8hpUjJ7neXVQHIsLms/nGlKaxS6JmEdTTS1jqEL9w7qFy6f0DGJdKr/kmJnrkqk4K54TPg2uv/9tfRX6tbsrOmh7T3PouXPn8vjClSfzuDIrVfIOVM8rK6Klhv1OHifDlTwOq5jTIy0XWb0rxdXeLubuKdFWo331xeahIjt1UuaJc3NSAZI+nGorboJy6oOSff4LX8rjQV9ttLfTxXZ9dh7Gi6fP6noqFbXLI5cueg+DZXgMBoPBYDBMPOyFx2AwGAwGw8TjQErrrdelxvr6y3+Sx59/8Qt5fPGsKK2EqX6knKn+YH2fBCZDva7ojQrSmL0xVoLTOK7EVCrJqHxyDfyGOD8qfmZntJJ8NND2QQyTrLrSpt1N7dOAisDxNkug2MF1ZmlxCjlAephGhUcJHwo5pnjZP2wX0o9UxUU41xbMx7o91FZBW5MmS/G9Tpa5zOQQ7+T7B2tMisqhPnANJXWsfJoeJkqVJ04anP0AKof1vWCIFSOuo2Zclh4HpQV1Ca+XVCXVVU5M9dbDDSWJMmO3kJ89hIlg+l1tUky/uHQaDSlJe1KB45xs4XaH0CEFxPMroTqOS6WVonhZF6Z0vi/lCa+/6ms+CnAjhT4VSMX3uNvPUNCSzvWK54SdrhRUaQqzUMyVnud55+faeby9p+u5fUNK2wSGtBXURDp9Ws+U7S5M5hq6p2aaosbqISktwe1B9LOP5QMlNPenQSPSnMg594svSfV8+cqVPG61peT6k1e/oQNh6qrB2HE4xLKDoSigMFY7T+F5tbGuJRgD1LnaG+rap5oaE6HvzgNbMMX0QUn20HbzMzLCrON5N0b/9Xs61/kl0WRBDeOuobZb9LUP2ExvgHtljLpo791R3bUyWIbHYDAYDAbDxMNeeAwGg8FgMEw8DqS0/vgPfz+PM1AUAxgLUV1AainEu1SG0vEQR3mDkVJi3bE+W6cJH/ahURLrx1AdM4D5HetFeZ6rECJdMdVQurDdljPW3RWtaGedpGGq43SgnGjBWCmGqZbnqInQLhmVXKgHlrpU3FGBhltOTS/SaegrR9SGNCVZIl5PFJHWSAu3k3KkOiqGYms0xJjKSCW5xlIhDNfIAo7wR4DzwKk6Khdemw8qdowxH1ahSKnxtilWCPLaxiPkY48IdR8KC8iLHHonpBFosbrKqSnmF9NSRBll9F2SyP+HsvJXUbTvHzRtxPjnPU/jwaSEMi+nw0rUZTiFstg7xPZPi7l50RozM+08Jm1EarwLlc8Ipqikqmmo6hg7lirnFLuGhDRm5Qc0vj7zwuecY52Zlnli/xvv5fH1u6JX4APr7cCIbxq0yfqa6lKFMFKcndUyhBhzSqVEdYdpxLnfj6GUlnd2WQqyH/nyl/P44qXzeUyD3GsfXM/jN7/1dh7Hnua7akOdM9NEjT+osW7flknlgyFMc3GcfqZnXQjqLYbyNoDqzfPcthuPRGkOx1iqEItu7O7pmZj0dB4zU+rXPTw3UdbSG0KJ24TBYK8rynSA58PsvMbZYSwkLcNjMBgMBoNh4mEvPAaDwWAwGCYeB1JaOzuqZTEGBfLhzZt5fOGKytZXa1AU+Fi1X9EK/AC1QtZ2RBklDVFJrMnkl5gZMnU/AgVGqoLGdt/5TLFqZXtH6bV6HfQW1Fvrmxs6EFJ+nQ1RC1FdRkw+TBWTXkfbHTVKsWLruxUsRwTQO/zuJFFf+eB9whA0G9VvVK85NEgxLTcEpUPTQqaTM6hRkhQKHCgwWrNK+3ueqyIbUy2F8RBQnRHrPGJQBQPQqUGdNJC2j2HCCLGMFzo0gL5rhP2joFgp9mkQxVI8kAAlPelnpACLjfrcIlugiXiveMXUFSmQKCAHwt2Lj5Nm7m+tmFwJKV0aWDq0l3ZhbbOs+JZy/jhM3S+qlHjeh1GyfS+4evWxPK5Uik1BT5zU/LKxLiPY7o5og0Wk+FkL7jBknEP7lVxmhn574YXn8/in//ZPO/t17kiNdfqy6j3NLstk74/++3/NY9YDCx1lZfHYS7k0AJQ55ykOyaRkYByHx+vTz17N469+5b/kcTzSs6IHSrI6KzO/Le3ijTBvVgLM0eiD5gmZE6ax2m0K9anm5jVu7nHcjDhPCrXQbZQK+qaR6jzqqcZdJdF3NzGHbmzqOx7cRs0w1NKKpkCtgT4d4PUkwlqYuq+5fu2jd7T/2FUKFsEyPAaDwWAwGCYe9sJjMBgMBoNh4nEgpZXgfSgGfbDdw0ptpMVSpF+5Cv3tW/fyuJ8ozXqirVQZSlJ5A6T76g5Npn1gcegoqBLkusf7KC3XSE4Hq9W1vY80YgSVC+M6UnD3b2r/N957K48bUPI8e0lUTD0qvh6X0joelVaKdCRVWjQco1GcYyzGWlKkd9AuTtIY6fEx+od9UsMq/DHStGFDJlbL5y/roBVXPdDpiHKlKmpqRsedgzHiNMbS5oYoysQXjdnfU9p1iLHEG4VnMUYtsSqM0YjkGPozHcIAjll/0r4+qOESSoOUZGldLYdVoMkfaaykcH9yBpkzxvf91nJc/6AIdJgyUEvYXlo7jd8HSo/shqOUdLaDej4EHfZp0e/T0A+mguiTBPfj9LTukWZN6pfWNGoPQuEWHOK8y2psBaA6H3v08Tz+8pd/LI8XlkTLeJ7nrX0sSuvi5Ufz+MemtUzg+jdfy2MwGV59Xvuk2E417XxbtZ+CSjEN7ai0QIfyu47DSXJ2TrTiO+/ISLCCc4hgHDlH5VSovhxsaY7a2JICqw5zvjbapFrRZ3f2NDf6IZTETe1/9oyeS+1FmfzNttvO9cxMa7nJ3BzUhKBPF7B9qS2abdTTs+JPX/laHr/xptRo99fX9WURqK6alsJwzr338Qd5vHbn/TxOsofrtCzDYzAYDAaDYeJhLzwGg8FgMBgmHgdSWmFNiaRHr2jlebOmnGAP9FbDK64f1N1U2fq7D5Bee+YJnQjUO2PHOE7n46bZafgGSgvGRftT3QnTmqizNUA9rJ1dqV9qoFBYP2oR6b/bWG2+u3E3j5tIy3qZ0q8EU86uMut4ammx7tMYSiandpej3kJ9M6RRM66kh7ljgvb20Q/VGuhDmIqNBjj+lFL07WUZdN1eV2q2F7spywgqlH5X/ba7J/XA8pz64emrSq3vjXSdTz2n2nCBr3a5c1OGaXtbSruSWiBFN4JqgQiOoTs3N3W9ZIcy3DAV0E8Rf9s4hnyMsYuze3FNJt+5OT+ZaWGwbx/X9I4UK7aTHiv29Sytw+Y4nnrFx3d4NdyPbo2t41FQrq6K9m+1RCFk6NzOjigOh64BmxiFGo9f+tKLeXzuAtui5CRI41GhiDEegsJugerodSEv8jyvj3pgKUwF2+2FPL60rJpZe6CSA1DD9UBz58JsO4/n5jUH1zAPpDGpyGLwuZAcQ93Cd66Jclk6I1XaynXRL9Nia7y1e9o+hkKVxoCtaVFGvYGeoav3b+XxufNSTP/43/wbeXzmjIwQ23OaZ/kca82qXxpToqo8z/OqeA5S+cf6jxwvromu2vfJZzX/3rp1J49fefn1PP6zl7+ex/c3ZDrZ7ame1+b9G/rekd4bKocQw1qGx2AwGAwGw8TDXngMBoPBYDBMPA6ktPoDqTyqdeXgZmeUatvrKo0/hvEPS8w/sqzU2Umk0ZozSoluoGbKLupssB7MFFK9TVAjpGqoDhsO3BpGfShqIqzs703rWP0Wytzjmhfm23l84oxSsU9dlWqhMlZ6rVWHMRbSev1+sfEeKaasRHXyaZEmSjuCrfLGoPdqUDLFUKyNIJeJkCweDHWuMc57akptF0ZSBoxA43l10U1tGJJtojaQByptep9Ky6E+4AY4QFq7gj5MQMVtI+W++eHNPD5xUqndR59VfaDb10Vvrd5U7ZskoYKnOJVLhd9R4VvXRbFlMAojpRWirhLND8vqTbmiwWJ6o8yEz9/PUT0EwXdxWgjLzqn0WCV1shxPxZL6WYcwEnRFZ8ej0nJr0ukeJKVFA7iUdDhoGSdmvTzeKyWclqOyxGUOMW8OeG9CWdkDpex5ntfv6e8YKqR51FM6AxXO1jrmf1BgY9DT2UDXvIN2SbAkIfOhlCwZ5w5FeQxz7fqWzvMHf+Cv5fHm+XYe1yN977fe/jCPB0O0KSh/iAy9CribztZmHqcJzHhRb+rFF1/K49lZtT8NZGn8ur9moTvkoXxMqOTzCsFx3Wyov59+WstZaLr50kufz+M/+KP/mce//ZXf1Hn3NSbqOL6j1iuBZXgMBoPBYDBMPOyFx2AwGAwGw8TjwBzQGPRQyAJCoAZ2UQp+BMUSKS0qG06dU/rq9GUpv9bX1vJ4gHToOFZqrobjN5pKzYVM43Pl+L7UbYJjsebKLGpmNWHklJASQPo1qIpmufrMU3m8el8qrY27H+Vxtaq2S2OmmVF7CZRWEh+P8eBwQJUW+hYGgBkoGrp+DfDZMOVYgJINNW3gTej1e0pBttpSGyxckKngDlKwUwuomVVRn4/3NQvT+rWa+i3C9cy0dH61ae2zcOpk4XE3uhrP6arSxU+B3qoif7tyV4ZgU6ghw3pA8fjhhlifGCFVc15hHDONX5JzdutqFW8vU1BRBcX6PoeppeXv/62FE89KasllJQaZRDnlVCZNKqZ9yqiOY2K0HPVLE2OelOkIY9yrwmAVSkkuAYhAgdFzlR6RIfrBuX44uwag2C5d0T1LdVS0r2FoGLm9Kfq1MaMlAz6uc2Vb912/CfM5UC3DviaVGVBaUR9K0TrMTEnLYnz5uM7KwFWXHQVST/fm8vKVPL60iOdaX3PLyorUdx99rPqSIa99jNp5qH1Yg5KaSzh+9Vd/LY9v3BBl9g/+4d/P4wsXpYYdoH5lmrlLQaro5xpqTbq0dDHV7caUUWlA1uva/syzej949NFH8vj5Z57M41//tX+dx6997ZU85vtKGSzDYzAYDAaDYeJhLzwGg8FgMBgmHgcvawZF0etBOQVztghpQ4idHMVKc1bKrHpLKph6U6m/U+eUXgtAmfGNjKlImh5FVe1fQ/p1ugl3p337jQZKC7Zw4nXUwNqDkmcMKmoIvobGVSeWz+TxGgyhel2ZMzJ1T2XWEAq3cXwMFIjneWPQRimdy1CMyQcdVGkqXeqjxkkFqXVSi5Wq9r97W8ZSNFI7uXw2j2+vyWzswabiWlMp8BDHjPfRGLwEKsdGUJJcPC01QIjxHGJFf2VK15OhZtwA9apWcK5feOmHdE4YCzc/lHprGuZdWxuoFXNEqEe63hjp4dSht0j1Plyx4uM4QYg4KHH0wnfRmJP3bAba0TEk2/dbi3W2fB4rLE6Ph0ExnVYqukH6vYwao3qJ51pGnx0lKpHGeR3LARJc/wj3YACOitQlKS2aQZLeybBPmrHf8L2gyTodjf3MA41c0f7zoKo8z/NCzOFbW6L6l85f0Hef0lxw/5bmyy7mcG8MpfCOTEhXYO534n/9SR4/86JMRD3MUyNeG+bd7Zdf1f4/9IPeUWBnV+e5Czp/d1fXcvv6x3m8+gCmeluKA6hbs4D1IhVnvuIZzLMj0Dtf/epv5/HWlvryH/3jn83jp559No+H+yh40l189tVBb9VqpGFxz/OZjXuwinmdS1L4nOUc9AJMNJswqf2X/+IX8/jNN1SbrQyW4TEYDAaDwTDxsBceg8FgMBgME48DKa37K6rvEiLN+MyTWjGdYQV3t8RU78QFlYtvoP5Kd0/7J15xCrkOpQFVAazpQ1M1Kp+6qPPleZ4X7+l/NNDq9RS3WjCqQ1q7AqqD1zYaKn134aLStbc+VMr17keKo0jnmsAgj/W8RpQ4HSHivtpjCKlGHXVapuaW8ngOJpFzc9pnGuaMU6ADq1X1zxPPPJPHs9j/937/D/P462++m8dUqZGqYrsnvptqpdkdx8Pigs77zAmZbvWgYujuKHXs19XeASjHFsY8SZ0KqNIv/siP5PG581Jk3LuJ/r990ztqjIZSbfig6lIOThgeJqAu/JK6V9RckBoiPc3BT9VVkqj/7t0RnbmxIkM5moIO0N+et1/9hdQ3+qAKinVqVmNqaWk5j2egAvShlPPCYkqrDKT9qOg8LnrrkYuqgzRdFVVAiqqL+YiUbB3F2hqgOk/Oqw5V5MHY1NN4Tx3+UZ+9/7HqFX3rVSlhZua1JGEEeWO36861g76WA6zBHO88FEYjzOcJqHEffZ4MUbcRY2wVRoWbf/C7eXx3XSqnM0tSYqYL7Tyuoxbk9quq3XRUqEQ8T90Ld66pTd9+7e08HuO6xuiQEHN0kGju4lKIMEDNShj2TkF5XGkpfvVVUXgrq1KY/tzP/ZM8/tEf+yvO9dQxr9O8twuFNs9pZlbP+BD30fZ2J4/v31c/fXj9Zh7fvat+HWcaK46pK5SLz37++/N4D3N6GSzDYzAYDAaDYeJhLzwGg8FgMBgmHgdSWtOoe3JiUalirqrmiuwh6iplgdKyVGkxlT1Gijaqsn4HVCdwsGpNS/nCc+gNlWaLsYI98N33uQwp2wTven2sDO+ua4X9CLWkAqTHSaFVQCe0Z9ReCydUG+q996/l8VTGGjjFLmbJMdXScig+GHSdgXLi0pPfl8fzJ0RFTkFRR7Mr1iRjvSIPdVaSkfr80hXRPmMoU+bbbR0fKW2HNsn2U1qKQ9A3i4tKu5+FweDmRkefPStFnY/UOg0DmcqdmdXY89H/jSmlb69cFdX73puv5/HaA5lqHhV6HZmVBbx30AcBjN1IV9Tq2F5iGMbfQjEMO6nY6oHCXtvS+Qx72h7TXBO1e9J9wq8I3736sWiA4a6ouxBzQYrrPHtZY+ozX/hiHjemYXKXQZmEOSt1VCTFijC39tbxOA9+8fNSFyVI3zfYnzR/Je0Pmqgaq+1nd5XiH91T/8TotwxKpt09zQ+vv/pnebx5Syaqpz6n8/zmN97M4z/+I1HVnud5dcxzK1D41kGTDyLtM66pvatNjedRFXUSUxgdosbeNo7/FozowlOagwcNtd2NDmgvzPdHhc8/q/qKe5v6Ln+IJRyo/+gMMNwvyRj1+KAwpqmvhzlxNBJ1mG3puqpoq6kp0VsfXBfF9s9//hfyeGdTY8XzPO8n//pP5vFCW/dUPNQ8cg9z3LVrWqpw/f1v5/Ebb2q8fHxL93gGuv3kCc3XVy4qrgYaK9tdPZdfeOlH83hvXRRdGSzDYzAYDAaDYeJhLzwGg8FgMBgmHgdSWlcflWnbLIylqKipQkU1hNLIq4reCWpKqe12Udq9pn0aSJXXYP5XqdAIDkaAMEfaQwrdqf8VunlzqrzqqJlFZdcelGMDmAHSxK2CtHa7pWsbDmECNa/U7ShVGzHlTJqBqXUarx0lBjCBO7Ug06+nP/NZbT+v+iUe+sRV8NCE0VXb/H8kME9kzasnnpZ66+QjF/O4AeOqKswPQ8ckz6UTylRa9+8rtXkbqdNToOhmQXeQ+oxBJ8R+WrhPH3XFKIpKMXY2N2TwxTo+R4WN1ZU8jjCuq6AbQ9ybrIeU9VGrCCo4UnWhUxdP5z/A/bu9DbNIfZU3uySab9DScfqgUkaZS9tSHTfutvN4Y6DP+KDWYtDQD9DH355SOv3yo4/mMdV+GcZNhBNnaj0h48B6YMdUTKviQ1GHtswGovTaN0RBpKjh1l3TWOhvi9ZYgwtldOJ0HjdPSonZxTyKJvVOYq5tgQK9jGUOnQ1918uvvOxczzTae4wac1ceV5/EmC/Hd27n8eycaJcWBYVdnVPW15zC2nmnQb2fn5Ga8s9vilpJKrpp+40DH4HfE77wgkz8dh/IdLG3JnPFNEW9Ktx3ZEypCKTBqSMUdIaj2iQGHRYnVOWpQafxTH+AcfaLv/IrPKi3uirj1Gce1zvBux9oqcYHoD3fufaejntbSu8Wvo/fTRPCzpru8Xc6GhNrK2rHoK4+fvZ5UdhZ+PC+tAyPwWAwGAyGiYe98BgMBoPBYJh42AuPwWAwGAyGiceBpFeLsk6sYXDNRvVHry+ucAEy9oyF28ArswhaAzJpFhmLUZyzs9PFdvC/IJ8TrA0IU5dvzyDh8wMUpYOst1Jh8T1x1ztdrSVI4WaagkTtQELbbGqNUL0pSfMe1nY0Gzp+zIKh6fG4uTZRXO7Mhct5XG2CywUv34cz8QYKYK6vK2aRTDpssvgipese1kCMKTPHoOKaEa7t8Hx3TZbP93XsdvuWuN8IBQ63Icsv+47YKcqIc+J6JpxHCrfspKv+H4Bzj1gM8Yhw7y44bVxLFWuhKijut3TiVB4vtOXAO4U1GWzDCtYF+eD9b2zKCbW/o7E8vwSHY67xY/fxmPvWfo3wdwvO3MmS2rHX6ej8cIuM0Qc3UVRya1VjeX5Ja+rOwRG9jfUAMdb/JTFdXo9/DU+E+ZVWF4N1yX3v/p4chRsrWrfDM2pWda+15tTPw0Rjs5romkOsF0StRm9pRp8dwQk47ejeH9SLiy57nuuiP+jrPh9iHklv6hqe3da9eQHrmWoYe7Qx8ae0PqeBOXtmRtfWwimdxlTz0g//sM6zevT92RvA2iRV2zVgW0Kn7CQptkZwi9zC8qXE7ZzPZT5zaZs+gtt+E+usLp5Qf2eJ+/z5j//h3+oasO52gO+uTKs/6nWsWUXfdDuaO3a3tAaNlQXasCdhvAcn77m6njnvvftWHh/GzMUyPAaDwWAwGCYe9sJjMBgMBoNh4nEgpUVZtxsjxYu0VgwKiQ60TBU3G0p9bW/DDRLSRybURiPIzEF1VSLSGzgfh+VwU3Mx5NH9vhJgPRQSpaw9RnG8MdOOY8WbqdxMkVn3puCMSdndJoqv1UHj0bH6uAoUNmfbeTy3JJnq3VWlzbd25Fp6B7TJyy9Ldrq6KvfQNo559TE5jDZRVPTsOTmeZpR9Q0aZgboMeP1IYwe+Sw2RWiLTMByqPyktX9+TpJrUpcNSIP1LOXkI6Sv7k2Nk1APlShokOnrpKylQjp0Brt3b0/ksLkqSzzuMn21Niw4Y9PVZStfPndJxTsy385jFCrk/7RYS3H8VyN6/c0acR9CmSHcP4FRLqjvB/RiP+FnQ23CdDiqUokOWz3OIlUIPjonGIgL89gxRqrZO64oRZNmwt6jNio7w4ao7guR8fFs0rw8JchhoXMdd9A+sF6Jt3e9rD0RD3TujeSNFcUvP87wY91GE9lv54HoeL2IJwEnItE/tyOm3inl3Hd8Ro2Bq28PygaHmnThRe11uy309XNc84F0Q1XlUuHnrZh4/uKM5dH1b30uaO4FsnJQW7T9YPNN5PpTI2LOUNCz2idWGNRTnvAwn4/lTnCs8L31GUvRVWAlMtVS0d/mMnOsztPtrf/x/8vjtN/9c+3g6Dl3yWRS521MbTYFirYKGXrn9cR6fv3DRexgsw2MwGAwGg2HiYS88BoPBYDAYJh6Hz7VTbeEz9avUFFVHjZrSstubnTyuNbTCegdFwHojpUfrdTfdnZ8sFAVVFJ6kkIcr2N1iiG7RNR6L9pZpiUKKzs4sKjrEucZQmsQNOEejlR11GfYntZAmh1lv/snRB/2ytQvXWygquqAyvv711/L47XfkYDsD+uLefaW4e+jPZz6jIqQrUHXRsToroZKomvIdSmv/+/nDqYYxaBQY6XoROyWCGgu/AaIUahnQKZ6vYy7BvTmFuqYKJ9HkwdH/riDFxpjZ7hDns7fTyeNX/vQG9tcHHoUzcRUqEqac61B+UeGTxjp+DUqxxEnLq7+a+ygtKiXDSLQ31WJUncUYFzHuTd47vGd7cE3fxX23hYKyu1Ao1qZQbBXnFh3Tb8QY7sqhp/PL1nTvRD1dQ4g2Jrm/O1K7DNE/M1DnhLfkfpuMcD+ivQLSikNRMf1N0FNw3U5pTe15XkoeBbTyNhzCa3Bz9gY61hSWTEyDmonRLikorb6v5RNbGP8fQEWYgNKcY3HMNZe+OQrc/ljtS4p1c1tzSIDnFxWLvEeoVnZc5jE/li5/cKZGFN2F4m6Aoqv3OlCHzbSdQ51bQKFl0IchFFsZVKxDjFM6nFdx/3JpA+/xelP3fhMK0nlQ8hcfUTWAuNvJ47fe+Jr3MFiGx2AwGAwGw8TDXngMBoPBYDBMPA6ktFi406WHoLxAyrpRVzqqGiDFOVBqsYv0aHcPhlRIUU/BqI+mZzwFUlKpk79zuDfPK/6Pcz1VKL6iiOodfaLb03kHTNMnoK6gNNjraZ9dFPQjXUMFSgrbpOOitO6tSG0RV1TgzatRMaA+uYWijGfPSml18uTJPKay5c03387jDtReTRgSVlC0tY7V9nUon2plxUP3042OMRc3I4U7hNIO9GuM8dmD4oX7rN5R+v3111/N425P4/niZaVX/9ZP/908Xl7QGF6/p6KBR4diOs9RZKC97t9Tmr0HA0aae9348MM8np+XkaBDKyGmGsuJQYGFuJ94z+1Aoel5rvKN884JUIawSHTNTNFnVH6OQGOlqfbZQuHNGx+oqCTT7O2zGuNj0G8+KNKjRL+v8+7elPJk8MY38/g8zN1GUODNwJC1jsKtjccu5vH47W/lcbQlZWmAwsbDSPPOAPPrKhRFna7a8e5WR8fPXAVl6piCQvkKJWMEWWsF+7u1MUGDgrwbU/kFyuzdHV3bB+D6okTn+hyuZ2nu6BWUwwFUk33Rdg0UNuW9QFNf19iyOKbhakpDQtd5EB+FUSEO2UUx32srOud7Q9fg9X5PbTQ9I7XbGMftgZIcgirrbXfyuDkrRVwNzwG2xRzmo/PLUoHNLmge6INKXb2toqWbW6J/y2AZHoPBYDAYDBMPe+ExGAwGg8Ew8Tgwn+esEndSZ9qHxmIRaquMoWpJxjDbQ32upVmliq9/vI7togOeflxUyhAqAqbsRuMhYlctQFBhQuNCqjAYf3hbtT/uPFB86YxUSuFY7bIDJcwQSi6uyK9UqS6DKsKpVXY8RmchUvO7e0qhB2OlyntIOY9RT+j7P/sizk/HfAfqrRSdcu+eDLci1PchLxmFNcRhYRwglRvuez8PHbqTRltMp6POFNV/yNrGoDt2kRJ//TXRWNvborHm5kUbXHv7/Tz+nd/5vTx+/mmZdQ2zo/9dUabOYEqc9yxpLNJSVcQbG1Kv9ECZVGusjQPqEUqhiPXoHHoKFBj6tbKvvhj343HX13ROt+6KYp2eUR88flWGl2yWPY7lgeajW6CxNu/pmAunlTbnxJjFUrYc1y/EB2+rJtD6K2/mcXpf9Ft9Sm20QHNCMODZvObXxknRD3f/VDRAjLqAHmj47VnNa98Y60rfAiWfwLB1E7UGx5V9LQM6NcS8wHpdVfRVxOcL9kky1K3DXLAD2vt6qnnqI4z/cIF0qNqlvyvK5dbmw2mQTwreIyko0G0aJ4KGdXwESygtl84vnut8n89oUK+Hof5h0rkBI1rP87xtqBep2KzARLhC1SDnctznszCpJZXeAQ3N52CrpfeJlbuieW98+1oez+uR7p0/o/FeBsvwGAwGg8FgmHjYC4/BYDAYDIaJx4GUFmt5uKXqiymXzW2lkOfPPab9x0qndjZEDTQaSv31d5Va/PgWytlvyyTt4oULeXzlypU8bkLV9da33ik8Z8/zvMcfeyaPBwOlQW/c0Hdcv65aL5tDrarfgVnVfF2pyaQkNdnAivS920oJxjFraTWwXSlI0jNHCaaEt7Z0Pa1ZpQIHSP2z/9kuly9fyuMnn3oyj1mHrLOlfm5DpUWDRQ+1sALHcCsojP19LI7vpHapzlMY0ECvWqwwound6n2YhoGK/dxnn8tjGi/euav933pTtEQbKoQRTB6PCuX3pvZhipt00izOn8chjdVLlfZnGtuhpUBd+aAtowrVWyVtDprX8zyvCmM4Xs+tW0plR6hPl6Tavgbzy6uPaTwmSI/HUEHOnpOyrrIgNVYAw7sO6h4F4Fj2MzdHhSAQbdZDzaz5lu6dD9dFvw1DtVGNtA/UpBvvSYnZGWjO8jG/hFBmfQiF5qsjXei9luigINK8ydsx2ndvBqBg+L+KIyOE2So+O0Lch1osQ92vbfTDPU/XNsCc2t9VW5y8IPO8AebsM5f0TDkqhEExtZ+gxtQYCl2HWkrZEsXwS2q7lW3PqCqm1JlLU1DX0N830abOGhbUsBsojlEPjJR0Crpx9EDLBbqbmjeHQ+2zgqUgnQdSYO3udvJ4DmrFJ64+lccnT6neVhksw2MwGAwGg2HiYS88BoPBYDAYJh4PUWkVvw85WTfQWyt3ZbC23lMa7PnnPpfHtVmlozbWZYTX74oC2dhRWuvtb+qY2w/+cx6HSD8/8YRUGkuoubE/wff7v/s/8vjaNaV740Tn2mgr9XnyvGoL1X2lRze3lLJrQwngoQbQm+8qHffhe6I6ri6LfqtAaRCgFsl3GewdEXZgBriF+D5W5Q+RamWKdGlpKY9DnGtnW2lKKrwyJKkbqLGWwFSRdcsSUHo0iUvQN3Himr7x/FyKCiqJDJQjlAgplDcZUvlbm6IfqRw6d05qQeLWHdEMAVK//S4VQgPvqHGY1HfqtBfOrV9MW3L/jLXd0DekGzwovxz1HRSQDh2GPgorLqVVq4kCHKC9SPU+CeUb69ldu/ZBHvd76tcK1GUJxqOT+kefjTEmxjBSq1YwzryHt/v3gnFL53ojVP9sbes+PVeRamUj1n0XRzrvxproveE9KG/QJ12M91qo9r0GimkESpa1sLh8wANVO9ynjvWhTCRD7+M8Ejw7hmjXPTx2+phr0lTjZw01qrZBXSZQr1UC1IADLVfDk2HuwkXvqHHjQyk3W1OiJB+sSo1EGof1plyVZVa4vWwfLoVIEtbhAhzOm9s5L+8f46BAQ9y3Ge4XXE8CI1cuVaBab+TcgqA/MT6mUI/yyvnLeby82M7jhTmNx3isObcMluExGAwGg8Ew8bAXHoPBYDAYDBOPAyktpqAdJQjLzcekH1CH6X2ZZ/WRoj51+mIen14WHbR8SbV7VtZEKyycFJWwsXI2j6+99Voev/OuFEQnF0ST7VdprW4qpThIlJq78vhn8nhxGQqOSHm3U0ijZVAXXb8jQ8IHD7Qi/9ZNnVM11fVXa7pOpiZrTor/eFRaCSik8UjpyA0o0PZ6Skey9ssYKo/OJujHrU1s13G6XdEdb4DqcpRVJWosx4QRYy3bp16jSqhWLTbEo8FdtUqjw2KqpQ+ahgZaXVBUCwtStZ09czqP19Y0FjbWRBOegKHbUeEw6W4P7RhCFRXHTF+LGqCZX7qPPsy/F2MoBgWU4t5PsD0eKx5QjYJ7yPM8LwS9S8PEqSnRODQo43dzVGxtqN2pFktAbfKaSatSrVeH6iweFc99R4kYVMzMedHqm5sy9ozXRWMtN0DXNNF2Q9CBOO+boIbXh2q7hYba+j7moMQHRYF7PFzQ/NVoQonYAb3puYrKDGOSZZp2cE4+xsY2Yqo6E/w+38HYHvpqixGMYBcWNZ6Xz+rZsfGRlkms7brnfRRYaOt+j0LNoe/S0K/UbBC7OHRVcW6izKjQNQ12DsoPIwblu+87qNJi+0ZRcQ0wP8V342BcOuKClJn6cruj8f6Zqxfz+DSexV3UKosPQTdbhsdgMBgMBsPEw154DAaDwWAwTDwOpLSYUouRsmZqiuXpK0hxpajRsnJfiqVuV2mqByvtPG40tYqeZmWDnlKrS6dleHfh6mfyeHtLyoT1O/quLHFTXM9cPZ/Hbai5eqArNjdFS/hId6/AkG4Pdaio5uhhO+PpllK/bk0ypMpTpi+Ph9KqoJYY0/dVrIyvQ5k0Ao11+5bSwMunTuXxEIqf3p7aYoDt/a62u9ePGOfJlf1ONnZf6pfpUr/EuDCCWVmAdKlThwvU1Xioa376aZlasfYL0+w812mk+GtoR1JjxwHXeJBUF1LO2N81niOVVHycsu+qsXeg8EkcmlvbWT8ojt3jj8fFnyGlNYs+2AR9yu8eYdzBv89z9GpoDI6DKigwznEcWzQzPEo0Y9FJT54Wrf76iuajj7Y7+kBP43Q21LgLcKF90liQ123jnoigtNkFNTSAWWwTdCiVVRn6xtt2lYg+xgbbfhvGq2lGSoSfFYYYbwMcqYupvYd5JKrpGk6dx3KIdY2XGF/WAI17VCDdeu+OTG0HAz1nQioZo+LHMCn/8nvc+QSOifsaOzkKLFJmbPV9xoMZ/8c5m89XzCnU6znzN6guLluAEM/rjXT/np2WMngahpIpFHo+TDfjQ6ibLcNjMBgMBoNh4mEvPAaDwWAwGCYeB1JaTEE7ZkdYDc06HcgIe8lQKVGmqJnS7He1+r8Jg6ZaTSvbIxgdbaH+RqOpdGqrpRoai2dkFhiPHZs0b9AXnfbBO1J5DYbMfetch6A3ekhHxsyVwyQvRVp+3BWl5U+jbH0ZXfMJ66l8L1hYUIqwAVO2xfl2HveQKu/DTIpjYQ81anZhPDg7K1qyNa0+JDgWxjGUII7Kh/tge+oqh2hi6KhnkDodg+5wU7MllA3izQ2lwe/fv5/HLZiYPViVKnBMQz+k+7t7R68EOSqUKUSIMrUIU+6pp/GEbLozwdScmjz7+hL3Du87J4bak+aX7jyFgzo0Z7GSjXRjUqJMK6vtdpQIQARUUIspqqtdszkppNJA99cHK5oX6wHqG+E+Cj11SqMuteI6DT9xDqy7F1VFmTWmpECqYQ5OU9VC9DyXFWHcBY01xP4ZfnvT6HJMCgWq2QxmkCGVn57opM6mljp0MQ+88FkZ4V585KJ31Hj/vW/n8d4ulMF9mUj6oNdTh86jihXX6zwTHC6/8LMMQ9Qj8zhnok0CPMey73r+gELj+TlLMvAVzjMO/QRlpvPdGO9XHlVts+//7LN5vIh6jEM8r+uor9fAMoIyWIbHYDAYDAbDxMNeeAwGg8FgMEw8DqS0WBup3sAqadAPI9BGVaSUmFza2xE1kE6JDhgNdfzujuitCCZyFSgEHPUN09JMV0NFkOxLzTF1RnqkX1LfiaaKWYraS05qHnVccD0Z6Jo6FFGkYZiKD7BSP4iOR9XTmlE6ulGDSsATJZiQDoKSZjwuvv450GGDkdRbDtBcY4yXIVbkl6l0SGOMRy5FGZeogUiJDcdQ8MBwr0xJNEa8tq40/QooLdaiWl1V2jxGqjVBe/mgBI4DLi1FNcfD93f3KVa6OSZpjoKwOC4zQnTizL03M9R0qsAgkn28cl/0IecdmipWK/qsQxk7cYlpo0MJ0PyS7XU8Csou6w819N2PXJSydHVDVPI6KMRd0COLuJ5KqLYLqaAFx7SOe9xn3Tmwe5u7omI++/kv6HtBZ9/dN9f6IekL/a8/Rk+EoEorOr9aQ/WRFqHMW1rUPLUA87lZGHuyXmCGOf6pJ1SHbR7U4GEo3U+KLSjCOFf4wcOVWa6xJe7HEqXnYWpvpX4ZDYVrD0rug++cFL8wDxPQk46CNiy+5z0oqmZB+T/1+IXCeAoGsgPc76yR59RjLKGkCcvwGAwGg8FgmHjYC4/BYDAYDIaJx4GUFlU0/gApMoeiUOqeFFJ7XoqgLOjk8Qi0RAIFxmiIlC7T6QwDGMc5qWhQUgektUJnZTwVJkLqLDeHwger2KNICgmm35sNbW+1VA9npqRGURpSQUQK4fjfQ0OnLbWdGUh2Qw1qEaZmowEMDIfapw4lCAeMk+JFyw8xLmjm5ygVYrdvHSO7pFjZNQaNFYNOZPpzANqMxxzBQKy7p/R9d1dxhuNMTykVzxR0lW1xRCgzBiyjaBwqJmPKubgejnPMEoUTUTZinb2z4nT9d06JSij9r17X+EpxD1ah0qnN0diTtHWxmvQwKsg0LSPEjge9nq5tpqXlA6fPLOfx413dI6+8LJWpM09HMCHEPBLjmofo/xiLD4JY21tNjeUWliHUQBl+cE80734/RqpwfCwlmJ4WldGY1nfPzouWunDhAuKLeTw3T5PA4j6sw1w1wj0YwVQxBn3O+/2okI41nwRQJgXom5KSdw7KzFTLTAg5rg9jHOp+GSiz0D0h9x7msbAMw6G6OU/rnKanNXaefvKxPH7uiYt5PIWpMvH5vMaYxTOadb78Qxi8WobHYDAYDAbDxMNeeAwGg8FgMEw8DqS0nLR/IiqCK8zTkrQx62pNwRiwinTizrZWs9fgWjiC2iXFSvuMaTPQU5lXtsLcTd/R3M7xqSONVZLyiypQ2rAWC2qATU8rLRsFDlGGw5d9V3F9sqMEKQH2LSkqqsgi9AlX4Q/GrIej/ZlSTEAJ1ELUlfKVfm/CuKxaEb3JZqljpX68T6VFymIwgo0ZUrIRvjvA+z2pWNKsrHGTMi1fUo+mjCphCroK1eFfJA6jljoMNXYYlBnylabQD4ky5UlUpnI5hFIlwHgvq1t3GMXHUWL1wVYe12oas7VpjZ3LV0T1DEHvXvvWtTze2hDdmlKxV8xoegn6LcF9QHNCqqDef+9d7Q8qbb/RaK8rtVS9oWMtn1YNw1NnpJa6dEnXtrik5RC8//nzPHGoFdI6OqcRFbQpzSkxP5SMo0+Dxx87m8fXvn1H5+bKHXE+xVRvKX38Cemtw1Bjbkmu8nuf853PUlqgsagAvoh6Zo9duZzHZ5dP5nEdar0Qz0qfte1wrpyveW1NKMnLYBkeg8FgMBgMEw974TEYDAaDwTDxeEg+T2kqqmAyn+le5haVjqpFimlgSFoiTUQrNBpKm061lOpk3Yw0GSKGOqxspf2+1BxNCQNQbpWQpn9UGoly4WXu9ZQ2Hg1VJ2kcqF3qTR0nDKAiKT5TJ83KOkFHCacOEgoeBWXqHFICZdQCzCZJaVVCGhvqe5l2bDbULjXQPqSbakhpZ5FbK4XKLqevQ36f+nCE2mCsoURlRwVpVKbBmf4tq7/EVCtT5ceRNi9LZbvp6zLF1sNppk9Ke5WlxEnhusonF4dTlRSP06xEneI7yi+oMklXlRgJho5x3vGrtIYjndPmluaXagXLAWC49uQTUrm0Wpo779yVOSPvj5jGoegHH+ZzVDXtQJXYaOi+O3tOlNTiwmIev/+OaDXP87wHK7qeBRgGPvt9T+XxqVPa3oIyjVQ6PVhjjh+yQ45JJLY7tBeOA/XlcdybTzwuGmevrz64vaK6WqRVS2v8OZvL7vESiqqUliq+N8u3u8+HsKr2msZ4PH9GFNXFczKgPbusMVJFLTQchmJorw+jWOfaSihZUnejkfq1DJbhMRgMBoPBMPGwFx6DwWAwGAwTjwPzeQGogcEINY1iKGrwzkRjN5rN1fAtw0yfrcB4b9BXui+CQVMEiqlWVwqUtadIpTnZuH2ZaF4PTQyZEh+NpUYjXRWjlkeEA4eZ9q+BcmmhVkgUwrSPtUhKFD7+0WdZPc9zTbZqaL9kpO0pzfl4fjgOlUwVHMepb0RzQpha1Zy6YsWqMaZmRzCnrFddAz+mo6ngi6qk64rf6UlZVCo0t9N58Pikq0i5RU4NtOI4PgbFT5kKg/APofhw9i9Rch3qfLJi/uAgGqvsu8vousNRS2V1wvhdxTRA2fm49cmOid7CMN3qqGYWjetOLbXzmCrY82dFISyfFrVAJRMbg4R55BVTWk7tItwfDZirknJoVt1Ja9C/os9XddyrV7W9VsVcyCUKVOb6JVwGHl2krtISSrOEDT0W48HmlJ5fn//c03kcviHa7/5aRx/waZyJA3HpCA1h8RyjqpZqL9bkylL2ONoHSuIq5vTZFpZyeJ63vLyQxycWZP7YghntqRMad1y2wPl7nKmPA8wLAZaU8HpoUktTX9bXdIxGk4f3pWV4DAaDwWAwTDzshcdgMBgMBsPEw/+LUCAYDAaDwWAw/GXCMjwGg8FgMBgmHvbCYzAYDAaDYeJhLzwGg8FgMBgmHvbCYzAYDAaDYeJhLzwGg8FgMBgmHvbCYzAYDAaDYeLxfwEuSFLzxh3jFAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAABuCAYAAAAj1slPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAAsTAAALEwEAmpwYAABDBklEQVR4nO29WZAk2Xmded3DY80tcq+srWvprqXX6r2JhRAaBAiCHHAFJYoQSNmMjUSazCiTTHrR6/CBoplmSDMORzMPI2lGNI5IkCBBkQBILATR6L27uqq7q7try9qyMrNyjYw9fNGDZH4+L0VUV6GzyEHyP09/RXl4XL9+73XP/9xzfi9JEmcwGAwGg8Gwk+H/TTfAYDAYDAaD4W7DXngMBoPBYDDseNgLj8FgMBgMhh0Pe+ExGAwGg8Gw42EvPAaDwWAwGHY87IXHYDAYDAbDjkdwq//c+PRkqlkvl/Ru5AV4T/I9fV7KpXFS1DFUvntJhPPoP7y8jknyOqfroUEdnAi/FeZCnQfHREnsMsDV5px+w4/Vpl6o7/dwTMfDtTnFcVhM40ZUTuNapB9roQmbTbV1cUO/e6Gjc7rKSBr+6tdeQmd8MPz+l/739OJqm021tdZI425HrQ1wn0dHx9I4n9e1haH6OIrUd+VyAcfrPHGsGxr3umlMe4RcTuevlNWnvq++ds65Xk992W630Q71a+QUxxgPvo/BkGBsez6Owdj2+9+GOFIb4lD9yO/mcrq3n/8H/2pb7uff/4V/mnZYq6M+Lfq4lpwmVRf9GwRqQqGotgXo97Cnfuv2OjqmoHM+9ujDaVwt6d585atfTeOtjVoa95q6R0kua4cRe/h3rDiPvmNfRx2NnRymeYylqTKqeRTj+pv1et/vcl3zh3Q9SaI2fOELn1f8+Z/dtrn55rmLaQPNKmT7EWKNv3J9IY27Pc2dn/nkD23L/ey2L6U3MAzxbPK+99MnTmMi9u9sfHgx1yI+l3meBJ9nn5uep2tIsH7nHB7afCbieIfnpod5FKNNCY/x9Nse2pR5iXD9ryEItH4VSvf07WzL8BgMBoPBYNjxuGWG50pNb2ozkd7CigW8AeLFq9jV5wGyNHyrivCXXYQXxKDMv7Lx9ocMQtzSW3rO1+eFouJwdCaN8+21zPUkpYr+gb8ik0hvrUwuBfhrfyjEf7T1F6IX6K/WbqzPq11kjfBXxMaWzhMu66/Ua7EyGblhtHMbESd881acy7EvNSRKxRKOYZaGWR1kbBJmBfCXjc/0HTM5GlM+MhN8Uw+RrYm7zJU5FwQ67/DwkL6Dv6paHWWyQvxVwUwOMzxshz/wryG0AdmuCH/BMMuUy21bIiDF1WuradzpYU611UdegKykjwyi4/1WJu7DTz+TxpMTU2n82qk303htS2P2D778nTTeNaqzr9e20nhx4Voahy1livwC/zp0LkT2xsPcZBwjqxMhW5TDeuHhfhRGNI98ZG9adWXiEozTXB5/aZbUL/xr9K3T6gvnftZtFzheOL8MHwAYFz2Mr9rmZhpvbW257w9gDUkGfD4APtY6LNHO8/vnO5Kkl/l3DtnXZksZ2wtnz6VxGKkd5REtBocO3qfzIKvuJ4oTrEfMZCUe06/I/GSu/85yNpbhMRgMBoPBsONhLzwGg8FgMBh2PG5Jab18VXTArjGloCcrSv2WkDYcBdVVyiMtjXPGoLQSbFrOV9SUMjZSJpHO2WkrHxcg6xaAzoiPPZbG4eU3MtfTmVN6rRBho25LqfKhmV06vibaoFCqpnH72gW1dVS/ncdGz2INtNem0qbj8UYa3zOq4ztFbZJcKpN+2D6QWvOw8a08pHsb9XQfPLwPM+VeKCjdn8MG2DAUZZHdnwd602d6VWlm0lCMmd7P50WxOedcuTycxqTBWi3ROu2efpubcnOg2TIMQmafXNI39gemgkmT8UTb/3fFZm0ljXugXHz0XT7RNXron0ZDY3/f/v1p/PDxI2k8MzqZxjmkq9+7LIpqgRubuxs6PtD46KI93PcdgEpzzjkPm/xD0FU90FheV+cKsEkyj/salDRGQOA6jkFuio8hUsgHmoMh7lkCWm1jXXTIdoI0/gfZ3GrojwLu+YNHj6ex/33Y1/4AGotMD8dQ1NMCd/WqNmxfvXI1jSkA6bSyWwfuPbQ7jYOc1viXX3g5jVttfT46Oa12JJqPPuIS1u7Rqp6hw6ChM8uyF/FffcPbgWV4DAaDwWAw7HjYC4/BYDAYDIYdj1tSWrWO0kiNFeWOlsvwSQH7MlHCTm163uAYDzKoPOitMhRelQIUQfAE6IZqT15Zb+c5pcTK5dk0bodZ35aoeiiNe82NNG6OTej7Rx9I49bSFV3D0UfTeOnFb6Xx3IkP6Rhuga9j9//yJZ3zS/9B7c6JWihTyRPcHUoLDFLGM4cgXeNl3od1fLcLZVYsyiGMlNYsl0D1gYrKg1rpdXT9pIDiAVRSGOq3nHNuY0OUIxVfETgq0hEOSqUsXaVDqN4KqGwakPmmZ0WpWOb/4JzbnzZvt6RADGE+U4ayLKLYAipLh348cnBPGq8tX9f5b6hvn3jo/jT24Ws0ium1sqbzX7o2jzZgTmAAdjuYwM65GPep1xKV7nVCHpSGGQcR3LM8/J/oH9ShBxDWkRhxBGrby8OHB78W9bIKFsOdgfPur5O68wbE3y+UFluZJKA/s/+TRjHUzWfflZrq+sJyGnehJL40r2fd2o2NzG+feeNsGj/77NNpfOyI4pdffiGNi3mptN4+/V4anz8nCu2e/XoWV8dFb/l4Pjz9EZ0/zxcNrtfuzmAZHoPBYDAYDDse9sJjMBgMBoNhx+OWlFZARQ3ejeAf5uqgcTa7MJXDefKgsXKgq4ag8BkFfVYuIOWMvdoh4jyMB7sJTMjeVgqtsLCeuZ7CLhiO1WSg1Jke12+v6+LaHaXHA1/H1DzFM3Oy1++AlmLKPdgrRc3ql38/jRtQoHTzNK1zdwVdlt3IeJvhvoEeIE2USQl7pBz5HzxGQysfaOd9CeocDzblYQiqANRFByqf6KaOoTKrmCk7AbqKaV6cN45hl44Use8x5e7w+SBlVoYP63t8HN+hlOA2UMDUpXV8BLrRgTL2oYgMIrWtua45kTssSi6EYqmGsh2jVaWfc/m5NC7DSPDixfNpnPRIH6ltyU0rD9WYOVBfpIlZJoRrQYC50/U1p0ojup4Rp3EXQe1VzuvzERimTUzr2lgmZHJc6jXDneNvSoHWv4jC9xHIzFP1CvXZO2fOpPHlS5fTmIrUUkFbDeZ2yaT34QefSmPPZRWUbZiZ1ms30ngF1NdHP/rjadxFPahOU8/T4lFtHemBTuu2QMPj2lZXtO7M3aPSRs7pc6O0DAaDwWAwGG6CvfAYDAaDwWDY8bglpZVnDQ6/f0XTCOn0GO9PPaiAWKmZfE2P9W06igsFUBKgrlCqKFPnqo0K380Xnk/j6ZtqgjSa39ZvoB1bQxfT+NqrJ9M4hOIlfFM71XsrMm9a3oLZIOpQDU8pXThR0ufLG6IQ1pu6tkakNF3cklpmW8EORJw43kPQIKi9RXUVlVy9GPWwYHRXQKVunyqXmHQl2oAxxTZkFF7FbAIz2yZcA2gw1mkh9ZNJcaNNCSitmEo2VlRnI5L+9FnWg3D7OUqvP3OVqUjMosURVJAh4s6WTlQuq7p4GXRQuaIU9/ioaJ/JEaXHOzWooHq6+GJO54lYOTrLqWbr/Xjsa8x/jLsC6rwVCoq7MECbm5Nh2rN/54fTeL2maw4CfXd8VHTd3mmpPUmFbjY09w2GvzaACgxQk+qVV15N41/91f8lja9d0ziNIG7dv0/qqHYL2wVCza0HHpZ5r3POPfa4FMrHjur7l65K8fVvf/v/SeOVVdFepMO4jaBMg1AU1cwXtAb9xN/7yTT+5X/+D/TdAp9dd7a2WobHYDAYDAbDjoe98BgMBoPBYNjxuCWlRcVOkqlsAYUE3pkKiENfqaYcX6twTh/qmB79xaisCfrLgJi6dz0oazpSXzX8LAWyVRctRYOjNlQ0DZi49ZBCr8cyViqDirv+9ptpnMtDNTQMegCf966iBlJH19BryqgwcDAt3EbkkQqMQSGSuonAleRA72SUAZkYyrkcjCGdUplJVznVCBQYazTFoB89UEAFUKmhnx2uIUz/fFyDh/FD80AqABLQFKTDcjB9DKBSI41HY8Qo7J9SzYhRvLjvMR8E9S2Nc/7Y6IjGXYh50W3B6A9NHhmWgm6oojRzBIo18HXO2QlRPYtLMtSMQD3vPXBQ7exoLNfWdE7/ZnkFpnmMBSNfkVrMg/pjclr1ehLM2XXUv5sD5fbgXtUMm1/SeGwg3R911b61VfVvC4aESV6miAbD3QQp8hzWsQsX5tP4137tX6fx4nVRTG2oo0aHq2n8sR/8WBo//13RYe++o/qQpQt6Tjrn3OPPPJLGr76h7/y7fy8T3biLdT2BygtbR6jQ60K96SWivXtd0Vt//rXvpPEPfuoH0vhDz6gmZkjz2tuAZXgMBoPBYDDseNgLj8FgMBgMhh2PW1JaWTUKUlB4T4qpqOgvanEeKQNQA+WsvxEaBRoC36X3WycEbYFUGVgyF970OlfB5SZQEVWGlVLzWA8pr2OmkO7uNpSmD9uqadSsQYG2ovRiTBUQuLsAqiEftU/8u0CBOOec78d9Y9Yro5lfPk8TQvWFFzPV2v+3uCOfFBMNI6kCC5H6JIkZxjQevKmOEccea4ChUTTdIi1FE0OqcDI1vfD5zaaHOry/jVkEFVKWDt4ejExIBdhoin7xoBTELXOVQOM6j3kwNKRJePaCau6cvTSfxj/4MaXB52ZlHlbzdE6/KjPOyUNKOY82RAHFBR3fXs2qnQqgrkuToqJiT3RSPoe5E8C4DKqzoAKquq3fPvmi1JvLdf1ucUh03aWrSuvnh3bpGkaqaTy96+7Mze93/HcGcB/E3c+7jS9nOeP+P8uHAWvbZU90R03bPgxqP1SlePatrW+k8W/85m+l8aV51afiVoN8TvO6CLPXP/zyV9K40VCfzOxRTb1dc5rjzjk3NS2zzS/+4X9O4x6oqxwMEKkADnA9k7swp6ZlJLh4Wds8ag1dAxXNr7yqrSMf/oHj+C2EA9ZiwjI8BoPBYDAYdjzshcdgMBgMBsOOxy0prYEYUD9pUL2STPYRhmH5CZmYkUoIaNSGlDZFOklb9IZP4zXUZwqKrK/k3EZJv7c1LJXHUg8pxSGl2j7xI5/VeXva9X79vGqWdM69lcaFRdUvKW1upDE91iK8Y1LhFLIO1V1Ks8ZQuRSKakcpo36CeR76tYdrKJKiAl2XgwKLF92DSiuERKjZEU243obyCWZww2WpiMbBNjqXNaXrgX5KkF7NjkOownB8r9fr+zmPZ12xTI2xAeek2aCf2/77+dQzP5jG3Z4orYuXVEsugOJsBGntohPXtbGpdPIGTMJKFXV2F8aeX/2Lr6fx7G6lvgs4f6uha3/4wafTuNfYTON3T/5l5no6XdW9G5nU/XcF3ZsxqMiqlak0rpSVci+VZB5YwBgcKYty642IGoPAyz0wo7p4rVBrRSHQtQ2NQB23rRi4en6A8/QHx+wgFiAZQCt5gww4b/7dAc3O/Da/TeVj0n8NytbC4zE6Z4itDlRQJnH//iUV/tcJ9kM0oCBhhEX3d/+/30vjv3r+xTQuD+t5lUf9u6guOrc4JgPO5pZ+a9/RA2k8VdXcevrxo5m2nntPtfGuXBYVXR3VnNpckzrSw2MgF2rtX7sqVefGCtTQXV1zsSJqrYX5+86b76QxFWgB1tbbKdNmGR6DwWAwGAw7HvbCYzAYDAaDYcfje6O0Muif0qezmE8KwPVPP7K2RgHFgcplpagDGOdFMK3rtpTi2uophXbJR2rcOfe165JnXGyqXpVf0W/80I98JI1Prisl+vxfyniwUVdauwL65Yl7n0zj2S2ptLZAgcUdtY994WUorQ8icRgM3+ufKqYygPWOQvQxlXl1mLsN1VU3ZTxUGrUBo7tOhjLS767A0O3KKmqu5NSnZRjP7dkv0zvnnKvCfC4Po0fWd3NQoCWs49a7SfH135AbYDboDciX8nMq3DzkdROo0bYLe2bUF2PjMtV75AGlo5mtr2Du5GiuCTqgUBaNNTc3jc81P9o1zbUTJw6ncbms8zxyv9LSAaRivabm39pj92Su5+x5pawvLoiW22hofLme+reBuZm0oQgc1sBuN2EYGMCQFKnyFui60TFdZxdr0HpTY3lm9935G9HHOOWYzf5NykWCylQoC2+DAssyKJzjfX8pq4Thep+pI5dFVgWJ43BpGVoZ9FOjzbnJ3+NcHqCW6y+4zAi2+Ln/N0Rpcc31M9S56NM/+9OvpfGff00UcGFIdGuc0/oYFzV+R0cxB4e0VngxDGGLUEqh/tV990EF5Zz7rd/4zTQ+uG+v/gP3eH31Ej7X/Qu3NOcLXShucS+9grYtJJ7W8UJBas0b1xfTeG1FNPyuuSpa+v5j3zI8BoPBYDAYdjzshcdgMBgMBsOOx/tQWv1rVzGtmTAlinofTDmybkbgZCbU20LKuaHUNzZtu1wJxnEwSfMKSuV1ElEgp3HOk5tShTjn3CKMklpQGxzZeyCNZyeVyu92lf773M9/Lo2//MdfTuNvf+ubaXxtVcZKR/ZqZ/x9+x9I47EF1CnZYs0sKnzcXUE+z1pJNNJjSlyfozyVW1gQBXjx9Mtp/Miw0pe7qurfDk7f7pHGxHgBZTaah8KAqeiGjB1XL4tOcc655etKw47OKYW7574j+v4A8zGmsqkQ4edZisp73zjTj0jXhwNMCz8IfvJTz+JXlSoeGlYaOMC15H0qH1HbLa85u4bxODmh9Hingzpnke7xkf3q83Jeael2RCpQfTJcYj2ybJ8889TjabwIteMm6FMHg8H6htpUx5zPQbVRq2n+t5BOjxtagzqbWJsCrTXDoLRyiINkAJXyQeH1X18zCk9QQ1EE6pljLaNw6q9qinHSQZSsj7EcUnGZoaegdrqpWzKUVsR29OeWWD+xG0Jpm+cjCvRWRh4MSoh8XeaQ/nRHfJdu5/uBtfzyMLg99YYM9v74SzL5O3xAZp6bp3SMA/1fKlfTuDyq51i7pTk7Oqb1YfWGtl18FrWqLp2TKss5586+824az+3bl8Y+VL9+rDlVKmB9yWG7BNapAOawsa/zdDpSaxaHdG0htgVs1UWTzXlVdyewDI/BYDAYDIYdD3vhMRgMBoPBsONxS0orogkbXo0S5i9pUIWD8iUpPgqzMgkLxrUzfGRSnxeGtfM8GIGZElL0uRHFPmrgRInS74dXlRKrNrImYYUxGSV1QNE9+NCJND53TvWEdu0RLbV7bi6NpyfU7n24hnxPKqX5t15N4xB1hj5xTEZsjZPf0TV09d3kLhkPerg/rGnWakuFslVXanL+ylIav/3m6TQec0op7nlM17OBtPwpfLcWK6X65ttKj/aQlvfzuuedlqjEg/uqaTzdynJ9zVXRXW9fVnr2EV9j79hRpYJjmEeSEmDdKyoKCaadKUmJM7W3QAdGVKZtv0qrkFF+gTKsq+88jwaMOj4p6H6shbr3L52SieaR4+q36QkZDDbboo82NkSBdfPqww76Z6wqqiuKQGHH2Xs5ifk/cfBYGveaup4CjBQ7aMcw1oIk1uc0TOxBEdqEknN9TeM9hjoo7Gg+rtWhJqzNu7uBrZbGTqejcdrGdoAwIi01QAWFc2brSiEcQJl7HuolcglCv9PU02P9pJuK6nkFqHT9/hQwqa5GQ2tKHeq6wgAPxjzcZj3W2Ouq72IoTrN18UixbT/dfHtAG7AWvf2m6KpzZ7X9IcQeAQ+0YMLlyke/ldU/9fpGGpPyPbxHa+6zHzqRxr/xa7+aaencnFReDz10fxq/9MK3dA09mgFqe0IdA69X0BgZQv3KXXOqC3j4gSfS+MgJPVtm96oNCa5h0HaEQbAMj8FgMBgMhh0Pe+ExGAwGg8Gw43FLSiuEkiKXkNNSmJ9QHZvqA4+l8dyTSkftf0yGfKVZUUO5IVFUEaiETkY1hMYWoaLAd/O+UvQncHx8EzNEgUUE1QbTrA8++GAabyHN2usqbfqFX/iFNP6xT30yjeffFe2zdFHmaWFO6bsD6JdLm1IZbbwhCix/F2ovOedcTGPAZdERZ85fSePlniiOlUuiB/cOa6j81I/+SBq/e1HHf/01XXN5XOPCL4lyOLeJGl5QGERbuh9rG6Ii9xyXwq03LurSOefWFkVjrbel5nn5pdfTOOzpvAcPy6CvWNJ4K6AGWAzaIKESBmPEh5rHhzKRjm450oce6LBtwmZDdE0OeW0fqpZcohR3O1TKuYQadpeu6t5fuQzzMMzB06AYR2FCCE9Id/DQwTTu1HQ8hYhtKDYmh0V1OZc1laMZYgQjtgsXrqZxbUPmY489KAqsgBWjiAWgiDUroNliSeffQt2frabWvjzGQZzcnbm5tKqOimHCl6FMMwqs/rxURkFLczd8ngPVGeI+b8DAtQFzym5PtF+7Q0WY1sQkzo5xPi5KoFA9T325snhNv70mCjxHw1OaDeKah7DtYXq2msajGOcJ1jLOTSrC7pYith9IPVIFV69pvfvkD308jZ94TPTOhfcuKsa2gGvXte4tr+s+3ViXqrackaIpfuaxR9J4fQnnP3fGEZ/7/C+m8a/8i3+Wxv/rr4v6+g//5/+VxjO7pN489viJND50/FAaHzgoA8PREa0FHswQHZ4bpMO3tjZ0TKJtJ4PmBGEZHoPBYDAYDDse9sJjMBgMBoNhx+N9KC3FTBcFU1Im7f0ffjaNH/67v5jGY/eoVk47VBrtAlLo197VLvQGUvSdrlKROezwH6koxfX4IyfSeGpSuXXu1I5uqrfCFC8z000YkVGZlgN1wfaNQ3U1OyuzwcMPiA6LoBboQlFRHRUVF15WavLSGSlkHFOx24gu+vXGJZlL3ZgXlbHQVnr1vt0y8PtH//Bn0vjCVVEL//eXZLy4sKm0ox+Irouh3mpDjXLPbu28bzRFt4VOqqBTZ2AuOCIKy7ks9be2JPptCgZ3p145mca1TV3b1JRSp5NFtW8cqkCaWwYFpOzJ7oLR8mnc5iuO7oIShGM5wkSNoN6ijmtpTYq2alEXcA/mKeuIMf3+ta/IaPLyxfk0PnHi4TT+H//x/5TGBVAYjTrHslrUbHQdUYcyqQf6cKSsOX/2qu7/+BAUaOj3HG5OAmoognqLRn0Ymi6AGqkII8xcBAVlb/sVd845t3hlIY2pLnK8BhjyDVIHMqufMRjEOppgLNdB+231dM3rK5pP6xsaO9dWRSXmUUeQteOcc26mhFqHTr9XKOs7Y2V8B9c8s1uUiA9F8OIS6qo5jbFr19W+Eoz1cj2oLzkH7w4r2RfcLkG1Wqele9nDs6JQUP/s2Yvn7G4ZCX7y4x/GD3CdgfIWWzbaUCVGMJbNg/7+zV//N2kc+1lq6Nvf1Rqf/Ib+b3xKz8F/8s9+JY2npnX/8hWo8toyAu01FCexxl0Y4dnfxbrWxvtBEeMd1ODt3FbL8BgMBoPBYNjxsBceg8FgMBgMOx63Nh5Evp5J+faUqIjzeaWc80sq4b6nLGXSN77xDcXfVHqsA/XDYyceTeO9+6Tkmt2tXdhjI0qhFUA3kLl6D2ZNL76sVLxz2VoxTz39lM47Knqj3lD6Olu7RudZQbqX1EIbqUmquvJ4rWxsqV/GHlH9kvH7/jyNV09LZbS9UNJvalQ74w/PSHkzBzOxn/t7Ugwcf0jU3Utn3knjRgf1UXCdHaQgQw4e5NybTaU1I8g62jCVu3RJaoPxaY0155wrIT2+vKy+34ICa6qi37t4WhTie0hxHxzSPXz8iCieqKj0eBFjJD+idgQV3U/KlpIS6sD4768euFPw/gWJKINiGaaCUH+cfF0qwF3rUqt96lM/lMYH9mrecR6MQ1H1zb/QXG6gps3GmuZEFAY4RucJMBE80CHOOdfABLu2JNpkAVTPwgWZgiZdXdvrr7+Yxg8dOZ7G9x2SKmQERmc5zAM/oZpO46ZU1PGVvK6zlLs7fyOuXBPVz+ES06BuQPo+q97iWdVW0nibMBp1w1rLW6DrggQUPqinmWmNhXpL93klzNLwB6HqXIB55NS41vADe0TTzF/Ts6OI2kpTE5p3UU/nKQ5r/OTyWr9qG6I9R9gXEXsM/eht/9wcBJof8vlQxLMsjzmCx1WGkoygnma9vCLGZtGRgldfNXDvz89rzO27V9sX/uej92bbjQE5CvVtIWMAqDZ1HWrbgcZev6znRveG5nj5oLaCeMPqo6EylNRYa8IyFYF3xk9ahsdgMBgMBsOOh73wGAwGg8Fg2PG4JaXF9GgbqoWTN2SS9c7v/n4aPzk/n8af+syPpvG5s0pFz8wojblnn3ZzHz+uVHQZNMHMjKiUXbOit/JFpe5ffV0U0O/8zu+k8Xeee+7mS0rxmc98Jo2/8IUvpDF31ZNaoaFXCI6m3VSqrdGCQRfM2jykMkdBh3SRXtwYqaZxL69r206U0GcjUIsd/cgzaXzwIfXxzARopmWpyD58RGnpf/QTJ9L4+tpGGrdgYtZuwQCvjVo3GF+ttn6rNq60ORVu3nCWBqmh5o4bLiDUvapE+r0OlAFUTuVjpZc7l0BLOo35Js3TQFcFQ2praVb0wNg+GfH5pe2/n7NTUrLlYPoWlDSlry2KDrp4Qaq8lU2ZlR2BYWAIStax5s5BHfMTP6p5k4PKI0R/NrY0rvfvk8FYuQKjyZsUlBBkOA/nWoEZIsdvvaf2zV8T7XkNNdxeeUN1iQ4dEo13/JBS9lPDokwSUPhNULLdFmju9t1RUEaoReTRzBIZe65Nmc8HmPP1cJpV1MjzCpq/W3XwzT3RhNUS5k1XfXFfRccv4bdqK9l+ub6u45pYz8p5nTfnNB9LFRjPYh1NYqiuwPGsbaJmImiWddByY3l1UimnOZ4DRZPzs+Nwu0HDx15H6xXrTRUzalCoD0m3ITWRy4wJ1DYjuwODxxAKyPoWFHdXtCZwu8DwUNbgtV7XuPBBV3nY6BJBWdxt6v7loQhcQ+29DurW7SvqGsZAn+cxHzt4/xiH2fGdEpKW4TEYDAaDwbDjYS88BoPBYDAYdjxurdJCtq+HNH6jpJTX6g2ZQdWhyAhhJPXUU1JEVatKIQ8N6zxlnN+DAZiPOkRM3129rjT2737x99L4uRdfSON8PlvfJUKb/uxP/zSNH7hfJe9PPKZ6YL2e0m4s6sXPuz0aSCkOM+ZhMIFCSvyb3/xWGr93VvTDkdzdobTKSJd6RaUI6221b3RE96G5cSGN20iF7kLtsn/46X06JhJ9EcMML4YBWIj+araV+qwjtd7qKvahPIhaWbO6TjtCjP/rKAV/8jUpAyYPiq47sA+1vupSDDioAdpttbvZUTq2tQGV3qbG6tqyFCKtLaWRDzx6wm03SAnFUDsmPfU7jcVaoF6XV0X73FjQuGPtsE3Uq9nCHA9QI+yhE6rF8ydfl3rr2lVRZo+e0Hw6flxU0p5Z9b9zzhVAjxyYgZLnU1IK9ljzDFREDqn1tRtq9+am7lkPxoMLqDm0uqH5mFG8QHXSgwKJRqjbiu5GGhYwN9mmSgH13wIa/emYOK/tAFdQD2wZ9emCimgD1jDMox+3tnR8A/TDAkiE61v6fLOBtdI5t4p/lkt6LvTqmpsLTuv/eiiKNnG6hu6a7lUXxnoOBn0t1L+bmNE2iWpPa1ZQ19z0cG9dtP2UFqmlBtSOtXVReLuwVSNPuhzrHSm8kEajGaNJUmD6Xc7lZl2/e+O66pe1G7rHOV9jrlbT+vZffxC13RzMLz3FNFUsl6CIhAFrMCwjxaFJ3adRGPn6GMsnXzuVxuN4b9gDejoDq6VlMBgMBoPBYC88BoPBYDAY/hbAXngMBoPBYDDseNxyD0/siburgwPfwD6HAjjmyUnxsCxYVgK/V0eRyB6KigZTkC6WxTGTYaWj6EsvykX5zdNvpHHe5ztclm+fRNHT9XXxlJSvH4M8npJCOl3mKR1MxCWT3i9i/1ACznURe4/On7+YxiG49/pdMv9skJuFQ/IW9vBcuzKfxtNFyLhDyUMT7J/weroeb1PjgucH1evyuKHDISwAVsUnF7DPZ2aXxlShLP7fOeccChTG4PcD8Ncjibjy8UlxxWN5FIwdR0FXT8cUsdehAwn8tXnx4FubOs9KSxd3eV77n3Y/qDG1XYiwl4Zuwdgu5eZQhPHJJ55I4+UV7FmCxcL+PdrjtLSivm1gP8fasvbz7IOtxCtwNT916r00fv67ckHeByfnj37o6cz1HH/4oTSuTsm6Iuewbwf7LUIUSfUCtbU6qr1BQ8OK35vXXHvrbTluZ/bdRYrHnfZgffThY2k8PS7rge3E0VnspfG4h02LQTGPvRs5rJFwSw52yUKglNNYbk1I3s86msHQqP5B13jc83Hs2+hhvJRXtT6Mjut455xLEu176q2o79dbum+Vsvbw5ItqR6EC5/CK1toC7nkP+/QqY3h2OO4F1D1cvKYxzz2Yvbuyh0fzcW1V+4g219RfVy+pAHOxpP0zu2HjMDKmPilVtEZtbKKYLYq/VmB/4UE+vo7Cwevrin0832KWEoBFgnPOJfw/SPoTOi173Iek+9dF/1anNf+5J6cI24Jz786n8Ze++EdpfPyYnKAPHZeDembfzm3sr7MMj8FgMBgMhh0Pe+ExGAwGg8Gw43FLSquB16F1uEReXZOsNS4oLVmoKDV1bVlUhw/p4+iQHB03IdObnBTd9PhTT6ZxDtRQbUvHv/zSS2ncQtpwDJL5sJCVpU9MiB4ZGlKKcB4O0U1QbjPTSq0nSM1Fkboth7QeJaRtZNo2axtpfB6Ot3W4uVbH1C/R8t3htHodFK9riIop455026Cl0EcTcyrwtrku2XHzOlxRNzfSOIYTahzpPB2QlB4Lj0KKnoPDaHNJ528wF++cS0B3sNArnXrHIF91NRUorEW4ThSNDKqiQbwJpWDfWpCs9RwKlY4GGmMFFMTsNpXSX6ltvzsvM7l01016uvYC5K4feuZDafz8S6KZliA5f/TEw2k8M1VN48tXlH6vwpl4dlb9wyK6tQ2Njzbo70tn5XzcbWcpkOKk5lrjTclRDxwWnTQ5pcKuXgwaFvdmFYV9V1Gg8OVXRbldWdLaNDZaTWMfeuLGwrzaMCn6qHpgxt0NDBcwtsGyeLi3rZ7G11ZRNNb8BujwTa2RWx3dh7ADigl0UIiCz5RoDxf1W1NTuufXN7XW1kOsIWOiZZxzbhg0TX6P7mFQ0PUU4Aa8uaKiz7U1PWuG4Ppbr8tmYH1D42p8Rvekvqlxtbmgse13UbjWIxWz/TYDLBKaQzHmYcydxSsag/U6qa7LaRxhIBx7SHPz4hXYX9S1FpWLoALzsBpBQU4PY2t6Qv22gmeof3OxY64veJYnoO4cqDWuBZS0txu6f99+7RW0SefchE3E+rqO96C5P3rffTp/1l7avR8sw2MwGAwGg2HHw154DAaDwWAw7HjcktJaRvGupCjaYxqps2ZO6dSRYR3DdDoTZDmkxFZXlXKt1ZSKfPRJKUqKcJtcgMLpElQwCdLmQUHp55ndUp0459xYtZrGm0j9NkHvUL2VRzqSxUC5y7/dVfq1AzqsiyKZVGmt4vwdKNkaUAGVWlnqZruwa5/UQufmv5bGB/cp1Zr3dW9bTjTjd597W/HXpWrLt9WPD+9VSnFPTn3a60DtB5lWAJqUdfKYmWR6+L930vT6/heznH6k+xbDqTtEOrbgqR2VQPFX/1zX/FfvoJgknGDLHaWCH5nUD0dQ2ly5qmO2CzEURa7HfoBbLiiAlSWlwVfgCH3mrBRVdGz++EdEgR0/LgUVVToR0sw59GcO1x73NA58KD1ra5rLzjl3+ZIKDLcuvKrvbEhdtL5Pyq6N9Y00Xt4UdXXyjdfS+OI7Z9K4i4KUFRRepYP4PXvk4FoDvXPydZ3zybGsumy7sFGHGztoyVYLdOiQaKbcuBRYZ06psO/CvKghR7ViWWO/i3sYYOJNorDzvkOizI7Marw3r6uvQ1Af3VZW2bN2Q+tckNdYrYFmpKN6J9TYKOCJ4WNc9dAvPpRA61dEXdW2NOZDFP8tBKLVA9DQQbD9lFaIfp/dpWdQB+v6wgWNaw9zuYvvDkOZNT6m+13b0jHdIlzWQ51na0vbTnqgj6li/JMvqdrAwoKUp5/76R/LXE+Q1zObyuoWnnFLS/q982elgmQlhqGy+n2WY+2AKM+XXtM68MQTP5DGGxuapx38LmnoxJyWDQaDwWAwGOyFx2AwGAwGw98C3JLSSlDcswi1y37QRu1pGbvt2yPTpHuPiT5Zg/ER1TTrUGYViqLAOh2lrEJQGotQV9yAuqAMw6UcTatQkNS5LD3SAkVVKpddP9DosAITOqrOath5TlpuAwUmb6yIQnjtjZNqKwoADqPgmpLv24vpvbon856KPZ757rfT+Fxe78CtvO7PN99SatLR9Kyjdl9cFEX57D06Jg+qr5no6mKoEGKqrJimxOdUAjiX3bmfYcRYRA/HhFBjhbi3E6MaJz0wCC+8K6q0sueojkcRvGtnpCia31Bat4jajuNxVi24HeigCK3fQfFImLN1uur3AIZsy1elBHn3jdfT+Pw7KrT62msn0/hHPv3pND7xiNQi46BVSigSGIMy4dwaGtaYOAfTTeecW/6P/z6N/8VPSqX55GGl9buzosyvjelcT0zp3tRu6Nreel5j1oM5Y/2G1qMY46OEorgdpO5feU4Kr9mZqrsb+O7pK2lMI9AOaJzp/eqLPWOgKYoay8tNXRsVXpXhahrnoMSsVrXGP3RcpoWTMOncrIm2rlRBJa2ofy+8IuWfc87Nvyuq9NBDuj9eDmsyzOpyULhSndSGeWC3q34ZqsCEchMFrK8rLk2rsHEu0HhxUPjFve2ntG6AtvvKn/xFGn/so59M4yeeFl2zCdXzlasaB7t2SwVZhlq5gqLAeayJTcz3BOaBPhajl184mcZ//MX/nMZRqOOfOPFA5npKJf32a6+I3q3XtJYPVUQfHj4kNeXeCY2vG8uizVrruubrKCLrYQ7eDzPSt99QUXAW1/WM0jIYDAaDwWDIwl54DAaDwWAw7HjcktIqwpQrn1caaQ7p69VN0Rjn3pC6Yvec0lqzU6K9EjgfTcPYj6nvkTH9rg+V1lkoFmo1pWWL2GlfRD2NSaiynHNuYVE0WBc72qtIzedAra3hNxavL6Tx+oLS5msXz+NzHdNaU1rzAqi4NxY30vievdrBPzOs/k1y75+a+15Q21AKcnoEBo0bMFVESvH1M0qvDk2LDtt//2NpTCXb6W9p1/95GE8+vUe/NQyqgPWgSB9mKKlMMbWbh6u+PyidGeEYKrNCGGKVkCI+t6gxFlcPpPH04XvTeGJSqeYAapHrr/9ZGt87JiXQ6gpMDrcJGbPBhNSg4kKg6z16+EAa//hnfjiNJ0dFk7xzXsqRN05L+XP+ghSRTz2me//sxz+uBkHV5KENR1ADZ3hUlNSrL8l4zDnntqCa/PZLogmbUP/se0L3oJlTnaHa4o2+xweBxnKIz3NU+2Atq8G0LoGSpwiKKWpLTbSdOL+oMZIp74Qx210TTd6Aqo11/h5+XDTAqK81rjKi++xiGGeOqx/Lo+qLSkXXudlT2y5f0li4ivpk1Zum5tH9WtsXQTMFMN/rso5ZDzQT6NcEitgExHVS1fPi0x/WmHzjlBRC52CKWixR7Yl1x+l3twuzs1K4HT2qdfO3f+v/SOM901of7j8qKvHQEZnqTYzrGM6dh+5XH8YRKC2YvV6aV1/NX51P4+e+LXq2h9KEOV+01zxqBTrn3P579Jyag8mjP65xdOGinhVhqP5tbGnsNFsaU3tB1y2jxlg31nXmSqIhJ6Dq4vYXGgWXbtrC0g+W4TEYDAaDwbDjYS88BoPBYDAYdjxuSWn1YKrnaACHNGMZqeKz39SO9NNvK7U4tluGXjOzSomNo7bV8AhNC5Wa4o7s06dPpzEprVJZx1Rg4HfmbRmPOedcdVK/N4IU4eWrqhX067/+r9P4xmXUO0G6MEAusOqrX4pIxQ4HfJdUCq5a0e+2cA3NvFKT0xNSAW0nPOzcZ1qwDQ+7taaOWUftrfEZ0ZJDoACnUWdn+YJUEQsnpfjpSbznAqaQY9S3wfiiboJMFRV+//X/9H0faX0PZ+iB7uG5OPAjDPO1ug7K7Va6fwy1paYQx21d3Nsv6XfX4MN26rtKI28XIvQXRCcZOtBDnbcc+uSRB1UX7Z7de9L41BnN2edePZnGZ85oHn3jG19P47feFu2VodIKmo+7dmncHLpXlNT5c6LPnHPuyiXRD69eU+edXp9P4+q7X07jkXEZqNVbUkqSZunFpDzVPh/jKI96exEMQlt1qDgxcJpcB7cRnQiULv8OhYnjyg31WbMj5eeufaIcHnpG9M7Bsu55AZRFiG0F5ZGNNJ7bpWOGQLG//qYWiN+7Mp/GjTV992MnNKacc24E3/+Pf6QxswkFUxSRitV3fR/Gq/RgharVh0Hfrl1aL2+gxtapSxq3QQ/zGkajQ8Fd2D6AU+6/R1s7PvEJqbTCmtR0Lah7/+j3fj+NWeduBKrEHCh4lyjeWNXx+UD3bPf+A2l8YxlK2o9/Ko0vnpPJ6qVLWUrrqWekmvzWV7+axsN49gVFta+D8Ts+p2d/dVa01BBqrb10UnUxKzNS9MVQ7nGrSb0JHXNBxxRxzCBYhsdgMBgMBsOOh73wGAwGg8Fg2PG4NaWFuAt6q76llFINJoHrUDmcuwI6KJG5GakU7qoOoMaKkN5lLRXu5Kfh31BJNFkV1EsrzO7AHxsT/fLiq1KJvPOeUvlltglGdX5J7csNVdO4V5D6IQ9qLYYR00hFioIHkfqbGBK9NY7crV+Dyd82Ismj73dLDfDaK+qLty9ot/2yU3/tGREduHtKdMLcrI45U9b1XGnoHl6HGiAI1Rdx3N80ivRIF/ewHWbTz6Qgcjm+u0O5gLHE40swj3SoH3a1IZVW3kPavKpxdXiv0tQNKISW16UYWEe6/0pt+9PmbRgPFmFs6JENwfEeKI0eapiNjej+/cBjJ9J4ckLjeu+MKMxT70gdNH9Vqe9aQ3OftFqAv6kmRqppPD6q33XOuau4z35RVOLsAalcclBdNVrq60ZDNMYIDEJH94tiXboiOihCbbdhqENboEl69Y007qKGVRfmiduJkDwIQ8yRHCjca+9ozYqhlP1PJ6WUHQl0neUy6nDB2O+hB3UfEqzlCeZTx9e8vgGFaiWvc+6a1ZrgXFaNS2PYzTpqFWLNpxo38LV2+lCNsuBeEZ1EE87Eg7qurHFEPhvetG60fMtH4PeEHOj1114QXfOl//Qnabx7Uv11DCqthx+8P40fOqEaU6sbojAXUQtvYUEGfkGgfpid0fmvXNbxPsbBsadVszIYUj+ffUfPa+eca25qfh2A2pPbGcrYkhKijubouI6ZnT2cxlWsO8+/KOpxdVFryvqi1twnn3lU1xCQqh5QhHEALMNjMBgMBoNhx8NeeAwGg8FgMOx43DKf54GiCFkDC6qjy06p7BoUPi2nFHqE9CNT8S0YCTINHof9KYAc8vUJFChL6xtp/PZZGQFOTImGcc65ay+LullYlEkgFWIjqB82gzphk7NQKVWU7q8UlRL3YYDoo30sYd9tQ/2RU+o2H4pmyBfuzntoO6e2lvaoXsramHbG/+Hzqqs1NisFz8ENtXsG5mF5qB8uXha98/p5pa43oUhIehoXHZj/xTTPo/MauiKG+sc5l7EM66HOTg/Up4f0aobiwTHdSNNgC0PvkF9N48WDSh1XkeJ//XnVELp8WWPKgwdWMCYVzXZhfV39O1XROC+i7g08HjPzy4GqbYPeKkB18egxpZ/nZmSkNjOnMfHqm0pFv/meVHmsc5epKYfPXZSlm8tO7Vi/rDpMrRuiWKszMisb331AbRrSNbcjDZgVmJ6F+D12RQF0i+90nqGc+rQ8oziGunM7EaFVXkZqh9p2dV1PbVXrbq+pzxNsPQigcgmKGuMI3Q2YGTrM5RJUNJvNecUrohJzVfUF57JzzpVA/eVLOs7LaaOEn1PfFzBPywXQWzD2DOui7lqrG7qGZRgyttV3lRIMTwu6tmGWtou233iQePoZ0Ubn3tK4/uLv/kEaf+0rX0njg/dqrfjCL/zdNC6Bh6vgeXXfYdF2AUw0Wfvx1Otn+353GuZ/m1B4vfVGti5ao6XxdRD0W3lYi9w01JijqMPGrSqkn8pltW/fASldX/tD1Xgsj+k5+7nPS1FGs8w8aO7stob+sAyPwWAwGAyGHQ974TEYDAaDwbDjcUtKK0aasonU6hrqJ7UCqG6QHi5B4eLHSmNmqAvQZCSxKKDJZOI9pn1xEJQMC4uiHla3lPZ1zrkAhk1jVaWpx8arilHHi7VMplFDpIoaXSMVpU0DGGPxiuKe0sxLi1Kv9Xrqi9ERGEuV3n+3+fcCKhuiRL/x2Ef+Thp/gmaLdanx1hZUQ+ev/lIGk92uqK4L52VeNbZP1Edlj/qOdJNDnMNNZ2qS9XO6N6nuOGaKBY1D1n2LoUghtVjEMfkC0u8wumRa/9JFXdvyovpiC+qkH/7RT6fxwXuV+t2zX/F2odkUHdzNo95QgvpEUMoEUOhR2BBCvRVD0RY3NPcnURfsQ4+KCp2CGdpEVaqQ02fUV4urojOrq1KLtNqiRpxzLkRNIA/rQr2lOjt11IJbhAoUzI2LMKZIY/GgHKjRTaixdu1Rav3wCalCWnB2jKO78zdi3KMmFvQb2u1jjgyDEug0RRVWq6iRF2tOtD19HoEmugoFYRDA/DPTHFELRYyp1oaUsvPnzjuiCEXe6pLGgI96eHmozmjumIMTqJeoL/I+tkbgPp987c00roeiWcrglTNrH9bd5DaUPXeKONHcqYyoDffdL3Xnj//Uj6XxFsb16prmyLnzGuMvvPBcGi9c1+cheOuxMdFVP/1TP5nGjZq2mlSHoI7sqp2cc7GfpSdHJnXePfsPpXGhDAUd6DQf4yufh2oOCm1uC/nsT382ja8taz195EkZHh57UIo1D/MjoIrPVFoGg8FgMBgM9sJjMBgMBoPhbwFuSWl1oXwJker3AqWpSiWkRLH7PSoq1dZDii+E+VvGYAspzYxKAfCZloYKjOaE5SGlyoYnqpnvl2EyFuP3pqZVi2V2VoqUsVHtBh9GCo6IQ6gOQGkVi0pl+qBGaJLWaMCRD7Rfu4XPtxEJlGAR2s16R7/0y7+Uxj0YkS2jrsvSkmjDSqKU4s/93M+k8QwowOlp1VCJB9QiIqXF+99A3ZTFxWyNlw7aNwLlWAGGaKvrqt0TgCqbheJnakr3nHXcQlBoKytSiMQ0MCx/Qm0Y03gpFqko2/60eQCFC6nhTlf3lXWiPFBGvAUeqE3WngK75Vqgz4oYy/cfV20sXvvspObK86+q/t2ZU1KL3FjSfXHOudCDsSf+DMtBvUN6M1PnD2BP50C9k9LyME8TjLVaXTTbpWsa77k8zBNnsoaJ2wXOR66FGUNOqFdJw/ZauidboC9irIs9mDkGoM+8WP2YIO6hPTFoEz/U2lQoqB9PvZGtWxhhy8HWmvqygIdEktcxXairuqBfczg+h3uYHxLNurap8elD4RoUdM6IddUGPF+2C1zjokj99cxHRJO++rIMCb/xV1LGHjsmxWw30j342LNaZ8Ku7rGHe8ytAKSSrl6S0vHgMbVhFM+0JrZ/FEqUsTm3a7+UY+WqxhpregWBPi9ibJZLeuaWYcBbKtK0UlTy//bb/yaNPYwDLweTWby2eHe4tlqGx2AwGAwGw46HvfAYDAaDwWDY8bg1pUUVFVJnNDcbpjEUayMhbYhsepa6Qto8o8BCao4xa2lFbcUFpL6ouCoMZevejIKiCqFAo+qK8RDScTQ97IE28KBGi1BDpR32pxZIdaytSL2wtQ4lQ1PKlO1Eljbs/65Lw6ocTBgnp0T7HT+O+ka4P75P2gRKiEy9EyGruuv/3TzSps0mTNKcc+sbNK4E/Rrr816PNZeUCh4a1r0dizQucBoXIZU/Pt6frgqQOo4w/lkPzvP6X/8HQQmqtARqlwDqsxyUEw50SNTtr47rQrWR0EQTdNMWaNgi6INDezU+RpG6Lniam3/5HaXxF6NsnwTsU9AhHsZOiHHh3QYFnqDfqXZKcD0h2lEHpRX2RGEGRbXnnq6o0O0EqZsIa1MScq3R8T7qRJVBD0QhUv+cdx4N4CDBosdngmPQdzFoT+eJSqIpYDfJrieYCu7AIakUIfJyic/f679FwR9UHM7xWYNzZuYa7j+NHf27/Hc+TXQ93Y9OpPH12Z+FovPI/jSmSnirJjr/7Huig2kSGEGJSJO/bkf3ePGGVHx7D2ptbNY20vgaaqRN7tJ2BOecG8HaNzymuc05W4a5ZBlrUwGKyAIpdtxXjusczD/5DsHhRRo+M9BuA5bhMRgMBoPBsONhLzwGg8FgMBh2PG5tPIi4SzoJ6oehIdEexZLokABqjh7NBm+D0vJBEzDfVatpJ3kb6b48d+/T3Ggoq6zKUCVI/+WQg/TZJqbQkTkrgWbJmORBvUM1FlVqVIuUcJ0+2tOOt58CcW5w6j9zDOJBtBTjXo/Ugr5LRd1AymGQGgW/u7Ulc7NrC1cz319aUu2qadQ9GxtVLZdWW/dhHbRhqSwagKnW+pYom3Pn5tOYirB775U66eAh1ZwahtlaDoZ+nn9nadfbQY7pYfxWQh8u3gOk93OZ8QtlIY7xEeehpkmQcm7DPJAKr124F89+DOqtXVorXjwtZYZzzr13Xin1tVUpuJpQLLZQh69HE0qOI14D+t3PUFowucS8I9URYc56Ec95d+Ym//bMlNLK6x+Bo5JRx8eo28c1NUcZbIYFwG+R9qL5HI1TedKEvwWFrssiq4RCzTz+je1xXKFNMHpMEnJgbGr/dYdzzXNcv6Ccit+fDv0g4FgrQhns5fS7e4qaR1OzWq9oKNppSzX3wIn70jjqaS2ikjTAXN5Y17Py/Hmtm/OXL6bxc9/9VhoPj2s9/Mf/5Jcz1zM6BeNJ1PQKUEcyCPR91vS6neeA5wbNKTx/Y95XxncGy/AYDAaDwWDY8bAXHoPBYDAYDDset6S0QlJRUA50aHyE8uz7YdpXGVX6moqlHs4TRzo/jfqoWAhxjI9U2WpH6T5eRIR0KI0GnXOu22ONFn3OOiIB3gFzSMHlkTYmvVHfavf9nEoLvlZWoBzLM5WHFGevmDV+2i70YDgWZ+g65oS9fqG7neQhaanM9fMs3Hk/gMZiva0uDObCm2pp8bjlJdWg2dwQjVXb2kjjPGudoeuX8N1335Ea4jvfeb5v+7a2pKLLBbq5++85kMblSlYhuN2oh7jGLlL3ecUFUF1B0v9vG1JADgof0sQ+6yphGLSRco8Tjdm4rv4ZknjDzR1Sva0Hc1L6OedccVQHLiypVtDSsu7N+uZGGnNccBxwTLF2WrYmX25AjDpPnIIZnrv/uP6goGgtoyLyuLr1VzU6UuY0Z8TCE2c4rQHbCkBXJRkVJ+g9NpoU4M3rQ8K6gmwrKCqs1VyDQzdgbcoAx+A6fYxz0mQkTVjP0b8LlBbpxgIUSwFMNMsw/evheVoZUdxu6dnSaok+7nYUt9swmsR1zewVrfzRZz+Sxv/vv/uDNF7ZFMX/L//Vr6TxvUdE2TvnXAxpHYWfLkdTUPwH73Gm570BMT4lVZlR2fUfT8kd3j7L8BgMBoPBYNjxsBceg8FgMBgMOx63pLQipg2RmfKRsYpAOdVR94jfzagIoPAqwLhoBClt1kIi7dVqKJW3hfRgHilE0nBU+DjnnI9d7JksNVJkpE2aTaRccV5SV6SJ+F2mpYtIx3VXlUZchyEUmuaCwt2htIhBpn9u0E76galfnuf9DQbvtD00i5yd2ZX5TpJRs0E5WBGdypoyTYzP69dVD2xzQ+PkrbfeTuPlZd2fAsbbhQvndP6CfnfphqiYsTHVXBqGgaNzn3bbgcUNte3aFanVYlBa/Gsm72g8Bwosc1Ya9fFz3huqEpP+caJ54CMdHqAm1c2lsHy0e2pO5naVCVGDc6SMQb/FmRR6v1a7jJIrkx4HBcJLzkFRA/9Jt3ffbnc3EA8wAuWUijNmgKSD+yuWssZ7OGdGvQV6gMfTIZAUAimjjLHhzfeg/29nBhyvLfPdQdQH1Xgw+eQ50Y1+ZqzyOmFyeqecyJ0CHJCHOeh7MNrkelXQxKhU9GzhdgzSW9xeQmq3iHXv53/x59P4wAHV6pqelYnmxz75tNqTzz5/SHXGePjHCa8Nc2rg8yTpG2bFhKRbGYOezUyV/nN/ECzDYzAYDAaDYcfDXngMBoPBYDDseNyS0urFTBfBtI9mQjAxq9WlHGm2ZRgWlEA/QY3VAEXFtNZkFfU0QGklSGMnaFsIlUKEtrVgWuZcttaIw/epKCLtQb84UlrxgO9mVESkaKAoa8Esr7UleosZ7XyZFMj2gWaLg1Ra3oBssjdIITIodX0bIBPh+/3PyVoxpE+dc66CekITE6r/Mgp6lHTSe2fPpPGFCxfS+Py5S2m8tCjTuyTp3xlUdfWQar508bx+F2q8ySmpk9wv/VO3HXjgxANpPLNH6sjsjGZKeJDpl0DKJFOfaMA3+F2fSiGkn6mgyZjW3Ww25vU97CYVxgD6ZdCJBhiaZfuivzmjBzUWa6RVx2USt53IiK4G1J7LUkv96+Jl2YTboIYGmH8ObEJGQcXPb8+QMXOdbtB4uB36nNQangVYg2n+mVlfBihFtw0Zc8ZBSsH+RnoFGPhR+RjkRIEV81pbWBNykEKxMK3z/P1fPMJGIL6F+jBjYNrfpDdLLZG6GtC/Az/ub5aZDBxfVkvLYDAYDAaDIQN74TEYDAaDwbDj4d2VlJ7BYDAYDAbD/49gGR6DwWAwGAw7HvbCYzAYDAaDYcfDXngMBoPBYDDseNgLj8FgMBgMhh0Pe+ExGAwGg8Gw42EvPAaDwWAwGHY8/gsQtTAlRNMCVwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 2\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 3\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 4\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 5\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 6\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAABuCAYAAAAj1slPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy86wFpkAAAACXBIWXMAAAsTAAALEwEAmpwYAABLmElEQVR4nO29aaxl13klts85d57vffM81PxeVbGKNXAexUmiTKvdVtsyutsNp+0/jcAInEaCJECQIAkQBAjQCDpOB+44VrvTaTlOLIu2JIuiSJUpsiayWCzW9OZ5vO/deTz3nPxQsNc6dL0iZd4Snadv/frq1rln2NM9b629vs9wXVcJBAKBQCAQ7GeYX/QNCAQCgUAgEDxoyAuPQCAQCASCfQ954REIBAKBQLDvIS88AoFAIBAI9j3khUcgEAgEAsG+h7zwCAQCgUAg2Pfw3e8//4t/9lvas+4PGPrzq1fv6Li7O6Vj29jQca5Y1HG1COv7+Ei/jgeHEjouFOZ0HA44Oq5VwzpeWsLnp898CecZPqBjw/LjHvJ1z/OMjU/o+PCBgzpem7+l483FaR27rqXjTFdGxxs7eM5CBdcYHj2i43imV8dmPYdnuPZDHTdKmzruG8czzG/hnP/kP/kv0fCfE3/8P/667oje3qj+vFnA/fmcgI6vfUxt4ce78WPnTup4+sY1HSfC+G5P75iOt6j/G41dHR8+iLHQN9qn43/5zTd1fOcu2vrYCO5ZKaUeOd6t48EMrv0Hf3JVxzsl3PfpCRz/9/7xSzrO1zGu/v03f6TjSg1jyY+hoMZ6kzp+4vwpHf/k4iUdb5dqOj579rSOX/0n/3Nb+vPlRzt1o5o+3JzlifHsraat40q5qmO/30/H47shH9pTOfhuPBnUcTqD/jCNFmIX7dmw8bjzK+j7ja2y53li4SD9C98pVXAu18T9RWJYF0rFAu4vHtcxP9vqyqqOD4106ZgXwN0i5l3TxT04Bu5BtRBfeH+nbXNzozqt+7PVQlsa6m9/Cf6m8Zmyj+AbrqIBr+j56USu26LjvTBNk477LNf+4tEXO9yW/vzNf47fzQT9bhoG2tRwaL7Q/FIG9YGDhjOoPRXNA5danpvZaeFf3JMMi87Jp285juc4Tl3jTWODmPubx5FBz+Pweek8dIjnGQzj3nyMQ9dqEmezU8S69u/+xb+5Z18KwyMQCAQCgWDf474MT6G4o2PLR2yJkdVhvryt474B/MU30D+k41gkpeNmHecpFsBw9HSDQUl3DOj40sUpHYcjMR2vry7QeXA/xw6d0HHQ9r7kbcyBsRjt6dSx3cRf4w2Ft+3eQTxDNJrWcR6Hq3xpTccLc7dxrxv4fLATzxaL4zw1et2sNvEeHoyA+WonfvDmZdwH/aX+y7/0tI5TQQyJU1YD9xTC55aFv07KJtiO2Ttg6V5IgCGwa+i3SBh/dTfrYAF3NvD5c0+e17HTuKJjGiI/vdcE/srf2c7hGn58PnoSYykWaur46ntgKZ/8yqM6fvwJsHS72xEdt2iMlLJgC1ZW0c8dHbjB7j7058bKomo3Egn0h2Eibtn4K6pea9A3cEwogPaxLHzOf73Va5gHtVpFx9EExk29gbkcoL9k+S9Ey4/zj4/06DgeLnmep1BA++7m8Jfa7i6uXac/hDvoT8HuDozBWg3nCfhxr6kU1ia7ifsOR/F5GM2iWnW0nWXRX9SW96/fdqFlY055GB7jczA81EZ7ncX7Fzv9Nc5/axv3Znia1P+f/Gs8EMD8/0VLbtsZwloWoUG7vQ2G0yLGvEUMj4ftoGZzqQ9c6gPTpXWZ+s8ixtWivnRcXNem2CXWxCH26f/7X9wff0z/aKl7Mzle5odPyewVfbfFY42ZIrpXB3E8hd+WELG+e0EYHoFAIBAIBPse8sIjEAgEAoFg3+O+klapCuo+HAFNd+7RwzoeGMRG0FAA1G+zDvlgbhbnef8KNgh3d2Hz4JlTz+jYDKd0bDs53CzR40uLkBJKtOm2J96BOAM5Qyml7k5/jOfxgTrzBUGdLa2t6DjShY2028Ut3FMd74mxKOj0rS1IZhEf7nVnA/R4KQcZZ2h4BPcQgXzSKHk3dLYLjhPS8fe/f1PHS4t5Hf/Df/RlHU8cRD+nAniGwi6Of+z0MR3/2SIkyjcv4/znTozjJlqQ67I5klMUNp7290FuHOiB5NAVxxhUSqlUEv9XqIIWZjm16YB2L5VBo85cXNbx4GGSZfuGdeyjjaunT2HDeymH5yxX0Fd2C2PecCHZ/OCNt1W7UW/gWXwW4loVz1utsiwFmYhlEpM2QDq02dhHG34bTXy+nSOKPodr1es4v8+H8w/2QeaL0L7knoyXfs7E8e9ElCQ3mkfbechbfnpmUgeU6+Pdl+iPzjTGndOgPrN54y1R6PS3YKOBsW/+je257YFh3Huj5+c7KULeAMuf+6h9eZO3Y6OfTZI9mzZt7G4htgLe/nzQIpZHJjM4bNs+8r81DBvj7nvfhgHjw7vYhsHj1P0sKimPcb4WyzsR9NPYKMZ7KIDPy1VcbGYB6x6vJ5/sPG9b76G57Qnuj72O//RjTJ4fJPkO9uL3/stff/FT70YYHoFAIBAIBPse8sIjEAgEAoFg3+O+ktaBQ5CrLAtyCO+8tpvYjb+xDamj1YB0E/Ax3Rmkz5GrJhSANLKdx3mUAclocXFJx4kIO8JAaxm089xQ3jw8GXIOVUmiSkcgoQRCOKZQwjNUiqAC7Soota4M8n4EyRXioxwVjTriQycf1rGfJMC7dyAB2c6DcYJ0ZHB/J44jB87mCuSXP/rD13X8D37jOR1PjEF+HOxEPB7BuNh+6qiO/9U30VdRP/rzmS9BxiuRGWCwFzLUJrn3/AoyhmljR75SSjkNUMeKZBTbwhi4eAUuv/HRQzoORjFmLr0Hd1lnBp/vbqNd6iSDPHwaTsBQCmOHc8Nsr0C6HRlFzqd2YXUDbqSuTswRwyQ5yI9jEpF7u7GYQm400Z61Jj6v2GjP4iraIRRCf+RyfEpIQIaBOdidQYdHA94xzrlIMkk8QziC/kgXMNbqTVzDIWnFoHlnUd4TPzmtSg1cy23hPNU6udSaOI9NmoPfuu+S+Tmwh6TwMyo0e6kPftoOYNO8WSIH4Z3bcJkmY/iyj565qxu/CZ1dnXSMN0eW87mcWZSLxvM8+DxAaydLQrZNzsS9LEUPGHYL12qQLE6rlfduOD3NXif1/Ifvnp93d2E+njwBR2Qijr7Z2kH7NOgmFpbgIKuW+E4/ee2ftV8/y/GffoxDTi6WnskwrVrOp59HGB6BQCAQCAT7HvLCIxAIBAKBYN/jvvzsKEkA1z8ERT+/AJmgUYMEVC+DCuvpBo02Og4Z48gkSg4MDcIFVCLJgBM0xWOQjGzanZ0rQG46dAhSSo2SJi2sznofyAbl1XJBg4fieIYgORVMul4yhmM2i0h0WK2AHk8nIPWEqWV3c0jg2DMEF1CpBKnHddF28TAcW+3EmVOQYjoyoD9Tj6ONHXJhLM3CVTC3MK/jxx6G/HjmCPrzkUdQQmExi+d5/c/f1XFmAFLXmYeR5G9tBSUkXJJikjFyZjW8lGWdynoUKhgzK9twfG2TFDlsQSpJdWB8NlqI5xbQV4U8nIDrm3Aabu/gmAMTx3U8OoZx/vHHSGx4+w7asV3YooR8XAYhQxKrQ3/PRCmrXotkHE66GfBhvPv9GO+c+b5G5yxW8N0KSUCcuGxpPadj04VzpB7yLj3hMCQKn0O0O60L0SD6P0DJL1suxkiFko3WqzhPhCxiLFu7JIFbLXpQSjzIbRcMeZ2C7cKeSQI9Q/7esownEZ3F7h88z0fXUPZk4c41HW9nMe+KdfQnJ9pslEg+cpE49T/8vX+GO/tE4kHOVej9B933HrHiPrFYikOfzC/iNygYwD319MMVaPPAVdxvD9ZDZlE32XspaXvIRMYeSf48beVJPIi2DYXRboU8XJOceNAlx2UPJeMs7+L4taJ3Kwh1h/oM3arcPW78MzUFn99zEJfQ4ASZdPxnsLsJwyMQCAQCgWDfQ154BAKBQCAQ7HvcV9J6+4fXdbywiERt8TS5HMgJ1Wjg/WlxCQ6XSBKU6IGjcAf5opAMWAPq7Se5JY3kfwfGIRnlc6D0mb776M5dHUcDXEtIKWLBlWVSVfUK5DGuch4o4Bl8xIiGgpBrwlQbqjONRIcBixJ3BdEuU9MkB9ZB13NdqHTC60ZqFw4fe0jHfaOQAbs7cb1WFXLN+va6jmsGnmdjF+317jVIVJEQXDSugmxgJkCdXrwBd9zyNijIRBg05dlTaMf+LrhCFme8NanKDUh/OxWq8UNujp4hjLdkAnJPOolntkIpHV+Zg2PLqcMtZjqQRDbIvZUn1jyRgWvl4PEzOv6rtzCP2oUMVSovFikhXwDjMUXujGIBY40MOyoSwrijMncemtkyqbKzQhyP4fxcmd2iRGdOA221sgEJ1+d6/9YyaXL29cN1FqSsgiZR+YaB52TXGVeJ5pJAXGPM8mM9apBjK+SpF4ex7KkNpB6Mg3LPyub0Hw7VR3LIjRak5IG7NGe/9903dDx79wMdHz2AkyaSWMvW5zCOYhHIsypEg9ylPvdDomx9oj/dPduJ+sEIUow+sXxogPUNJIL96PpFHKOwtm/SFojnX/hlHWdoPW627u3eehDeLR/1055w7u06UjS/PGOCYq5SH4qg3Yo1zLU70+iziWNwbMViWPdO9GBtHBnGMVevQI5XSqnZlZyOGy1ye5Krk/vb8zw0mN095dl7i1qeabCHs5SHmfU3aoD9TQjDIxAIBAKBYN9DXngEAoFAIBDse9xX0nr/2g0dr6xD6jhyBNLAYC/emfq6kSQsV8Dn3X2gzW0bMsHaKhJduTYks2qRnBbERIYiKR0nklQzqwNS15EDqHlkWd7d5i2qm1Oj/9raATVXLOGClTwcDNEOUIfKB7kmYUJW6aJEXFtZOMRmFkERJpNwFJgO1TGqg+53mpxOqX24/OH7On725dfwHy301V2SjeZmZnR86DDcZZUC2uvWdUh0a5voW84BFSanRcOAVHB3HZ0w0A16e3md5FBKOFWqUEJKpZSj0JZLK3DOtVq8ox9yZ6sJKc6uod+2cxh771y4rOOXnoWr7dgEkgf+b9/8vo4XViEh7GZxDy+/9IKOO6gmW7uQSmIMxij5I9fPKhchY/kMjOtUAnOnTs4cnmssAbgK5wxS3TnTwHcdP9rcphRr8ST61SXJu1llB41SDiUGzFHiM4usIMEgSU4m1dKiqck1vYJB9LHNiQTJvcNyGNftMmncOS7d617WlHbCU67o3pkEA34829xdzMEPr7yH+OI1HXd2QH46eAjOykuXkPB05hba/bd+B0lHb95+S8cTk3DWBqMkI7teOcFQ6BSPg8vANaoFbGnYXId0xQlm//qvf6Lj9VWsx10dmFPpbvTP+5fhCH3uGchbFqaLR1r5XPkR94BFTrm966LtlV2SpS52JeLzZAzzvacH4+DAIfwu16v4bjCIvk+msGam0jh+ZBySVjrhnZt/8qeQ5LMFchD7MP/tJuadS68VXiHK9vzrZ8JeChjX2DI/nb8RhkcgEAgEAsG+h7zwCAQCgUAg2Pe4r6Q1PArHUsMFfZXphENicBjvTJ09oKyiKVCO0RBosK21nI43FnDO6z+BiyAcAGUXiiO2LaL4/KCywkQ/J6j2TiSKJFRKKZXqgOQ0cRIumuPhlI5n7oJmXVuAXLG6s63jj26Dcl2ZA/X/T7/xDR0fGsfzr62Q26kI6m+0H4kdw0m0UcuGW6Kd2FlHAryPLsPxsLYBGevkcbi3Hj79tI7vkPvtxkc4T6WKPjSDJPVRojeTaisFqOaVGYTU2ZFCXxkWqNZUD9eJ8j5P3I//c+ugxP2U+SpMieKaJtq1QknM1pYhoVXzlPSOZM9jJyFpJRIXdLy9hu/urs7r+Nvf+raO+ztBI7cLfqK4OVlmuYT7qdUhHwz2Q/blzGCFAiUosyiBH2m+3T2gxA+MY03IZSFz1ymhWaF2b0k26Ee/mkbA83+pDNrIdUhiLiKJZINcKDZZygIBOIcSKcwjl56zRckMHdJb6zVIMdUyxkeIXKP+AEukXufngwDLWFwDy0e6zJtv/FjHf/QHf6jj555Grb4nn8Bcbto5Hc/MwinZbKBvf/m153W8vQX5aHAAc3N4CNJHrQrJ1FVeScuTw7GGNitXIft+eBVr0HsXIMW1yAnE0t3UR1hHf7KJ7RB//xtP6vjmRx/peGYK6/RrX/uajocGR3Vst7zyTTvArj53L81sLyseJ1304TznTqPW4FFyVJXKmB8DgxgfC4uQ7zc3cJ7xA/jNWVyc13GtivXz1HHMU6WUGhrEb3BlCv2cSuLzMhVGzBfJTUivGLbHvbZH7bgHDGF4BAKBQCAQ7HvIC49AIBAIBIJ9j/tKWn5KBjZxDAngRsZBnXV1UUIzSsgXinDCIdDmpoVjmk0cU61iV3+rjvew5VXQ5uUG7ufQMVCxmUGcM5/H8RubOEYppdw5SCibWUhUB44iQVWJEqXVyIWS7MZ3nx9FAr8rfw0q8Mc/eUfHfR1f0/FDR0Ezb6yDll2YRXzoEBJ9BcPe+24XEmFK9NUElduVSun4w2tXdVyvQeJgeadFkkCzhb4d6YeTK2BRjRcfrtWZhvywlUXCMJ+JoTi/AjdWjejehM/reHAU+urQISTRKtyFW6xKdYA2s6B/6dJqeRH/OH2SEmP68Wzf+Q6cWQY5Uh59GBTxQxODOt7Ko8H6u70UcVvQ4rag9s1QzSybsmVSnZmdHTxvheqRhSI4PhbDGPzar7yq43QCz76+giSNzNw3iaPe2cnpmBMbRiJeublYpuSfcVw74IfUlaeadLtZOm+ZaoBRks8mJRWs1bBGOA6OaTUNOsamYyjBIklJ9fqD4d+5/Xw+jNklSvj63de/o+OdTUjvgwOQdh0LYzzdhbbb2cDcf/dd9JtBSf6qzR/iugs4/4njkFPe+RFcXfkyvnv64QOe5xnoxVy4dRsuMv5d2FjBPC1k8Tty6mE4bXv78GwsrTTJdReNQa4NUE22y1cgb/3n/+mHOn7tta/o+Nnnn8W1cKnPhc8kae3p0sLnmQ6sG48/it+HngDGcqmKRIKODxMsTLXw3l/AlgVfCMfv7mIdKBYxtyYn4U5VSqnDk2jfdIYSddqIt7KYUx/egmzZIE7l01MNfj7s7YgDhOERCAQCgUCw7yEvPAKBQCAQCPY97itpRUKgiKqkadRKVK+GJAqXnFP1KtFuJbgCajVQl4MjRKHHQbkalNyr2cT563Xcbpqo+3gCLoDODtzb7paXOLNt0HxNG7LJzBzkrSjdh+sD7d7Vg53x44fhfogEIPW98wMkatzJQa7qTOI5uzpB1+9m0UZZSloXiDyICi9KuTYkuqWFaR1nuiHjTE2D/gxQ4rZIBPSq4cd9d3SndHzgEGjtlUXQ5iFKjNci58zWFijVsXFQ4DGqbbW+jXYJ9VGGOaVUrBttOdKJ+7s8Bap86i6eh5038QTGRjqDz8cG0M9VB2N1dg730d0DqaB/CN+duYs27RuDvNfb236JsmFjzPsUxiwn2wtQLTmDJK16A+MgHEbfNJqY4z0jcDSOHYSkEbQgPdWqmNdZ6qdICHO248Cojtc3QJtnSVZTylujipPWsSIQjeI5/SbcmLs0l5stSB3FFs7pkCsmSPXvOFGhSTKsSTKWQ4k5g36sO+0EJzosk7zwxvdf1/G1q5DMX37hWR1HYuREdCBpvfcuJJ1mHW3a3Yu5Mn6gm46n2onTWBNfffGkjl1KitpDiVNTCa+zdOYOkq0uz0GWOzKBcXXuHGLHgWRz4cId+hz93N2LudZyyQXqYLwtL2OLwZEDSLC4tITPb175kY5rRawVR3/3MdUefIb1e099h5LRslsvQNI+JXyslWkLBiXN7Unjt2tsHO1WbeZ03N1PbetgjWra3nU2k8aY74xTIlAyLJ6cgCvZIVfujSncX9O+dxGzPWuG8U14arXdO/nn3vIhIAyPQCAQCASCfQ954REIBAKBQLDvcV9JK0CJjyol7MheXwR1VCmCTu0bBj3ePQByKhIBPWxRLRVFu9kTKaoTQ6xxkJIQNms4ptGo0PF4jGSCklYFvdRXgySxaAKyRIwoO5Pq6cxO433w2hXQsq4LSjidxtb+rl7QrDtFyBtBSrDHyRBTBuQHdh00KPFaOzH5ENxoPyG6O1hN6dhQiEMhtP2RY6M6vnMb0ofrom9z5KJZXYfcse6hL/GP3U3Q464PrhAriDGVjIOuzpW8w/XaDL4fTaCN8+Q8GhuHtHT4EGQzRQ5EfwDnzVPCtZXZIh2PPs90Y+z0DeP8c1Oo+9Och6T5xCOnVbthkZOHx45NUhepVUpRYriODozZKjmTDHIs9ffhGbNbqzoOmpD5ApTwMECTtl7GOUsFSCPhMMZKR8Zzc6pKfVYvk8wURv87JFdF6VxBcvIsLqP/mPo2TZIKKNlcMon7dh2sKSYR6mz+MM0H4S9RKr+Ldnr923+i42oJ685zTz+u42AAEkSxiLnz7rtX8Hke4/rpZ/DdmelbOCYH185zzzyi47PnMFfCCchkByfRpjNTGGvbm95EkoPDkDjiJOl39mLOplNYL/M53GsiAakrt4O+mp+HPO0PYB3doTlbKmHOjoxBnu6ghJS7W2jrmzcg47ULe0k0ex7P6yNJ/ru7mGubu2jrA114Fr+BuRkyyUFl5HQ8RG69jV2M30Qc50lSHzXLXrk55OL/WlwzLYg5NTqAcfT8o7geu0Bn1nHtMq1ZnIORGZiWR/ei//FIV+QGd0TSEggEAoFAIJAXHoFAIBAIBPsf95W0cuQcMohG8gVAhS0t5HSc3QWtmV4CXTl+ELR0Vzc+L+UhezhE5WW3QHeHAzhnKkG1cYhaN2hTeYtq9ARCXtq8ewB1gCJx0KaeVqAEeLU6dvD/6K+QkG/eU6PlBR1nOnC9zXXUnopEUzqOd4D6c212yNAzKO8u+XZh4iG4FrrIOVQsIbEUJ4e7MwW3RHYbNKc/gGcoUIK9Gx9+jC+z64RqFLUoYZ5JCeBW10Dd18lN5qfO9ZEz46f3gb7uJlnDMdCHXb2gVzNdkKU2s6CClQNZo1jFPRWLOD/nglxawXePHz2s43NPnNPxX/wFxkuJ6lK1C5aFdmE5iKUrvw/P4rigu+MJzN96EwOvtzOl42gE58/vQJ6LkkxczMMdFQpRskCL3TS4rkkJKJUJ2Uoppegw1ZHAPI1RgsLsDqSbap3GI91rkOIaJR4MkVTdJMepnz5PxjAOKhW6vxbkhM9gBPlbYX0Va0qZZMA0SbWWifF45y5qSa1vQ6KKxdC3g/2QpSpVrGUPnR7VMSfRNAIY130kOdZLmEPVOj7/3p+jFtbSIsaCUkr95j99TseZNL6/DPOm6j6P+2Mnb5AcSR+8j0SHloVrGwbXioKUHqbtDVvbOR3XGmiXaBzupImTcKC1C5wAb69keCzjONQHlp/co120FSKBtS9A87eHHHe+ak7HuwXEYwEcM0JyfMXBOltq4PgGy1ZKKYt+IB2Df4PxuWFgrg33oZ8enqAtHFRScHoJY3yd3MosY7medqTtKZ5J+LM5moXhEQgEAoFAsO8hLzwCgUAgEAj2Pe5fS8ukhHE2KMTRUdBUAxZ2wgcoYdzUbXCXd2+B7kzGsHuf8nyp9aWcju/cxvHxCOjn0RHcbqoT8U6e6uHUQdP5fF5qbvQgzjtCFKFDMoBLkkvvAGi6xx5BssH1FchppV04GIYH8WxLc+/reDsPSjzViQRbiQwkplQH0cYNyujURkSj6KtaBNcImnjvPTlBNakKcD/MzYPurlBdIptkA4MSvfmIlrZIrxgdwfN3d2Icra8hMdj6Buh3x+Y+9LruymX0w9QUKFKmXdfWQXfPUzJEw2QXDtVxo/pu0SioY4fGRbUGie7SVUhXA33U/yQB5iteur/dMKn/TKKZuX5Wq4XnajnoD4sm4eAQktB1UoLMTAax6VJC0TLmpkFyw9FjmCv9A0ha+PEtOGKufoAkekopdXB4XMcDPaM6zuXQdrYNar68gc+rDTxDJA65NehH/9l0TDjE0jPGh8lUucN0PdtIHkxS0O99/wc6rhYxvnwmnnl1ZV7Ha5twLKU99dMwFi5dQv0oMripJx5Hbb8ffA/98OIrx3S8uZnT8cws4le+Cgno/OOjOj58jDRJpdTQKNaa9VWSB130yb/6fSQA9Fm4b0thjM3OYlvF+MGDOu6n+mG2Sw4/0uRffPnLOj5z7qyOixXMzYEhcm62CQbNR449oCEVimM8jk9gvhyfwFaDRAfWStvEfBwaxfhobMzoOBBAwj9fFW0SieLznSoGxfQGft/9YVxXKaUsk2oqVmjtJ0foxibatDOO6w33UdLdDO61g7anvH0FcmauQeuUyzLWvZMNMqSWlkAgEAgEAoGSFx6BQCAQCAS/ALivpHXg0Hkdr6zBFbBbBEWZ7AJlleoARfbUc0hyVyqAfq6xY4fqbUXJWWNQzQ2bKMqgDzJUmhL4lddApy4vgKIOBL1up1AIclf/GKhSdmq06nBvDfeD2js8hDi7DfqvbwAyQDyBY6oN1GW5/uE1HbszcGMcPgA6dXz0kI7rjQdjBVmch8slnQTl/PEtUKHLa+irIlGhm1l8XiqBFk3F4MDzk5xSr6Gt43wMJcyrkzUtV8A5HYfkMEpu50k+pZSyuOZaneQbG3FHGo6MQIClT8hhnEzOIfeQQ3WD/D7QseEQJITdPI7PFxZ0PDQAeaszg3toF5rkrrJJr3Cb95ZuIhF2IN17/I6OYTymOtFnhTKOj4YwBzt7IU8qchBlqS8X1+CyKZbRnkOjD3meZ3AQVP7WOuSaj29+oONMGmP2+MlHdeyj59wgt9/izBQuEER79ffCBdZqoO1WV0CtB3wsS+A0Dccr3bQLyQz6YWEO83RuBvIuNb1KZah+1DykhQQl6jxyBNKHj6ZRoUg17MZGddyRwdoXjSA+eBTyUTCAEx2bwD339mG9V0qp730XUq9FST6rdWwBWFiE+++xx47gGahWVKUB2X9jG7K1tYV5N3YANfyefvIlHZ88ARnLsdBvAySlh2Ne52c7YJK0sld9J9OPdbBrHNsIeicwpyxKBjhHWz5CJAv2H0QfJAcwx+0sxk2yjO/6mhjj3WRibqZp7ba8Y9wk16Wy753Ms1gk56OBeR6L4p7SCYxNli1X17Be3FhBv5Jirixqxr1noCQeFAgEAoFAIJAXHoFAIBAIBPsf95W0Gg5o6sMToAdTVHsq3UEODgtUVtOGtBSL4JhKKafjahESQHcfiKpn+0A52zaklO4M6DS7CQdRXz+oMsMC3Tc750341pmC5JSK4tGL5PZZvAtKbWMd9OvRSZxneBzPb4TgLqoo3NPEWVCN/ugpHV9/D8n8tjbgfIoGKfFY9cFIWlMz8zqu10AnX70O91KVapzki6Aat3dyOu7uhKMsTa6YfA7tFaD6VMzqfnyD6viQvMlJBDuJck5lQKdbPu9wdYnCbDVB65vkSDr10Ckd9/WDpt/YgPRRreG+F5dmdbyzkdPxbg5xzQHVHIxA6gpSPakTZ0BNszzSLjQpaWORak9ZPrSjj8wx7F+o1DCPkh2YE6MHIataPrRnrY7nzZDsEQxBqtvaQht+58+/q+P1Nchhx0/AifXwOUgYSim1uIa5sLyMdcHHTrkAJVL04YlCMawvveS62dgi5x8liyzNQMLlhIeKahFxewXD5IJ6MGXu1K//2jd0nImiXd/+IZxM6+sYs109kAD7eiEncYK2xaWZe34+eRxup8wkvnt3Cm10/vwJHUdJiviLb0OqOnAIc/+Da0i0qpRS/+YPUFful34V7q++fsztiUn01fAonnl5kdZC3j4Rhfz01VewZeDUqedxYXIwTS/gno4cx3iLJnBM6wFIlCwx75WpMpwhNyElRC2QE9UtYrB1UDLapsLcXMriN2ewG+dJjaGP3XXIW7Em5lCrhrlZrOGcTb93K0iAtNS6nyUtnGu5gDWiQltSwnSuWhW/s36FtX+sl+rckUNsdgG//ZUCvrtnj4lLSyAQCAQCgUBeeAQCgUAgEPwC4L6S1vompI7pOVDW/f2gQXuJWk2nQXcPDaOuUG8nKKt4Au9YG3T+ahXOAV8Y0lijip35zQruoUAJyark0Hn2JGobndjxSlqxBMkvWVClH92AK2RzA+6tj25iR/tb717R8a/+Ohwix0+D7rUboA6jFuj0o5OQCgobkLq2l1j2w7X8QVCT7cRjz4D6/Xd//Gc6XlmDKyTTBSdMKkFJrSjBYNCPYdOgRI9+oi9jcUgRy8s4v0E7+48cQV8dOow26ugAvd1L8mY6Q8VYlFJX30dyx5VF0P2pGO47kYAkFovgnjCqlAr6qQZcEsd3pTCeiyWMset3QLnn85D9ygq065FDaMfNbciH7YJLf6sEgqCTfeRkzOUxX1o22t20QP2urKAlikVQ8ecfhUOzWMIxtTqed2wMfRbwg1o/dnRCx4cP4N66qcZOMgmZSCmlDozDaeNSPbwMSeZ5mvNlmvM1rvNGiRSjCfSfQYkKd7Yw1ywSr5i6V4rbixykzoNJCuqj5G5zs1gXd3expjz2JNr76iXIfukM5mA+B5nCIdmzsyul462tnI7LJZz/2lW42u7cntfxy68iUeGH76NeXjCC34GBIcwbpZT6R//BEzru7oesMz09rePBIci+LRdyWjAMueOh0/h9OXoEMtswOZuKVazlnT3o87NHkCTRsNC+LYeTmbY/kSQnzOMalIocbvFBcool8btk0pYMH43Hnl4cr0LkLCxg7LdamO+HRlI6HhpFuzV3sYa2mpgT0RbW6MX1nOd5xjK4dhJTUzXIZRugqdOs4zcx7Md4LNfRTxXSkiMZ9MGpHnrmFNb+965gza1UaA5yvS33vq8zSilheAQCgUAgEPwCQF54BAKBQCAQ7HvclwMqkYumQLukGw3QqdNToJpWVkGPPvPMcR3394Lez6Qh6aQ7QIl29kxQDOrbpp3dddqxX06DWi9VQemOjmOX99GJnOd55uYhXV27CgrPbME9cugI6MhDk6BcV5dBzZWy5A4q4NmicdDvRUr8tFmEMyudglxTy+F9s1AEHTmUAY3bTtSIgjz3KFwLG1uQLPxE/Sbj5EAiGatQIDcWJRK0qB6Ojz4PETUbCuCcTz0JafDoMdD11Srozh1KeJgluVEppS6+c1nH62skJ5KzZ3oWrqvhQbQ9O14ccmqkUuT46cXxmR6Mq6lFSJG5HOSRYBRULifZ6x9G8rR2gX0UHeRka5L0yHXhyASnTOrjpSVIUX/5+o91nEqP6jhDdbV8Br5bzmE+7tIYOngADpFjZG+cmoHDZ46cUkopFY9gzDcakLuaFI+NoR0XF9B/fnIEFnIYI52ZYZyH8uJNF8lNSolNqzVKckoNxmV8ogHK1tZGZLMYUz5ywhw+CidTIIReD8cQ91FdqZ4+ShiZx3OureZ0PDCU0nEqg7l57ARkog7ahtDdi3P++m/Crdty0P+12idraeE76+uYw6Egrt2sQ5rZWcf1Hn3sFR339mAslaiGX7obc7Onf1THQUpC2XRoS4OnFtODqYemL0WnZ0XLF8a9+cjdqmgLg2vic9ePvtmp028OzX5/A8c0HXrGNazRZ06M6jgzgoSfi+Ri6x5De+YbNzzPYzdwrq441dWiZJa0W0SV87hXH7V1tYLPsxWMnXiath0EMe9yu3j/6OjAml4kJxtvo/gMeQeF4REIBAKBQLD/IS88AoFAIBAI9j3khUcgEAgEAsG+x3338HRmIHwfOgz9fG0de3haNnRYv5/23tRwzCZZhjfnyR5oQPhzfNDx4mRLjpCmZ1Khv07KEBuJ47vrK9D0+oexN0cppfp7YHPb6ceeg0Ilp+PuIezVoXqLqi8O/bhSoMKCBdggExHy5rVQPDKfx/O3yJrnp2erlLBXibXOduJf/k//q46//qtP6/i1rz6j4zvXsc+pUEBbBAy0fTRMe3LoGfye7Mo43iJb7/wC9ny9cwFZZK9cekvH21toi1IB7R4Mea3M2R1YMnnfT532sdSa0IHtFvZ9ccHYOlmciyvYA7K2Ae3aVbhvzjo90IdxGI+mdHzpEuy3X37lBdVuJGKk9ZOmbVI/BXlvgIMxZduILcqWeuMGCn3+1//Vf6fj4WHKiDuMORSPoT+4OGk0ltLxsQkaK1HM0zpvAFBKNVv49+g40hWUyujjLFmuuym7cDGPPSKNGvYMjFDW5Y4k5mmtgjGxk8U6EG6gHXO76PsixdHAg9n/0aRCtSHaq1Oron+WFtAW5x/H/qT1VTxPPIVzptKwE89N53R882Psn+ofwl6bs4+QfbmOOTQ7i7V8cQ73EI1iDC7MYw+dUkodO471LxTAcQ+ffJa+T8Ukaf+fov2COdq3M3HiFM5J3+XMxg1KhW14Mu8+2H07DJevayIO0hxxfIgbCnEoiP1ytkHFOclJ36BxGlZoB0owr/wOPr+xhjF+9iiyXjsR7Ke99sFFHadC3raKBnG9oJ/2CFKKhhh9x0+2f8NFv+5uU1FYhWMSlG2k1aJ9rVSkur8f7VKmvUohP98r79O6N4ThEQgEAoFAsO8hLzwCgUAgEAj2Pe4raU1MgloORUCbhmNkd1wBlWkocFMrS6DRhil7YtCH87QM0KPb2/M6vvAeaMmRQdBu48M4//YOjrdtSGm9Pad1nNuF1VkppQwf3TcVBnVNkuW2IdFsUZHFpTnYRv0GqLlqEZ/PTMOinCuxcRjPn0pQcUcfrHaRKGU1tr0ZotuF+WX0ye///us6fvXFZ3VcraJ/lleQIZgzJBtN0JqBIN6ZD1L205u3QZsXyL4cCBJdvQspokSyRIpsioYJ2tT5BGOZTIG2rdXx/RgVGYzFcX8jo7A+F8myW6vndOxSAclcAZRqg2y3frLcJ+K41tIsxvPFy5DA/s//6w0dP/PV/0y1A1Wiew2TKOcQZcFuYpzm8xhTLnllA2GMx1AIbVWnzOd3b6Ftp+9CqmMrcrWBc/qDmI9vvA2q/IWXH9Hx8VOQUZVSqkpjKruDlBHVKmSsAcrw3mih/3JU2LVUwvhdXcX4DZEUlad+LdDxoSDmozI5My8Vas3h+HYilYbs00HFc/M5ZCA+Ogn5tFbDmpWMY12cug1JeuousiKzrPzk06dwfpp3b/4AmcsH+nGtnj6sTQ5Jj50dkDf9fs5SrZRdx/XMAObLjRtI0XH46FEd16k/U5Tt/ew5pCsJRHFtm4oFexQkvgkH/+H+/BQtpVie41QdvD3DJEmdtmpUaU7FSML3+fHsFrVns4G1tW7h84JDme5zZOdfy+m4K43+66XUGUYVqTyU8qYeqVCmdZMKFTdquI8oZW6o1bAumCbGSCRCBZhDOE+LxjWvU9UaZYWmFBuRCFn0/Z/eycLwCAQCgUAg2PeQFx6BQCAQCAT7HveVtBo2JBq3AUq8rw+Uo6VAxd68g6ytG5Q5uKeLMrVS9kubdmrTZnaVJJpqewOS0dFxXCuZgJyxvY33ttwuqPjVNdyPUkp194H6LVVw3I2boFm3yflTroIKdBxQrg+fBrXeNQb3h0UPUTfxnBFfhmLIKj4faONML+Qgx3ow76GRELnZViFvXb0Cd06aMg03yRlgNMn9QLvhme50bdDMfT0pHe9soe2SJFc1anBjRUgG6aTMvn4fqM+tLYwFpZQqk5PEbaG9jx1Gdl/OvM3ZwtdWIBVwP4eJL2XpqmmQtEZuiOwuKN7FZcwXVt8uX/xYtRthckVEY2ivRoOkugrapEm0eTCC8dXbn9KxQ5rhxjrcaq6LvnFNzLutHMYQy0SuwtyvXoUElKM14etfxz0rpdT5R1CgMl/CcaVtalMqOBgnx8vuDuTDixchoQVJZgkE0Zd2DedX5CgpUBFKm8aW06K+9+S4bh9ilHl3YBBrxNzsvI6z27i/d97GmhWnYrm3PkJbHDoMt+uZx7EGHTyEOXHrBtavGRcSYG8vxkgsip+JyZOjOl5cRN/MTnE5XqVeehlzMEtZ56en4Fh9+wLmxelHcPzv/t4v4doR3LdNa5BpfLojx6N1/RzB8plD6X/rJMOxJOej39YWZf5uVNAH/khKxwmSXllWCpOkFQzgGJbANrYgDTWpKHAiibmyWfT+/iTIOdY/CPfd4hL60jJxH10YUmqRstLXGxhHnSOYvxkqCl3ZxXzs6k7p2CiQu5mkK4+ULpKWQCAQCAQCgbzwCAQCgUAg+AXAfSUtfwi0W7UCCtGlRE+b66Cse3qx03voIIqH1nfhurBLOR1binatu7jW6YcgGW1u3dZxownKyga7qWIxSmhUBYW2telNblZrQK5Kp4imJ8p6bgY0XbYC+m9oOKXjw8cf1/GJ06M6DgWpvfJol2YB3y1kQTMrkwupggfcIGdGO9Gg5HwxKnQajoASJ7OMCoZAi5apYGiSKsWxnJLfgayR6YT0MTSA4zNpUKIbWcgmVUq2VqngPFFKZulQcjallAr62S2Fvo6GMawjQVC1C9twsGyug75PZdD2PV2g+1s2GqMSA6W6uAJp7M4djLdQDHNklAouhsjV1y4wvd9sMNWPZ/f5ME/DEUocGce8G+iHUyNMieTKZcgNBUr+uEVFQgNElQ8MYSw3aXKGyGly7QMUK7xz+194nudX/v6rOj5/HmvHUD+SB4b8aMf3r7yp420qBJtJEK1NskelXKSP0RaOTUkbXXJ8kKyciGMeuA9I0jIpydzo2AEd/w///f+iYx6P7HAcHYPs8yv/AMUhT5zCuN7cxPP/3/8esl+5gvn11a89p+MPLr+l42AAY79SxrwJh1O4/0/86ZxI4LyNOsnV3XjOQARrwW//zm/hu1S0uGVzIkG+wr3liweTsvVnRIt+K0kmbhapADcldbVCWENNGpstG+1eLOI8qQjWlu4kfk9cKpBqUMHmuolWafgpsR9Ju2Yzh/N8ggcpkOTWY+F6SUp+avaijys1PFuVsiHSjgoVD+G7ER+es0mFjXtpLQ5F8A6xu4n7dqwUTmp9eu8LwyMQCAQCgWDfQ154BAKBQCAQ7Hvcv5YWyRJLs6DafnL5uo7XKLnX+ce/ouPRESSMulOC1ONPgK5UlBgtWIcEVKPaRsoA3Vcqgw7l+iwDQ6DTfES5ba573+eqRVBtPnKbTB5GzS2fAUqtTHXCHn8SVPGZEwfpeDxbYQcSTTmL86zTTnXXwD31DEBOMIO4n1gMLrh2wiX7ALtCevsgG2ysoT/z5GoKk4uKGFtVLlECuF24MeLxUR2nE6BXS+TsiZK7xAwQ7VrCBaLULj29aC+llMqRy+vIUbg8qlV8fvHiVR27lIhsbAz31zsAV0yGpMWVJbj8Nrchs01TgslyCTLDf/Pf/pqOqcyU+u53fqjajVIF465GToVQCP1kkmsjGoOMxTWGtrZzOnY2IfmWKLFhqQhK26FaRak03BX+EMZ7sUq0PB0foORpBaqLpZRSf/Jvv6XjnbU5Hf/GN17S8c3rSIy3tnhLx0FaxkIWuatIHgiRjEdqoCoW8Gy7OVDlLZJ2IxFIWlznqp3gOkjpDKj8Z59/Ssc3b+CZe7ohIT58FuuRZWI+FsuYB7euY7ysraABHn0a62UmQ86ZDshNm+sY7w+fRLLAdZJ2p4qQ2JRSansL46eDfkduTWP+f/3XflvHo6MjOq7USbr+gpxWnwc+Wmcpd55qlfFcVhX90WqwmxLHtKhmYcXG70a2iuMtC8c3qH6hQ4M8RslIXZeSEJIEFqXz+w3vGDdI3p2lWoPVbfxWnJ7AeJmb4q0nWFOOHiCHbhPPZpNsGaN5yrK968dzxjH0lUOyukt1BPeCMDwCgUAgEAj2PeSFRyAQCAQCwb7HfSUtZRCNRPVamIIaO4DPO7twuqUFOGIaDVBcfd2gLh3icQ0LdPIaJQysUD2roeFhHE/vaibt1B4ZRf2vDpgXlFJK1Rug0ak0lOrrw31MHDul45ZLNZmoBtbmCmjZbar7s7SEZ569O6/jVBx03+QJSCZlkvHY2ZJOfeLG2wWiMF3yM5QqoKbLNdClBXIVuFSbxSDKtmJhh32LnBNra2jrsVFQ9EEfzj+zChrcpDpOqU5KbOlSArROnEcppfpSoEgDAfTVd/78L3W8QrXe2MH0ypdf1nHvAJI+3vgYTqLbM0jidvPWgo5dA7LR4AAlSbQwRl55FTXd+snB0C7EycnSIJdWjRKX2aTLxJOQFeqUVG9pcUXHDo2PDkoGFouCKi4WMWYDlOirZkPCCPvweYto5q402r+ngywbn/h3IoT7mL71Id0rJB3LwDPnqf5bsYA1y+9DuwepjhHLDOxsYQlMkfTconaskdOxneA0eiYl2/zlvwf32u2bcM7duoV6R4MDKR3fuYE16PBx9GE0jfnxG7/5tI4tf07Hr//pZR1/5bVHdfzG5l/p+MbNKR3bDSyiIyOjnud56snndTw1/Z6OMynI0gfGjuBc5EBjEevvhOvqc8CjyJG7uU6JOiNJrKFGityXTYwDl9xVG1Rvq+RybSvML4fWgQSVf3NDuAeLXMXhIK4VsrzuZq77tbyB826uonc6+rC++GP4nU6m8bseD+H4XBnH52irwUg/xpRlQz6L09paIQm/SU5d5zOozcLwCAQCgUAg2PeQFx6BQCAQCAT7HveVtFZXQHfP3kHcS3WShkZBNcUioNe2VkFlrUxD9lHk4DBMUGdNSgBWo136EychUT311HkdX38f0sNbF0B7z85DSrEboOyUUspxQBf6iSJ0mcp20SR2A8csryG52Ra5kVgO2snh+ZNJSB1f/jKcFmOH4HKIJyBd+ShzF9enaieqZdyfQ1JDwwZNGSPnVDKJ+9vJwqlhN4jWN+HsiJIDb2WF6hXRtR46eUzHs+u4n3wBvGtHJ5wj8/OQlWZWcQ9KKRWn5InZLJxw84twD5gGqPwwJcHzU7LFu7OQqy5euabjXXKpHX8YtZ5eexXOoezaRzr+/ne+r+OeLkg0Tz4Kh1+74FJSPcNilxbR4DSWm1QYrVbDvAhQgrJQBN8lg5fyUeKyaJjq9VB9qrgJybNUxngKkkMkQudv0VxUSqmOJJ2X5O3pW5CPmzXi5knsqNbJsVblpG+QCqIx+tuOxmPTxloTCmMtY7ndddn9cf9dAH9buOrezp4USYtnz0EmtWmbQHYH61GWknnaNiRgl+qQZbcxrp9/Hmvq1M3v4LpJyPAHDmMN9vnRz319cLfuZjHnlFJqYy2n41YD31maQx9+83+HM+93//nv6JhlIE5o6P7/RN9yPPd5b5dZaRPrVYukKH8ca5RFMiy7kWz6rXQwfZXP5RjXJXVWtXgs0+cmD+u693ezQkmHTT/VNrOwJeHPfgS5NUEJKccHsYWjauL4Os3fcBjjQxkYmyFKIOtzWZKmdcAgudn1rin3gjA8AoFAIBAI9j3khUcgEAgEAsG+x3352RvX5nXsNkGtRiJwP0QjkBViAdDDx0cgS9x675KOL92Bu8Ahrs0kZ8eBCdSSeexx1HcxTFBZiyuQIUbGD+n4woULOr52A1KXUkp1JSAzGETtWVzriPjIONUsKZETpECxQ014+Ciki//o9/5jHTcosdTWNij6ji5kUPL70BbNT0hx7UKAruHaeM5CAfRqXxfqmEWCqI02RU6V7C6SSbkW+s1vYVz0dKP/UynQkaluUJzFChwf77+PcdFBjp2jk0hgOTVF0qhSKp/Hfayswtk3PIZEimOjSCrYpGR9G1SPhWWzIaoJ9dp5SAjnz7yo42oO8u4A1QwaTpzQ8Y/+8i0dp5No9/MwKX4uVEhWtJg1J7cL17Eq7UI+NGjeBUjaDQVIYq5CDqqWQDNHIuDQo0GM/QC5PPxEMweCuLlEkpIfml4niKJ6dsUiyaHkX/KRU4OMaapCNfbqlBWT61M1y5izfuL+uR6Y5b+3rERGLtWqPXhdxaFnDtEadPL0SR37LfTtX30PUurYIYz3ja2cjt/6EZLFnj4BierkaVqDqCbh0gok/L4BDNqzj3xJx4ePwWX1rX/7R55n+NP/h+5pGHM+Gka/ry7e1PEb34WcdvIMZO9QLIX780OGDgeoxh6t39w7Ln3OztIHDYsS9Rl7JE40GlRjKwepp5THWqwiKR2GKaFmwE+/P5QIM0ySbIKcflyrKkxjnxRm5TQxx0sVyKJKKbWTw/cLlEQ4SfJ2ZwIS6OIsJNb8LrnFejFmgwa2nsRDOGZ7DfexvIrf6MMH8XsyFMczbJRpC4q4tAQCgUAgEAjkhUcgEAgEAsEvAO4raUWC2JFdokRGwQBkrEaNE4CBmludRj2c7jSoyJefg0QVJofI7DySik0+jrpIPV3YwX3t2m0dR4nqTaWoPpcFGuzkieOe5wkQjb5FNaOSMdCjxUJOx3E67wS5i3Z2QTs2SBr6xj/8ho6/8gqcPH/4r//1Pb9rEOXa0QVKsLcHkkxbQZmZLIW2v3kd0tJOB/rw3Hk4OM49ApfSjVtwyM3OQVr0kYQwNAAK8ty5M7gu1SWaX0YfzMygXTIXp3U8CVVJOa53uJbL6Oux4VEdv/TSk/j+JD5/5wISq73+BuTO0xOQRF96DmNv7CgkvXoF1PRqDtLtzY9By586Bup/6DW48S5RPa/zr6i2IBAEPew0QTMbpL/UyqCifeT8CwSoHUm7ccmZFCTniEUStkmOMJecVmz+IKOYalFCTYPkplgI81cpparlHP5BkgAneewlV9DBw5A637v0Yx1vbkHadBxyspG0YJBzptkk+YjWIz/V/XJJ5i4T9d9OGB5ZhpxmNKcGh7EuLC9C3k2mIUvVazkdV6he02OPQ2595BwSw31wBS7DWAhrUKEIR6RZw5zd2IDc0TeEteK5F5HIUymllhYg3V9+D9sMXv0KJvTULfTVH//hH+v4tyO/oePRA7jvRBL30VR4NpOkeo+98AtydfH42ktIM1kzJdekTXKu20GJch3Md5eS8ao62sSluWkEcEzAwhyMBzBRgwoyd8BBbIW9d722hTFfqWBeRONo69Ekrjc6iS0JuTz6mBPFmnG8T6xSouFiDvN9p4r7nt3C8Sna8lFjzib66ZqWMDwCgUAgEAj2PeSFRyAQCAQCwb7HfSWtVALSlW2Tk2UY1FQkQokEDdBrDT/o9MMn4V569ktf1vHmGtWemr+B79ZA69WLkA+qeVB2XWnQu08/h8R+Zx8BZepS0jmllLrw5l/r+PrV93V89CAo3pVl3NPIONwMXV2Q9yoV3F+IajjFiFq9/NabOu6lOkbdHYiXiR6OxFM4ZzSmHgTWKNFfKoNd/1GSR3Z20N4/ePMdHQ+R8ylBtb7IwKGaNqjPcAbOjG3aqT99GbIkJ4JMdoDKbLRAqb791hUd2w5cCEp5E+tlomj7cydBkYYn4FoJkZx2/jHInU8+BFdgyMW9XrkAqaRcx7XJUKQynZC9rl6Ds2VgDPXAzpyFvNUucH2bICXoMh30K9fS4mSWLarp45BcY1KWN4PkoFAYfVOj+m81qrvms1guZUqf/qaifJX5HcghSnmlr1CQrtciSWcQ83Fy8pSOP74BqbIaxlhuEPXdaOL8FslEpQrGO7vAguRYqzawlgXp/A8KLImwLJfpwpx69EnIzTFap2emsTXgFtWFC4fYOYR2qZbQLlUD/TkyjnOub2Gdmpm6o+NkGm0RiVLyOKXUN/4x5P3efqwXNz++qOME1VZ7+nnMwYWlaziRifsbHILc3GzheTq6kGAxmYaU/kUlKmxRYkCXZFwv0Mc2SVStZbR1lBIPRtM43ke/FcrFOHWaeGCHxnhMYb5HqY/NJuagjyZnE8P9pyD37co2ObhquL8OH/1OU83KjR3cR4PqLp47A9d3YQ6/S6uUkHHkMLaUrFLdrulNPHMmg3HX1esdg/eCMDwCgUAgEAj2PeSFRyAQCAQCwb7HfSUtmzL5cDK4Fu3ortYoiRnRvfEeJLALR7D7v6pwzhszcLi0SAKLBHHOjRXs9jcUpJ7JybM6Hhk+qOMa3VulThy6Ump8DPKDQ3V5BnpBFaeJEu0fBoVuUD2hQB60XjqJe8okUjreWkNyumYLtGzfGDSgEiWf8pM0lt1BQr124vQZtNP6Ju6vtJPTcSYNetimmkNXr5DkSHRyLAVq8shx0NI3qPbahbdBYwctPHNXGrS5/zjat7MTn1+7grZY3+CEdErVSVuKjuG+F2dAuy8NY0wOUTLEkXHImLl1OArf/RDfvXUHElU4BLp0Zzen4+PHIPWdP41EbFevQFrIl9H/j72q2oLeHsypACXt7O2EfBCgxIA07VS+gHbkmlGxGMayjywuLaq1ducO5mydpJ46uTg5EWKQ5ClPvbyat+6NSckQHXKa2SR7xmI48Z3bSGa6tbGq4yjJliE/HjpfwHla9MwOyac7O6DiHYecYqSNRKJ4np83mnTfyU6sWY899ZiODx2Fk21wBGvwzQ8hb1WrOR0PjKZ0/H98E27CZ024o2yFvk2SUypEkotBrimlvFLDV34J1sQMze27t+EQyxXgCuuLQ8ooFrCGV0l+HDuI5zQsrh/Hdc++mL/nXWV/6jEOOYZtl+6ziO9uTyGBHycUHTiBuR9Jo02MJrad+MmRG45i3TObWBPyZZzz8ofzOp69jbVbKaXGeVuAnyTjKn4Hiw2sHbs19PHtFchmayX85h4/D2ds9wiev+XHlo90F+Zsjmpz7hr4PEhuSp/z6XXuhOERCAQCgUCw7yEvPAKBQCAQCPY97u/SSoI2bFSRJK6Yg8yQr4IWq9ugnfrJvpPuhGMlVwNtvJ5H0rokDlERMkKsbWPXthWBfBAiZ8LsLCjteCe+PDMPqUIppVxyp6RTOC4cATXbO4BnDsQg43HCwL5hSGOpJOhXl1wxfkomld2Ea2jlQ0gCfqpDVmtRm+ZA/Sn1uGobqMbRmTNwPKzNzet4eYF27odBU3Zm0BZTM2jvfAHOrDI9czQMia6YBUV67hTo2D5yHuSr6I88VEmPcyiV8Q5XUkhUTw/uL0iJ8haWSFp0QcFmqSbM/CxkrJt3cfz2Ji5w/hScVskUtwXG2OQkEsA99wKcie+9663p1g5ksxiPpNwog8Z4LI52CEUxxstl9FmDilIVi2j4MCUnNFxyewVwHqbuHXKHGZQ4sEZUPOX4U6blTRIWy5CLiBLv2XU6VwVzpEQJ2kJ0ryZ9l6UxP+ls9RrV0SNnVtOGPFDIU/2wKMZmsUyD8+cOPGeL3HWGhc97+iA/dJHsOTmJ5J+3rn+g48VlrEdPPIfkolubmOODo5BEuA7Z1G3Mm3jC25/5LH4vOjpxH4+cf1THExO4p/UNrJGhIM5VLqFPNrcoOWk3xkJ3L6Q722OK4gR6Pz/LlkuuqGazcc9jmg4+90VxnzR1VJ1q2K1eR5xbRXzkNH4T+wYwlu08fkOyBfRFNYLfq/c/wFp38SdYx2oVb1vNraEPnnsSUme9hs+X5jEvHB+ukaN6bkYTn8/Ooi/HxrC9wArgN2dzFY7eJLXR5i5tbSAZq1n31gC7F4ThEQgEAoFAsO8hLzwCgUAgEAj2Pe6/rbmB9yHTwa77eovoK5t2m1Nyr0wKrhm/H1TbwuK8jl2qH+MjXr5cAd2XSJIbJd1P9wDa0GcSlWeb94yVUiqdwT0NDqR0HCENjRnrzR3skq+QDDDQD/0tlYErJpulpFGUnK+f6gb94MdIZtc/hPuu0TP7fV56uF348EMkVcztwmHz2BlIdH2dkBxvT8GlxHVaDh9M6digvs2V4eZgKjrgh7y1uow2PXcCslo03avj13+I6/qJ3k59olZKowqak2v8zKXQ3vMr+LxlgS5NJNCHs3fgBBwfwhiLRfA8pRqkvu0lUKo9aZzz3QvXdfzii6jndeggnq1dSHdiLPvIOWGYVD/KUz8LdHJHBu1jkxRVKuV0HKdadS65DLM7cNMEyKWjDErURw6sSgVtGAnjfvwWu2mUGj2Mdg8G0a+ztyGtrCyDdm81aO0gl06zSQ4ZSr4WiZPL1KX1q4J5ECNprNkgWYKkLrvuve8vCsYeck2L64fR8t7Xj3V0ZBiy17e+hfYqVlDD7uhROFSbLawJkydRwywYTOm40fDWGGs00GbrNDdv3kIfnjyNJLEPnT2pY4e2Blgm+rBQwBzM0baKlsNy6BcjYzFClMh1bBySU62JsdPRjWMOnYAUHgzg/qdvY13KkqykyD07SAlknzqL7RgmSdUhE1snSrQFpdWA1NXTjfnnN7wJXpWLvs1uY+50Z7CGBv34/YrQFpGJo1gfoyH6nS2iX3MV/D4kMnD67uygLYr1WR0fPobr9vXAJbxe8SYavheE4REIBAKBQLDvIS88AoFAIBAI9j3uK2ktTM3oOJqA48MBg6xGxpHMLhQGDR4JQwLb3AQ1Fw6CWh4fQ6K2Zg2OrSbJZAvLSKbUMwr66sAhOArqJAfZNmiwIwchmSillF0FHVcu4bzbW6D2KiVQwuVcDtdosOsKx7NbhOsbdXdBxmiQ1GX62FECsNPmyMEx9SCQToE6nb6N529WQVmfP4s2e/hhJIdaWaVEhVRrxUc1hzrIabO2Dkp1ZwfUctPG868vgSo93geJZmQUx0zPcoI6b9I3y091o0i+vHQN9OfGJmjw4+fheHthEtR80kCfB030revASVBzSMrwI97YwjM4dTznuz/+WMfjD0DS2tgkV19hTcddnWijjnSQjuHaVSTd2BjXBlHlyqZEmySNxci5WG9iPtXqJPtQMj/XJVeXi/M4LUhdSik1PYNnmDyONSWZQoK93RyuVyqQk5FUDHb12dRnroODQhGMWdMipxk9vhvGMRWSah2WzH7OMD6LRENtYZBLjWumNcg59/IrL+r47hTWnRC58cqUYG47i3E3OQn5QRnop58C1+vtx/VytKY6lNCxUb93u9rkeAqFIcv2Uux+UUWz9kCB6j+eexROtKMPYW2Nh2k8JuiXwKLaYQOUkK+M/vCTOzKQRGw27p2EjxMbmiaOf/rJJ3BME2sFu42VUso0sOBbVC/TH8J3whatIxZtZ6B6libNf9uHayxBtVY+Oo8yML66x3iLDA6pUjJOrk25F4ThEQgEAoFAsO8hLzwCgUAgEAj2Pe4raQ1R8sClDVDOOxXQ4/EOUFCOg13YG1Tfprf3mI45uZnTBC3tN0HF20SnzlFdpPk1yAf9/aC7/H76bp0cXrGU53maTUrktAbZo9XAfdTKlNCL+GFOxObn0ie7kOvYFRIM4J5qddCUvX1wS/j9OGc6ykn+kOirnWjQcw4PghJe3wJl+e03UDPrS0/CqXHwANr79sdwWtjk5OvtQf/XSELZ2EKbpntBTWaprS9dw3gZGsEu/EFKMLa4Buntp9eDE65SBX1f2YQTzE8OOYtofb+JsWAmMd6Ge0fxDE1wpxs0bg9PwNHQIhnLJMm0WgFlO7/U/tpoPV1ooyGqF9bfh+f10TMGaU6x06LVBEVtGhjvLGO1SAIZHYUTZG4erp71dcwD0wSN7VDdtSpJz6Gw1+1UIhngzh2sNQWSDGt5HGNR7a0gyQPBMJ6THUsuyTsROsZHtb44CaNFiRF9dK1IkF1Af8fB8hb9w6V5EArj+c+cwTYBlonqDcy7xQU4PcsVrCdhqqOolFIO6YMGjatOqgHmkOzlfAZZiu+JYz7/3wVUglhbN3axDlo0pzZ2SG7N0lwg57JJ7kNOKGpTgldnG5+32N1Gv0UuSdWmSUkOKWGlQzUozU+0JycVVVwzjeYFX5sTL7p7cCpBrsNGl3PYZWhQ8lM6jd3CMSYlFG04n3CX3QPC8AgEAoFAINj3kBcegUAgEAgE+x7G37Ud7gKBQCAQCATthjA8AoFAIBAI9j3khUcgEAgEAsG+h7zwCAQCgUAg2PeQFx6BQCAQCAT7HvLCIxAIBAKBYN9DXngEAoFAIBDse/y/Ce8pv4qC6qUAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 7\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 8\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For data class 9\n", + " Plot high risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot low risky training points\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SingleSliceSpec\n", + "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingFeature\n", + "from tensorflow_privacy.privacy.membership_inference_attack.dataset_slicing import get_slice\n", + "import matplotlib.pyplot as plt\n", + "class_list = np.arange(10)\n", + "num_images = 5\n", + "for c in class_list:\n", + " print('For data class '+str(c))\n", + " class_slice_spec = SingleSliceSpec(SlicingFeature.CLASS, c)\n", + " class_input_slice = get_slice(input, class_slice_spec)\n", + " class_dataset_idx = np.argwhere(labels_train==c).flatten()\n", + "\n", + " class_train_membership_probs = mia._compute_membership_probability(class_input_slice).train_membership_probs\n", + "\n", + " class_high_risky_idx = np.argsort(class_train_membership_probs)[::-1][:num_images]\n", + " class_low_risky_idx = np.argsort(np.absolute(class_train_membership_probs-0.5))[:num_images]\n", + " \n", + " high_risky_images = x_train[class_dataset_idx[class_high_risky_idx]]\n", + " low_risky_images = x_train[class_dataset_idx[class_low_risky_idx]]\n", + " print(' Plot high risky training points')\n", + " fig = plt.figure(figsize=(10,10*num_images))\n", + " for i in range(num_images):\n", + " fig.add_subplot(1, num_images, i+1)\n", + " plt.axis('off')\n", + " plt.imshow(high_risky_images[i])\n", + " plt.show()\n", + "\n", + " print(' Plot low risky training points')\n", + " fig = plt.figure(figsize=(10,10*num_images))\n", + "\n", + " for i in range(num_images):\n", + " fig.add_subplot(1, num_images, i+1)\n", + " plt.axis('off')\n", + " plt.imshow(low_risky_images[i])\n", + " \n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "last_runtime": { + "build_target": "//learning/deepmind/public/tools/ml_python:ml_notebook", + "kind": "private" + }, + "name": "Membership probability analysis codelab", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.10" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb b/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb deleted file mode 100644 index 742ce8b..0000000 --- a/tensorflow_privacy/privacy/membership_inference_attack/codelabs/privacy_risk_score_codelab.ipynb +++ /dev/null @@ -1,809 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "1eiwVljWpzM7" - }, - "source": [ - "Copyright 2020 The TensorFlow Authors.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "cellView": "both", - "colab": {}, - "colab_type": "code", - "id": "4rmwPgXeptiS" - }, - "outputs": [], - "source": [ - "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", - "# you may not use this file except in compliance with the License.\n", - "# You may obtain a copy of the License at\n", - "#\n", - "# https://www.apache.org/licenses/LICENSE-2.0\n", - "#\n", - "# Unless required by applicable law or agreed to in writing, software\n", - "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", - "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", - "# See the License for the specific language governing permissions and\n", - "# limitations under the License." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "YM2gRaJMqvMi" - }, - "source": [ - "# Assess privacy risks with TensorFlow Privacy Membership Inference Attacks" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "-B5ZvlSqqLaR" - }, - "source": [ - "\n", - " \n", - " \n", - "
\n", - " Run in Google Colab\n", - " \n", - " View source on GitHub\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "9rMuytY7Nn8P" - }, - "source": [ - "##Overview\n", - "In this codelab we'll train a simple image classification model on the CIFAR10 dataset, and then use the \"membership inference attack\" against this model to assess if the attacker is able to \"guess\" whether a particular sample was present in the training set. We further compute each sample's probability of being in the training set, denoted as the privacy risk score (https://arxiv.org/abs/2003.10595)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "FUWqArj_q8vs" - }, - "source": [ - "## Setup\n", - "First, set this notebook's runtime to use a GPU, under Runtime > Change runtime type > Hardware accelerator. Then, begin importing the necessary libraries." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "cellView": "form", - "colab": {}, - "colab_type": "code", - "id": "Lr1pwHcbralz" - }, - "outputs": [], - "source": [ - "#@title Import statements.\n", - "import numpy as np\n", - "from typing import Tuple, Text\n", - "from scipy import special\n", - "\n", - "import tensorflow as tf\n", - "import tensorflow_datasets as tfds\n", - "\n", - "# Set verbosity.\n", - "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)\n", - "from warnings import simplefilter\n", - "from sklearn.exceptions import ConvergenceWarning\n", - "simplefilter(action=\"ignore\", category=ConvergenceWarning)\n", - "simplefilter(action=\"ignore\", category=FutureWarning)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ucw81ar6ru-6" - }, - "source": [ - "### Install TensorFlow Privacy." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "cellView": "both", - "colab": {}, - "colab_type": "code", - "id": "zcqAmiGH90kl" - }, - "outputs": [], - "source": [ - "!pip3 install git+https://github.com/tensorflow/privacy\n", - "\n", - "from tensorflow_privacy.privacy.membership_inference_attack import membership_inference_attack as mia" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "pBbcG86th_sW" - }, - "source": [ - "## Train a model" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "cellView": "form", - "colab": {}, - "colab_type": "code", - "id": "vCyOWyyhXLib" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loading the dataset.\n", - "learning rate %f 0.02\n", - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - "Layer (type) Output Shape Param # \n", - "=================================================================\n", - "conv2d (Conv2D) (None, 30, 30, 32) 896 \n", - "_________________________________________________________________\n", - "max_pooling2d (MaxPooling2D) (None, 15, 15, 32) 0 \n", - "_________________________________________________________________\n", - "conv2d_1 (Conv2D) (None, 13, 13, 32) 9248 \n", - "_________________________________________________________________\n", - "max_pooling2d_1 (MaxPooling2 (None, 6, 6, 32) 0 \n", - "_________________________________________________________________\n", - "conv2d_2 (Conv2D) (None, 4, 4, 32) 9248 \n", - "_________________________________________________________________\n", - "max_pooling2d_2 (MaxPooling2 (None, 2, 2, 32) 0 \n", - "_________________________________________________________________\n", - "flatten (Flatten) (None, 128) 0 \n", - "_________________________________________________________________\n", - "dense (Dense) (None, 64) 8256 \n", - "_________________________________________________________________\n", - "dense_1 (Dense) (None, 10) 650 \n", - "=================================================================\n", - "Total params: 28,298\n", - "Trainable params: 28,298\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n", - "Epoch 1/100\n", - "200/200 [==============================] - 2s 11ms/step - loss: 2.0612 - accuracy: 0.2296 - val_loss: 1.7651 - val_accuracy: 0.3543\n", - "Epoch 2/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 1.6134 - accuracy: 0.4093 - val_loss: 1.4970 - val_accuracy: 0.4533\n", - "Epoch 3/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 1.4312 - accuracy: 0.4798 - val_loss: 1.3316 - val_accuracy: 0.5254\n", - "Epoch 4/100\n", - "200/200 [==============================] - 2s 9ms/step - loss: 1.3117 - accuracy: 0.5308 - val_loss: 1.2511 - val_accuracy: 0.5495\n", - "Epoch 5/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 1.2103 - accuracy: 0.5715 - val_loss: 1.1634 - val_accuracy: 0.5906\n", - "Epoch 6/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 1.1535 - accuracy: 0.5943 - val_loss: 1.1286 - val_accuracy: 0.6007\n", - "Epoch 7/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 1.0921 - accuracy: 0.6147 - val_loss: 1.1256 - val_accuracy: 0.6005\n", - "Epoch 8/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 1.0472 - accuracy: 0.6319 - val_loss: 1.0726 - val_accuracy: 0.6266\n", - "Epoch 9/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 1.0173 - accuracy: 0.6434 - val_loss: 1.0692 - val_accuracy: 0.6228\n", - "Epoch 10/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.9775 - accuracy: 0.6543 - val_loss: 0.9961 - val_accuracy: 0.6544\n", - "Epoch 11/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.9361 - accuracy: 0.6747 - val_loss: 0.9996 - val_accuracy: 0.6519\n", - "Epoch 12/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.9077 - accuracy: 0.6815 - val_loss: 1.0096 - val_accuracy: 0.6526\n", - "Epoch 13/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.8918 - accuracy: 0.6865 - val_loss: 0.9685 - val_accuracy: 0.6624\n", - "Epoch 14/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.8501 - accuracy: 0.7016 - val_loss: 0.9513 - val_accuracy: 0.6737\n", - "Epoch 15/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.8402 - accuracy: 0.7041 - val_loss: 1.0338 - val_accuracy: 0.6449\n", - "Epoch 16/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.8218 - accuracy: 0.7099 - val_loss: 0.9843 - val_accuracy: 0.6588\n", - "Epoch 17/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.8029 - accuracy: 0.7167 - val_loss: 0.9515 - val_accuracy: 0.6724\n", - "Epoch 18/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.7858 - accuracy: 0.7230 - val_loss: 0.9279 - val_accuracy: 0.6790\n", - "Epoch 19/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.7609 - accuracy: 0.7316 - val_loss: 0.9664 - val_accuracy: 0.6705\n", - "Epoch 20/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.7452 - accuracy: 0.7352 - val_loss: 0.9328 - val_accuracy: 0.6880\n", - "Epoch 21/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.7412 - accuracy: 0.7378 - val_loss: 0.9045 - val_accuracy: 0.6869\n", - "Epoch 22/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.7174 - accuracy: 0.7468 - val_loss: 0.9313 - val_accuracy: 0.6844\n", - "Epoch 23/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.7113 - accuracy: 0.7481 - val_loss: 0.9915 - val_accuracy: 0.6594\n", - "Epoch 24/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6890 - accuracy: 0.7575 - val_loss: 0.9174 - val_accuracy: 0.6922\n", - "Epoch 25/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6839 - accuracy: 0.7578 - val_loss: 0.9313 - val_accuracy: 0.6891\n", - "Epoch 26/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6696 - accuracy: 0.7627 - val_loss: 0.9411 - val_accuracy: 0.6838\n", - "Epoch 27/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6581 - accuracy: 0.7673 - val_loss: 0.9240 - val_accuracy: 0.6900\n", - "Epoch 28/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6504 - accuracy: 0.7717 - val_loss: 0.9469 - val_accuracy: 0.6872\n", - "Epoch 29/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6486 - accuracy: 0.7700 - val_loss: 0.9310 - val_accuracy: 0.6924\n", - "Epoch 30/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6389 - accuracy: 0.7761 - val_loss: 0.9203 - val_accuracy: 0.6977\n", - "Epoch 31/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6198 - accuracy: 0.7808 - val_loss: 0.9639 - val_accuracy: 0.6865\n", - "Epoch 32/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6234 - accuracy: 0.7810 - val_loss: 0.9300 - val_accuracy: 0.6978\n", - "Epoch 33/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.6213 - accuracy: 0.7801 - val_loss: 0.9401 - val_accuracy: 0.6939\n", - "Epoch 34/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5966 - accuracy: 0.7881 - val_loss: 0.9759 - val_accuracy: 0.6893\n", - "Epoch 35/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5935 - accuracy: 0.7905 - val_loss: 0.9545 - val_accuracy: 0.6918\n", - "Epoch 36/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5843 - accuracy: 0.7943 - val_loss: 0.9762 - val_accuracy: 0.6881\n", - "Epoch 37/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5841 - accuracy: 0.7923 - val_loss: 0.9974 - val_accuracy: 0.6932\n", - "Epoch 38/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5705 - accuracy: 0.8001 - val_loss: 0.9882 - val_accuracy: 0.6956\n", - "Epoch 39/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5755 - accuracy: 0.7966 - val_loss: 1.0226 - val_accuracy: 0.6828\n", - "Epoch 40/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5720 - accuracy: 0.7977 - val_loss: 1.0234 - val_accuracy: 0.6865\n", - "Epoch 41/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5625 - accuracy: 0.7990 - val_loss: 1.0069 - val_accuracy: 0.6901\n", - "Epoch 42/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5516 - accuracy: 0.8031 - val_loss: 1.0525 - val_accuracy: 0.6834\n", - "Epoch 43/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5506 - accuracy: 0.8029 - val_loss: 0.9840 - val_accuracy: 0.6958\n", - "Epoch 44/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5461 - accuracy: 0.8055 - val_loss: 1.0448 - val_accuracy: 0.6848\n", - "Epoch 45/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5351 - accuracy: 0.8098 - val_loss: 1.0133 - val_accuracy: 0.6991\n", - "Epoch 46/100\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "200/200 [==============================] - 2s 9ms/step - loss: 0.5219 - accuracy: 0.8157 - val_loss: 1.0694 - val_accuracy: 0.6729\n", - "Epoch 47/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5232 - accuracy: 0.8121 - val_loss: 1.0447 - val_accuracy: 0.6902\n", - "Epoch 48/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5180 - accuracy: 0.8149 - val_loss: 1.0495 - val_accuracy: 0.6907\n", - "Epoch 49/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5022 - accuracy: 0.8217 - val_loss: 1.0147 - val_accuracy: 0.6941\n", - "Epoch 50/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5017 - accuracy: 0.8210 - val_loss: 1.0510 - val_accuracy: 0.6925\n", - "Epoch 51/100\n", - "200/200 [==============================] - 2s 9ms/step - loss: 0.4997 - accuracy: 0.8230 - val_loss: 1.0620 - val_accuracy: 0.6935\n", - "Epoch 52/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.5001 - accuracy: 0.8214 - val_loss: 1.1083 - val_accuracy: 0.6832\n", - "Epoch 53/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4976 - accuracy: 0.8213 - val_loss: 1.0512 - val_accuracy: 0.6924\n", - "Epoch 54/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4858 - accuracy: 0.8250 - val_loss: 1.0825 - val_accuracy: 0.6936\n", - "Epoch 55/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4859 - accuracy: 0.8241 - val_loss: 1.1278 - val_accuracy: 0.6763\n", - "Epoch 56/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4839 - accuracy: 0.8275 - val_loss: 1.1310 - val_accuracy: 0.6900\n", - "Epoch 57/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4805 - accuracy: 0.8295 - val_loss: 1.1174 - val_accuracy: 0.6838\n", - "Epoch 58/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4836 - accuracy: 0.8278 - val_loss: 1.1538 - val_accuracy: 0.6884\n", - "Epoch 59/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4816 - accuracy: 0.8278 - val_loss: 1.1088 - val_accuracy: 0.6831\n", - "Epoch 60/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4589 - accuracy: 0.8351 - val_loss: 1.1430 - val_accuracy: 0.6827\n", - "Epoch 61/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4633 - accuracy: 0.8337 - val_loss: 1.0974 - val_accuracy: 0.6935\n", - "Epoch 62/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4562 - accuracy: 0.8362 - val_loss: 1.1591 - val_accuracy: 0.6809\n", - "Epoch 63/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4604 - accuracy: 0.8340 - val_loss: 1.1722 - val_accuracy: 0.6778\n", - "Epoch 64/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4536 - accuracy: 0.8378 - val_loss: 1.1837 - val_accuracy: 0.6740\n", - "Epoch 65/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4773 - accuracy: 0.8281 - val_loss: 1.2039 - val_accuracy: 0.6746\n", - "Epoch 66/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4444 - accuracy: 0.8400 - val_loss: 1.1762 - val_accuracy: 0.6784\n", - "Epoch 67/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4452 - accuracy: 0.8404 - val_loss: 1.2105 - val_accuracy: 0.6767\n", - "Epoch 68/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4444 - accuracy: 0.8387 - val_loss: 1.2040 - val_accuracy: 0.6763\n", - "Epoch 69/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4482 - accuracy: 0.8383 - val_loss: 1.2023 - val_accuracy: 0.6807\n", - "Epoch 70/100\n", - "200/200 [==============================] - 2s 9ms/step - loss: 0.4482 - accuracy: 0.8388 - val_loss: 1.1758 - val_accuracy: 0.6891\n", - "Epoch 71/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4323 - accuracy: 0.8447 - val_loss: 1.1958 - val_accuracy: 0.6883\n", - "Epoch 72/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4402 - accuracy: 0.8399 - val_loss: 1.2304 - val_accuracy: 0.6834\n", - "Epoch 73/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4259 - accuracy: 0.8479 - val_loss: 1.2637 - val_accuracy: 0.6711\n", - "Epoch 74/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4319 - accuracy: 0.8444 - val_loss: 1.1960 - val_accuracy: 0.6826\n", - "Epoch 75/100\n", - "200/200 [==============================] - 2s 9ms/step - loss: 0.4332 - accuracy: 0.8420 - val_loss: 1.2422 - val_accuracy: 0.6868\n", - "Epoch 76/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4207 - accuracy: 0.8477 - val_loss: 1.2335 - val_accuracy: 0.6802\n", - "Epoch 77/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4284 - accuracy: 0.8452 - val_loss: 1.2575 - val_accuracy: 0.6802\n", - "Epoch 78/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4129 - accuracy: 0.8502 - val_loss: 1.3147 - val_accuracy: 0.6734\n", - "Epoch 79/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4300 - accuracy: 0.8448 - val_loss: 1.2489 - val_accuracy: 0.6795\n", - "Epoch 80/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4190 - accuracy: 0.8490 - val_loss: 1.3098 - val_accuracy: 0.6658\n", - "Epoch 81/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4192 - accuracy: 0.8475 - val_loss: 1.3094 - val_accuracy: 0.6794\n", - "Epoch 82/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4179 - accuracy: 0.8474 - val_loss: 1.2586 - val_accuracy: 0.6812\n", - "Epoch 83/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4101 - accuracy: 0.8509 - val_loss: 1.2885 - val_accuracy: 0.6766\n", - "Epoch 84/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4076 - accuracy: 0.8521 - val_loss: 1.3107 - val_accuracy: 0.6728\n", - "Epoch 85/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4095 - accuracy: 0.8510 - val_loss: 1.3321 - val_accuracy: 0.6797\n", - "Epoch 86/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4051 - accuracy: 0.8535 - val_loss: 1.3349 - val_accuracy: 0.6755\n", - "Epoch 87/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3985 - accuracy: 0.8536 - val_loss: 1.2849 - val_accuracy: 0.6760\n", - "Epoch 88/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3933 - accuracy: 0.8576 - val_loss: 1.3214 - val_accuracy: 0.6799\n", - "Epoch 89/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4005 - accuracy: 0.8537 - val_loss: 1.3200 - val_accuracy: 0.6793\n", - "Epoch 90/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3939 - accuracy: 0.8561 - val_loss: 1.3327 - val_accuracy: 0.6755\n", - "Epoch 91/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3904 - accuracy: 0.8565 - val_loss: 1.3969 - val_accuracy: 0.6770\n", - "Epoch 92/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3989 - accuracy: 0.8554 - val_loss: 1.3437 - val_accuracy: 0.6761\n", - "Epoch 93/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3921 - accuracy: 0.8578 - val_loss: 1.4248 - val_accuracy: 0.6763\n", - "Epoch 94/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3781 - accuracy: 0.8609 - val_loss: 1.3771 - val_accuracy: 0.6728\n", - "Epoch 95/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.4045 - accuracy: 0.8528 - val_loss: 1.4156 - val_accuracy: 0.6735\n", - "Epoch 96/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3998 - accuracy: 0.8536 - val_loss: 1.3608 - val_accuracy: 0.6770\n", - "Epoch 97/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3875 - accuracy: 0.8587 - val_loss: 1.4172 - val_accuracy: 0.6642\n", - "Epoch 98/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3975 - accuracy: 0.8537 - val_loss: 1.3898 - val_accuracy: 0.6758\n", - "Epoch 99/100\n", - "200/200 [==============================] - 2s 9ms/step - loss: 0.3779 - accuracy: 0.8610 - val_loss: 1.3825 - val_accuracy: 0.6743\n", - "Epoch 100/100\n", - "200/200 [==============================] - 2s 10ms/step - loss: 0.3836 - accuracy: 0.8613 - val_loss: 1.4445 - val_accuracy: 0.6738\n", - "Finished training.\n" - ] - } - ], - "source": [ - "#@markdown Train a simple model on CIFAR10 with Keras.\n", - "\n", - "dataset = 'cifar10'\n", - "num_classes = 10\n", - "num_conv = 3\n", - "activation = 'relu'\n", - "lr = 0.02\n", - "momentum = 0.9\n", - "batch_size = 250\n", - "epochs = 100 # Privacy risks are especially visible with lots of epochs.\n", - "\n", - "\n", - "def small_cnn(input_shape: Tuple[int],\n", - " num_classes: int,\n", - " num_conv: int,\n", - " activation: Text = 'relu') -> tf.keras.models.Sequential:\n", - " \"\"\"Setup a small CNN for image classification.\n", - "\n", - " Args:\n", - " input_shape: Integer tuple for the shape of the images.\n", - " num_classes: Number of prediction classes.\n", - " num_conv: Number of convolutional layers.\n", - " activation: The activation function to use for conv and dense layers.\n", - "\n", - " Returns:\n", - " The Keras model.\n", - " \"\"\"\n", - " model = tf.keras.models.Sequential()\n", - " model.add(tf.keras.layers.Input(shape=input_shape))\n", - "\n", - " # Conv layers\n", - " for _ in range(num_conv):\n", - " model.add(tf.keras.layers.Conv2D(32, (3, 3), activation=activation))\n", - " model.add(tf.keras.layers.MaxPooling2D())\n", - "\n", - " model.add(tf.keras.layers.Flatten())\n", - " model.add(tf.keras.layers.Dense(64, activation=activation))\n", - " model.add(tf.keras.layers.Dense(num_classes))\n", - " return model\n", - "\n", - "\n", - "print('Loading the dataset.')\n", - "train_ds = tfds.as_numpy(\n", - " tfds.load(dataset, split=tfds.Split.TRAIN, batch_size=-1))\n", - "test_ds = tfds.as_numpy(\n", - " tfds.load(dataset, split=tfds.Split.TEST, batch_size=-1))\n", - "x_train = train_ds['image'].astype('float32') / 255.\n", - "y_train_indices = train_ds['label'][:, np.newaxis]\n", - "x_test = test_ds['image'].astype('float32') / 255.\n", - "y_test_indices = test_ds['label'][:, np.newaxis]\n", - "\n", - "# Convert class vectors to binary class matrices.\n", - "y_train = tf.keras.utils.to_categorical(y_train_indices, num_classes)\n", - "y_test = tf.keras.utils.to_categorical(y_test_indices, num_classes)\n", - "\n", - "input_shape = x_train.shape[1:]\n", - "\n", - "model = small_cnn(\n", - " input_shape, num_classes, num_conv=num_conv, activation=activation)\n", - "\n", - "print('learning rate %f', lr)\n", - "\n", - "optimizer = tf.keras.optimizers.SGD(lr=lr, momentum=momentum)\n", - "\n", - "loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)\n", - "model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])\n", - "model.summary()\n", - "model.fit(\n", - " x_train,\n", - " y_train,\n", - " batch_size=batch_size,\n", - " epochs=epochs,\n", - " validation_data=(x_test, y_test),\n", - " shuffle=True)\n", - "print('Finished training.')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ee-zjGGGV1DC" - }, - "source": [ - "## Calculate logits, probabilities and loss values for training and test sets.\n", - "\n", - "We will use these values later in the membership inference attack and privacy risk score analysis to separate training and test samples." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "cellView": "both", - "colab": {}, - "colab_type": "code", - "id": "um9r0tSiPx4u" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Predict on train...\n", - "Predict on test...\n", - "Apply softmax to get probabilities from logits...\n", - "Compute losses...\n" - ] - } - ], - "source": [ - "print('Predict on train...')\n", - "logits_train = model.predict(x_train, batch_size=batch_size)\n", - "print('Predict on test...')\n", - "logits_test = model.predict(x_test, batch_size=batch_size)\n", - "\n", - "print('Apply softmax to get probabilities from logits...')\n", - "prob_train = special.softmax(logits_train, axis=1)\n", - "prob_test = special.softmax(logits_test, axis=1)\n", - "\n", - "print('Compute losses...')\n", - "cce = tf.keras.backend.categorical_crossentropy\n", - "constant = tf.keras.backend.constant\n", - "\n", - "loss_train = cce(constant(y_train), constant(prob_train), from_logits=False).numpy()\n", - "loss_test = cce(constant(y_test), constant(prob_test), from_logits=False).numpy()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "QETxVOHLiHP4" - }, - "source": [ - "## Run membership inference attacks.\n", - "\n", - "We will now execute a membership inference attack against the previously trained CIFAR10 model. This will generate a number of scores, most notably, attacker advantage and AUC for the membership inference classifier.\n", - "\n", - "An AUC of close to 0.5 means that the attack wasn't able to identify training samples, which means that the model doesn't have privacy issues according to this test. Higher values, on the contrary, indicate potential privacy issues." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "B8NIwhVwQT7I" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Best-performing attacks over all slices\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.75 on slice CORRECTLY_CLASSIFIED=False\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.39 on slice CORRECTLY_CLASSIFIED=False\n", - "\n", - "Best-performing attacks over slice: \"Entire dataset\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.62\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.21\n", - "\n", - "Best-performing attacks over slice: \"CLASS=0\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.65\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.28\n", - "\n", - "Best-performing attacks over slice: \"CLASS=1\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.59\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.18\n", - "\n", - "Best-performing attacks over slice: \"CLASS=2\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.72\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.33\n", - "\n", - "Best-performing attacks over slice: \"CLASS=3\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.68\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.30\n", - "\n", - "Best-performing attacks over slice: \"CLASS=4\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.68\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.28\n", - "\n", - "Best-performing attacks over slice: \"CLASS=5\"\n", - " THRESHOLD_ENTROPY_ATTACK achieved an AUC of 0.63\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.23\n", - "\n", - "Best-performing attacks over slice: \"CLASS=6\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.59\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.19\n", - "\n", - "Best-performing attacks over slice: \"CLASS=7\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.62\n", - " THRESHOLD_ATTACK achieved an advantage of 0.21\n", - "\n", - "Best-performing attacks over slice: \"CLASS=8\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.59\n", - " THRESHOLD_ENTROPY_ATTACK achieved an advantage of 0.17\n", - "\n", - "Best-performing attacks over slice: \"CLASS=9\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.64\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.22\n", - "\n", - "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=True\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.52\n", - " THRESHOLD_ATTACK achieved an advantage of 0.06\n", - "\n", - "Best-performing attacks over slice: \"CORRECTLY_CLASSIFIED=False\"\n", - " LOGISTIC_REGRESSION achieved an AUC of 0.75\n", - " LOGISTIC_REGRESSION achieved an advantage of 0.39\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackInputData\n", - "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import SlicingSpec\n", - "from tensorflow_privacy.privacy.membership_inference_attack.data_structures import AttackType\n", - "\n", - "import tensorflow_privacy.privacy.membership_inference_attack.plotting as plotting\n", - "\n", - "labels_train = np.argmax(y_train, axis=1)\n", - "labels_test = np.argmax(y_test, axis=1)\n", - "\n", - "input = AttackInputData(\n", - " logits_train = logits_train,\n", - " logits_test = logits_test,\n", - " loss_train = loss_train,\n", - " loss_test = loss_test,\n", - " labels_train = labels_train,\n", - " labels_test = labels_test\n", - ")\n", - "\n", - "# Run several attacks for different data slices\n", - "attacks_result = mia.run_attacks(input,\n", - " SlicingSpec(\n", - " entire_dataset = True,\n", - " by_class = True,\n", - " by_classification_correctness = True\n", - " ),\n", - " attack_types = [\n", - " AttackType.THRESHOLD_ATTACK,\n", - " AttackType.THRESHOLD_ENTROPY_ATTACK,\n", - " AttackType.LOGISTIC_REGRESSION])\n", - "\n", - "# Plot the ROC curve of the best classifier\n", - "fig = plotting.plot_roc_curve(\n", - " attacks_result.get_result_with_max_auc().roc_curve)\n", - "\n", - "# Print a user-friendly summary of the attacks\n", - "print(attacks_result.summary(by_slices = True))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "E9zwsPGFujVq" - }, - "source": [ - "## Compute privacy risk score\n", - "\n", - "This part shows how to use the privacy risk score.\n", - "\n", - "For each data slice, we compute privacy risk scores for both training and test data. We then set a threshold on risk scores (an input is inferred as a member if and only if its risk score is higher than the threshold) and compute the attack precision and recall values" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Privacy risk score analysis over slice: \"Entire dataset\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.60966, 0.10730)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56588, 0.87102)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=0\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62251, 0.26880)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57677, 0.74680)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=1\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61579, 0.23560)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.58356, 0.64880)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=2\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.64815, 0.58580)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.62353, 0.80660)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=3\"\n", - " with 1.00000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00060)\n", - " with 0.90000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00060)\n", - " with 0.80000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00060)\n", - " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00060)\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62839, 0.60200)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.59257, 0.90320)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=4\"\n", - " with 1.00000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00140)\n", - " with 0.90000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00140)\n", - " with 0.80000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00140)\n", - " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (1.00000, 0.00140)\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.63558, 0.16220)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57909, 0.87500)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=5\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62834, 0.10820)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57398, 0.87440)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=6\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.61623, 0.11240)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57273, 0.70640)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=7\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62541, 0.15360)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.57991, 0.77720)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=8\"\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.62054, 0.11120)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.55600, 0.81520)\n", - "\n", - "Privacy risk score analysis over slice: \"CLASS=9\"\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.56808, 0.68920)\n", - "\n", - "Privacy risk score analysis over slice: \"CORRECTLY_CLASSIFIED=True\"\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.53422, 0.43662)\n", - "\n", - "Privacy risk score analysis over slice: \"CORRECTLY_CLASSIFIED=False\"\n", - " with 0.70000 as the threshold on privacy risk score, the precision-recall pair is (0.71764, 0.35140)\n", - " with 0.60000 as the threshold on privacy risk score, the precision-recall pair is (0.68704, 0.64067)\n", - " with 0.50000 as the threshold on privacy risk score, the precision-recall pair is (0.64406, 0.84983)\n" - ] - } - ], - "source": [ - "# compute privacy risk scores on all given data slices\n", - "risk_score_results = mia.run_privacy_risk_score_analysis(input,\n", - " SlicingSpec(\n", - " entire_dataset = True,\n", - " by_class = True,\n", - " by_classification_correctness = True))\n", - "# print the summary of privacy risk score analysis\n", - "print(risk_score_results.summary(threshold_list=[1, 0.9, 0.8, 0.7, 0.6, 0.5]))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [], - "last_runtime": { - "build_target": "//learning/deepmind/public/tools/ml_python:ml_notebook", - "kind": "private" - }, - "name": "Membership inference privacy risk score codelab", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.10" - }, - "pycharm": { - "stem_cell": { - "cell_type": "raw", - "metadata": { - "collapsed": false - }, - "source": [] - } - } - }, - "nbformat": 4, - "nbformat_minor": 1 -}