From a9df99fccb419ee854464ba35fac515abbc06420 Mon Sep 17 00:00:00 2001 From: tommy Date: Wed, 16 Oct 2024 10:04:24 -0700 Subject: [PATCH 1/3] update conda env setup --- learners/setup.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/learners/setup.md b/learners/setup.md index 24397149..b31f2c70 100644 --- a/learners/setup.md +++ b/learners/setup.md @@ -91,8 +91,9 @@ Conda should already be available in your system once you installed Anaconda suc 2. Create the Conda Environment: To create a conda environment called `trustworthy_ML` with the required packages, open a terminal (Mac/Linux) or Anaconda prompt (Windows) and type the below command. This command creates a new conda environment named `trustworthy_ML` and installs the necessary packages from the `conda-forge` and `pytorch` channels. When prompted to Proceed ([y]/n) during environment setup, press y. It may take around 10-20 minutes to complete the full environment setup. Please reach out to the workshop organizers sooner rather than later to fix setup issues prior to the workshop. ```sh - conda create --name trustworthy_ML python=3.9 jupyter scikit-learn pandas matplotlib keras tensorflow pytorch torchvision umap-learn aif360 -c conda-forge + conda create --name trustworthy_ML python=3.9 pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia ``` + To install other pytorch version based on your cuda version / more detailed instructions, you can checkout https://pytorch.org/get-started/locally/. 3. Activate the Conda Environment: After creating the environment, activate it using the following command. @@ -103,7 +104,7 @@ Conda should already be available in your system once you installed Anaconda suc 4. Install `pytorch-ood`, `fairlearn`, `aif360[Reductions]`, and `aif360[inFairness]` using pip. Make sure to do this AFTER activating the environment. ```sh - pip install torchaudio + conda install jupyter scikit-learn pandas matplotlib keras tensorflow umap-learn aif360 -c conda-forge pip install pytorch-ood pip install fairlearn pip install aif360[Reductions] From 85bd43a5fc0a26da326bc35298a469c79347a22b Mon Sep 17 00:00:00 2001 From: tommy Date: Wed, 6 Nov 2024 11:35:52 -0800 Subject: [PATCH 2/3] finish 7a-OOD-detection-output-based .mdcode check --- episodes/7a-OOD-detection-output-based.md | 81 ++++++++--------------- 1 file changed, 26 insertions(+), 55 deletions(-) diff --git a/episodes/7a-OOD-detection-output-based.md b/episodes/7a-OOD-detection-output-based.md index 77004757..bc582d4a 100644 --- a/episodes/7a-OOD-detection-output-based.md +++ b/episodes/7a-OOD-detection-output-based.md @@ -121,7 +121,7 @@ def prep_ID_OOD_datasests(ID_class_labels, OOD_class_labels): test_labels = test_labels[test_filter] print(f'test_data.shape={test_data.shape}') - return ood_data, train_data, test_data, train_labels, test_labels + return train_data, test_data, ood_data, train_labels, test_labels, ood_labels def plot_data_sample(train_data, ood_data): @@ -151,11 +151,12 @@ def plot_data_sample(train_data, ood_data): ``` ```python -ood_data, train_data, test_data, train_labels, test_labels = prep_ID_OOD_datasests([0,1], [5]) +train_data, test_data, ood_data, train_labels, test_labels, ood_labels = prep_ID_OOD_datasests([0,1], [5]) fig = plot_data_sample(train_data, ood_data) fig.savefig('../images/OOD-detection_image-data-preview.png', dpi=300, bbox_inches='tight') plt.show() + ``` ![Preview of image dataset](https://raw.githubusercontent.com/carpentries-incubator/fair-explainable-ml/main/images/OOD-detection_image-data-preview.png) @@ -532,7 +533,7 @@ In this example, we will train a CNN model on the FashionMNIST dataset. We will We'll start by fresh by loading our data again. This time, let's treat all remaining classes in the MNIST fashion dataset as OOD. This should yield a more robust model that is more reliable when presented with all kinds of data. ```python -ood_data, train_data, test_data = prep_ID_OOD_datasests([0,1], list(range(2,10))) # use remaining 8 classes in dataset as OOD +train_data, test_data, ood_data, train_labels, test_labels, ood_labels = prep_ID_OOD_datasests([0,1], list(range(2,10))) # use remaining 8 classes in dataset as OOD fig = plot_data_sample(train_data, ood_data) fig.savefig('../images/OOD-detection_image-data-preview.png', dpi=300, bbox_inches='tight') plt.show() @@ -571,6 +572,7 @@ if plot_umap: umap_ood = umap_results[len(train_data_flat):] ``` +The warning message indicates that UMAP has overridden the n_jobs parameter to 1 due to the random_state being set. This behavior ensures reproducibility by using a single job. If you want to avoid the warning and still use parallelism, you can remove the random_state parameter. However, removing random_state will mean that the results might not be reproducible. ```python if plot_umap: umap_alpha = .02 @@ -655,7 +657,6 @@ def train_model(model, train_loader, criterion, optimizer, epochs=5): train_model(model, train_loader, criterion, optimizer) ``` -The warning message indicates that UMAP has overridden the n_jobs parameter to 1 due to the random_state being set. This behavior ensures reproducibility by using a single job. If you want to avoid the warning and still use parallelism, you can remove the random_state parameter. However, removing random_state will mean that the results might not be reproducible. ```python from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay @@ -691,7 +692,7 @@ plot_confusion_matrix(test_labels, test_predictions, "Confusion Matrix for Test # Evaluate on OOD data ood_labels, ood_predictions = evaluate_model(model, ood_loader, device) -plot_confusion_matrix(ood_labels, ood_predictions, "Confusion Matrix for Test Data") +plot_confusion_matrix(ood_labels, ood_predictions, "Confusion Matrix for OOD Data") ``` ```python @@ -840,6 +841,7 @@ plt.show() ``` ```python + import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import precision_recall_fscore_support, accuracy_score, confusion_matrix, ConfusionMatrixDisplay @@ -877,7 +879,10 @@ def evaluate_ood_detection(id_scores, ood_scores, id_true_labels, id_predictions f1_scores = [] # True labels for OOD data (since they are not part of the original labels) - ood_true_labels = np.full(len(ood_scores), -1) + if score_type == "energy": + ood_true_labels = np.full(len(ood_scores), -1) + else: + ood_true_labels = np.full(len(ood_scores[:,0]), -1) for threshold in thresholds: # Classify OOD examples based on scores @@ -885,8 +890,8 @@ def evaluate_ood_detection(id_scores, ood_scores, id_true_labels, id_predictions ood_classifications = np.where(ood_scores >= threshold, -1, ood_predictions) id_classifications = np.where(id_scores >= threshold, -1, id_predictions) elif score_type == 'softmax': - ood_classifications = np.where(ood_scores <= threshold, -1, ood_predictions) - id_classifications = np.where(id_scores <= threshold, -1, id_predictions) + ood_classifications = np.where(ood_scores[:,0] <= threshold, -1, ood_predictions) + id_classifications = np.where(id_scores[:,0] <= threshold, -1, id_predictions) else: raise ValueError("Invalid score_type. Use 'energy' or 'softmax'.") @@ -935,29 +940,31 @@ def evaluate_ood_detection(id_scores, ood_scores, id_true_labels, id_predictions plt.show() # plot confusion matrix - # Threshold value for the energy score upper_threshold = best_f1_threshold # Using the best F1 threshold from the previous calculation - - # Classifying OOD examples based on energy scores - ood_classifications = np.where(ood_energy_scores >= upper_threshold, -1, # classified as OOD + if score_type == 'energy': + # Classifying OOD examples based on energy scores + ood_classifications = np.where(ood_energy_scores >= upper_threshold, -1, # classified as OOD np.where(ood_energy_scores < upper_threshold, 0, -1)) # classified as ID - - # Classifying ID examples based on energy scores - id_classifications = np.where(id_energy_scores >= upper_threshold, -1, # classified as OOD + # Classifying ID examples based on energy scores + id_classifications = np.where(id_energy_scores >= upper_threshold, -1, # classified as OOD np.where(id_energy_scores < upper_threshold, id_true_labels, -1)) # classified as ID + elif score_type == 'softmax': + # Classifying OOD examples based on softmax scores + ood_classifications = softmax_thresh_classifications(ood_scores, upper_threshold) + # Classifying ID examples based on softmax scores + id_classifications = softmax_thresh_classifications(id_scores, upper_threshold) # Combine OOD and ID classifications and true labels all_predictions = np.concatenate([ood_classifications, id_classifications]) all_true_labels = np.concatenate([ood_true_labels, id_true_labels]) - # Confusion matrix cm = confusion_matrix(all_true_labels, all_predictions, labels=[0, 1, -1]) # Plotting the confusion matrix disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=["Shirt", "Pants", "OOD"]) disp.plot(cmap=plt.cm.Blues) - plt.title('Confusion Matrix for OOD and ID Classification (Energy-Based)') + plt.title(f'Confusion Matrix for OOD and ID Classification ({score_type.capitalize()}-Based)') plt.show() @@ -965,44 +972,8 @@ def evaluate_ood_detection(id_scores, ood_scores, id_true_labels, id_predictions # Example usage # Assuming id_energy_scores, ood_energy_scores, id_true_labels, and test_labels are already defined -best_f1_threshold, best_precision_threshold, best_recall_threshold = evaluate_ood_detection(id_energy_scores, ood_energy_scores, id_true_labels, test_labels, score_type='energy') -best_f1_threshold, best_precision_threshold, best_recall_threshold = evaluate_ood_detection(id_softmax_scores[:,0], ood_softmax_scores[:,0], id_true_labels, test_labels, score_type='softmax') - -``` -```python -ood_softmax_scores[:,0].shape -``` -```python - -``` -```python -import numpy as np -import matplotlib.pyplot as plt -from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay - -# Threshold value for the energy score -upper_threshold = best_f1_threshold # Using the best F1 threshold from the previous calculation - -# Classifying OOD examples based on energy scores -ood_classifications = np.where(ood_energy_scores >= upper_threshold, -1, # classified as OOD - np.where(ood_energy_scores < upper_threshold, 0, -1)) # classified as ID - -# Classifying ID examples based on energy scores -id_classifications = np.where(id_energy_scores >= upper_threshold, -1, # classified as OOD - np.where(id_energy_scores < upper_threshold, id_true_labels, -1)) # classified as ID - -# Combine OOD and ID classifications and true labels -all_predictions = np.concatenate([ood_classifications, id_classifications]) -all_true_labels = np.concatenate([ood_true_labels, id_true_labels]) - -# Confusion matrix -cm = confusion_matrix(all_true_labels, all_predictions, labels=[0, 1, -1]) - -# Plotting the confusion matrix -disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=["Shirt", "Pants", "OOD"]) -disp.plot(cmap=plt.cm.Blues) -plt.title('Confusion Matrix for OOD and ID Classification (Energy-Based)') -plt.show() +best_f1_threshold, best_precision_threshold, best_recall_threshold = evaluate_ood_detection(id_energy_scores, ood_energy_scores, test_labels, test_predictions, ood_predictions, score_type='energy') +best_f1_threshold, best_precision_threshold, best_recall_threshold = evaluate_ood_detection(id_softmax_scores, ood_softmax_scores, test_labels, test_predictions, ood_predictions, score_type='softmax') ``` # Limitations of our approach thus far From ef9d5ecca1255bcff669b75417b4001410965aa8 Mon Sep 17 00:00:00 2001 From: tommy Date: Wed, 6 Nov 2024 11:49:50 -0800 Subject: [PATCH 3/3] update OOD-detection_image-data-preview.png --- images/OOD-detection_image-data-preview.png | Bin 40364 -> 34776 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/OOD-detection_image-data-preview.png b/images/OOD-detection_image-data-preview.png index fcf84e6ab30c255ddc749c49f7dbe522b52ef4fa..eeae2213dececa6af84f7d4ab17bf717e8b9cd3f 100644 GIT binary patch literal 34776 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 literal 40364 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