From 84f0a4474f2edfd1c3b9cb84c9829d70711b771e Mon Sep 17 00:00:00 2001 From: Diane Adjavon Date: Wed, 24 Jul 2024 21:41:56 -0400 Subject: [PATCH] Update README overview --- README.md | 20 ++++++++++++++++---- assets/cmnist.png | Bin 0 -> 21409 bytes 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 assets/cmnist.png diff --git a/README.md b/README.md index 1f4221b..e88140d 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,25 @@ # Exercise 9: Explainable AI and Knowledge Extraction ## Overview +The goal of this exercise is to learn how to probe what a pre-trained classifier has learned about the data it was trained on. -In this exercise we will: -1. Use a gradient-based attribution method to try to find out what parts of an image contribute to its classification -2. Train a CycleGAN to create counterfactual images -3. Run a discriminative attribution from counterfactuals +We will be working with a simple example which is a fun derivation on the MNIST dataset that you will have seen in previous exercises in this course. +Unlike regular MNIST, our dataset is classified not by number, but by color! +![CMNIST](assets/cmnist.png) +In this exercise, we will return to conventional, gradient-based attribution methods to see what they can tell us about what the classifier knows. +We will see that, even for such a simple problem, there is some information that these methods do not give us. + +We will then train a generative adversarial network, or GAN, to try to create counterfactual images. +These images are modifications of the originals, which are able to fool the classifier into thinking they come from a different class!. +We will evaluate this GAN using our classifier; Is it really able to change an image's class in a meaningful way? + +Finally, we will combine the two methods — attribution and counterfactual — to get a full explanation of what exactly it is that the classifier is doing. We will likely learn whether it can teach us anything, and whether we should trust it! + +If time permits, we will try to apply this all over again as a bonus exercise to a much more complex and more biologically relevant problem. + +![synister](assets/synister.png) ## Setup Before anything else, in the super-repository called `DL-MBL-2024`: diff --git a/assets/cmnist.png b/assets/cmnist.png new file mode 100644 index 0000000000000000000000000000000000000000..a56d461826166caf9d25bdc372b43a3b0e647a64 GIT binary patch literal 21409 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