 Then, I call another function, which I've yet to define, called plot examples, which takes those lists of outcomes, one of which it says are correct, one of which it labels as incorrect, and plots them. So this may not have necessarily been, need to be a separate function, but we have here now our plot examples. So we have our list of examples, we have the label, correct or incorrect. We started counter with I example, started counting at zero, and then we have another counter, I plot. So we want to count two different things, which plot we're on, and then because there are six examples per plot, it also is helpful to know which example we're on. Even though those two are tightly related, it's just convenient to track them separately. We create a file name for the figure, which is the label, correct or incorrect, plus a number. I like to add a hundred to it to make sure that it has the same number of digits. It's visually pleasing and it sorts well when you're sorting alphabetically. Then we create the figure, and then using the layout parameters that we defined back at the beginning of the script, we add those examples one at a time, stepping through at a top level, stepping across the X, across three columns, then the next level in, stepping down two rows. After we've added all six examples, we save the figure out and close it. The closing it, by the way, is a nice little touch. It tells Python it can dump it from memory. If you don't do that, for some reason, Matplotlib seems to hang on to it. It doesn't know that you're done with it yet. Plots are memory intensive, and if you have more than a few dozen, it can really choke things up. The close is helpful if you're iteratively creating and saving plots. This addExample function that we called here, we actually define down below. This then is the next layer of detail down where we take that example, that image actual and predicted label and ordered predictions, and we spin it out visually into a full picture of what happened. We go and we add axes corresponding to the example itself. We use this function strip, which we defined below, which just cleans all of the lines and grids and ticks and labels off around it, just leaves it blank. We render the image. We add some text showing the predicted and the actual label down below. We add another plot, which we manually create a histogram showing horizontal bars associated with the strength of prediction associated with each category. Then based on whether it was the actual label, we make it green, otherwise we make it blue, and now visually, we can see when we look at this, if the long bar is blue and there's a green bar that's shorter, it means the algorithm guessed wrong. We'll skip over the details there. I just wanted to call out this addPatchPatchesPolygon construction is a really great way to turn matplotlib into a full-featured drawing program. You can draw any shapes or combination of shapes that you like. Here's this strip function that we mentioned. Pull off all of the axis spines. Pull off all of the ticks and the tick labels for a very tightly controlled, if you want to control all the lines that go onto your plot, you can do it this way. And then we're done. This then generates these examples which are so informative. I recommend one of the first things that you do is to run this report, possibly even with a larger number of examples, and just spend time looking at them. The next step that I would take with this dataset to determine what changes to make to improve the algorithm would be to fire these up and look at these examples that it got wrong and try to put myself in the mindset, imagine that I'm the algorithm, picture of what it is that I'm looking at, what I'm paying attention to and not paying attention to that causes me to get some of these right and some of these wrong. To look at the cases where I make two guesses, one of them is right, the other one just barely edges it out. Also the case is where I don't make any guesses at all hardly and one tiny guess is slightly higher than another, but either way, I'm not at all confident that it's anything. All of those give me an idea of where its strengths and weaknesses are and let me start to spin hypotheses about what I might need to pay attention to in my next iteration to do better. Also some of these are just hilarious, there's no way that I could even begin to guess what some of these are. If I can't guess it, I shouldn't expect a machine to be able to get it, that's not how machine learning works, it's not magic filling in information that I don't have, it takes things that should be easy for me but that I don't have time to do 10 million times in a row and does them there. If there are digits that just aren't readable, in my opinion it would be more helpful to report those as unreadable fallback to some other strategy but don't try to assign it a label.