Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save manisnesan/3e00b73e24f88905b7402b4e7ab68018 to your computer and use it in GitHub Desktop.
Save manisnesan/3e00b73e24f88905b7402b4e7ab68018 to your computer and use it in GitHub Desktop.
2020-12-15-PseudoLabelingDataCleaning.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"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.8.5"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"colab": {
"name": "2020-12-15-PseudoLabelingDataCleaning.ipynb",
"provenance": [],
"include_colab_link": true
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/manisnesan/3e00b73e24f88905b7402b4e7ab68018/2020-12-15-pseudolabelingdatacleaning.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Z7VRTKCeh47i",
"outputId": "0f54b0c9-cfb5-4011-e8f9-2536a5398970"
},
"source": [
"!pip install fastai -q --upgrade"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"\u001b[?25l\r\u001b[K |█▊ | 10kB 28.6MB/s eta 0:00:01\r\u001b[K |███▍ | 20kB 36.1MB/s eta 0:00:01\r\u001b[K |█████ | 30kB 22.7MB/s eta 0:00:01\r\u001b[K |██████▊ | 40kB 26.0MB/s eta 0:00:01\r\u001b[K |████████▌ | 51kB 24.8MB/s eta 0:00:01\r\u001b[K |██████████▏ | 61kB 27.3MB/s eta 0:00:01\r\u001b[K |███████████▉ | 71kB 18.2MB/s eta 0:00:01\r\u001b[K |█████████████▌ | 81kB 19.3MB/s eta 0:00:01\r\u001b[K |███████████████▏ | 92kB 18.1MB/s eta 0:00:01\r\u001b[K |█████████████████ | 102kB 18.5MB/s eta 0:00:01\r\u001b[K |██████████████████▋ | 112kB 18.5MB/s eta 0:00:01\r\u001b[K |████████████████████▎ | 122kB 18.5MB/s eta 0:00:01\r\u001b[K |██████████████████████ | 133kB 18.5MB/s eta 0:00:01\r\u001b[K |███████████████████████▊ | 143kB 18.5MB/s eta 0:00:01\r\u001b[K |█████████████████████████▍ | 153kB 18.5MB/s eta 0:00:01\r\u001b[K |███████████████████████████ | 163kB 18.5MB/s eta 0:00:01\r\u001b[K |████████████████████████████▊ | 174kB 18.5MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▍ | 184kB 18.5MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 194kB 18.5MB/s \n",
"\u001b[K |████████████████████████████████| 61kB 8.1MB/s \n",
"\u001b[K |████████████████████████████████| 12.8MB 243kB/s \n",
"\u001b[K |████████████████████████████████| 776.8MB 24kB/s \n",
"\u001b[31mERROR: torchtext 0.9.1 has requirement torch==1.8.1, but you'll have torch 1.7.1 which is incompatible.\u001b[0m\n",
"\u001b[?25h"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true,
"id": "-EfkT2ZwWsSh"
},
"source": [
"# Pseudo Labeling for Data Cleaning\n",
"\n",
"> Pseudo Labeling basics for Noise Reduction and Data Creation\n",
"\n",
"- toc: true \n",
"- badges: true\n",
"- comments: true\n",
"- author: Isaac Flath\n",
"- categories: [Neural Networks, Noisy Data]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "r-F0GdiTWsSi"
},
"source": [
"# Intro\n",
"\n",
"**Goal:** The goal of this article is to provide an understanding of what pseudo labeling is, why you might use it, and how you would go about using it.\n",
"\n",
"**What's Included in this post:** The information needed to get **started** on pseudo labeling on your project."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nFC7wMwcWsSj"
},
"source": [
"# What is pseudo labeling\n",
"\n",
"**Pseudo Labeling** is the process of creating new labels for a piece of data.\n",
"\n",
"The general idea can be broken into a few steps:\n",
"1. Create a model\n",
"1. Make predictions on some data with that model\n",
"1. Pretend all (or some) of those predictions are ground truth label\n",
"1. Train a new model with those predictions\n",
"\n",
"We will get into more of the details in the how-to section!"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1BCnnOq_WsSj"
},
"source": [
"# Why would I use pseudo labeling?\n",
"\n",
"There are two main functions pseudo Labeling can be used for. I will step through each and provide a general \n",
"\n",
"## Data Cleaning & Noise Reduction\n",
"\n",
"Imagine you have a dataset and all the samples have been hand labeled. You know they can't all be labeled appropriately because it was manual labeling and you want to improve your labels. You have a few options:\n",
"\n",
"1. Go through every datapoint again and manually verify them all\n",
"1. Somehow identify the ones that are likely to be wrong and put more focus on those ones.\n",
"\n",
"Pseudo labeling can help with option number 2. By creating a prediction on a datapoint, you can see which labels the model disagrees with. Even better, you can look at the confidence that model has in the prediction. So by looking at datapoints that the model is confident are wrong, you can really narrow your focus on your problem areas quickly.\n",
"\n",
"You then can fix it in 2 ways:\n",
"1. Replace your labels with the predicted labels following some threshold (ie score of .9 or higher).\n",
"1. Manually re-classify these labels if you have the time and domain expertise to do these.\n",
"\n",
"## Data Augmentation\n",
"\n",
"This approach can also be used on unlabeled data. Rather than trying to replace bad labels, this approach focuses on creating labels for unlabeled data. This can be used on a kaggle test set for example. The reason this can work is because you are teaching the model the structure of the data. Even if not all labels are correct, a lot can still be learning.\n",
"\n",
"Think about if you were to learn what a new type of object looks like. Maybe a type of furniture you'd never heard of before. Doing a google image search for that name and looking at all the results is really helpful, even if not all of the images that are shown are all correct.\n",
"\n",
">Note: I found out about this Approach from Jeremy Howard. He speaks on this in an old version of the fastai course. [Here](https://medium.com/deep-learning-journals/faster-ai-lesson-4-tl-dr-version-of-fast-ai-part-1-70124cacd560) is a summary that includes a link to the portion of the old course he discusses this approach in. I would highly reccomend checking out the latest course as well [here](https://course.fast.ai/)."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lTq5SXvrWsSl"
},
"source": [
"# How to use pseudo labeling (Noise Reduction)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "geed5VIUWsSl"
},
"source": [
"I will use the validation set for this example because it is a little bit more involved. You can simplify this approach a bit if you are doing this on unlabeled data."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "gLOgd7rFWsSl"
},
"source": [
"## Imports"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"id": "rKyXQUXjWsSm",
"outputId": "70e6bf70-4aed-49cf-9958-4199893c1025"
},
"source": [
"from fastai.vision.all import *\n",
"path = untar_data(URLs.MNIST,force_download=True)\n",
"from sklearn.model_selection import StratifiedKFold\n",
"from numpy.random import default_rng"
],
"execution_count": 2,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
""
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zXtWDhFhWsSn"
},
"source": [
"## Introduce Noise to Data"
]
},
{
"cell_type": "code",
"metadata": {
"id": "5Stjx1xTWsSn"
},
"source": [
"x = get_image_files(path)\n",
"y = L(parent_label(o) for o in get_image_files(path))"
],
"execution_count": 3,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "j3g8wnuHWsSo"
},
"source": [
"Get 10% of the indexes to randomly change"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "2Lrk11TTWsSo",
"outputId": "f2780fed-b4cb-4544-b02b-1e318effb512"
},
"source": [
"n = len(x)\n",
"rng = default_rng()\n",
"\n",
"noise_idxs = rng.choice(n, size=round(n*0.1), replace=False)\n",
"len(noise_idxs),noise_idxs[:5]"
],
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(7000, array([ 5762, 14139, 24359, 19364, 2427]))"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pYcrrRrBWsSp"
},
"source": [
"Randomly change these so we have some bad labels"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ExJFRqkMWsSp"
},
"source": [
"for i in range(0,len(noise_idxs)):\n",
" old_path = str(x[noise_idxs[i]])\n",
" \n",
" if 'training' in old_path:\n",
" new_path = str(x[noise_idxs[i]])[:49]+f'{np.random.randint(0,10)}'+str(x[noise_idxs[i]])[50:]\n",
" elif 'testing' in old_path:\n",
" new_path = str(x[noise_idxs[i]])[:48]+f'{np.random.randint(0,10)}'+str(x[noise_idxs[i]])[49:]\n",
" \n",
" os.system(f'mv {old_path} {new_path}')\n"
],
"execution_count": 5,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "0B2_DRQZWsSq"
},
"source": [
"## Look at Data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "q8fV349RWsSq"
},
"source": [
"Some of our labels are now misclassified, but we don't know which ones. We could look at every image to find them, but that would take a ton of time. Let's try to find the misclassified images and correct them using a pseudo labeling approach."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 373
},
"id": "AruwBqrNWsSq",
"outputId": "76f61763-8055-4b60-91e3-949d23746ca5"
},
"source": [
"mnist = DataBlock(blocks=(ImageBlock(cls=PILImageBW), CategoryBlock), \n",
" get_items=get_image_files, \n",
" splitter=RandomSplitter(),\n",
" get_y=parent_label)\n",
"dls = mnist.dataloaders(path,bs=16)\n",
"dls.show_batch(max_n=36,figsize=(6,6))"
],
"execution_count": 6,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 16 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "G_ICl323WsSr"
},
"source": [
"## Create Crossfold, Train, and Predict\n",
"\n",
"This step is much simpler if you are generating labels for the test set, as you would train your model as normal and predict as normal. The reason I am doing cross folds is to get predicted labels on the training set.\n",
"\n",
">Note: I am doing this with a 2 fold, but you may want to use a 5-fold or more folds.\n",
"\n",
"This cross-fold code was mostly supplied by [Zach Mueller](https://twitter.com/TheZachMueller), with minor modifications by me for this dataset and tutorial. There is also a tutorial he wrote with more details [here](https://github.com/muellerzr/Practical-Deep-Learning-for-Coders-2.0/blob/master/Computer%20Vision/03_Cross_Validation.ipynb)"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 374
},
"id": "IrAVoaJcWsSs",
"outputId": "2faf7e9d-5f30-4113-e725-05a4ceab1187"
},
"source": [
"skf = StratifiedKFold(n_splits=2, shuffle=True, random_state=1)\n",
"splits, preds, targs, preds_c, items = [],[],[],[], []\n",
"\n",
"for _, val_idx in skf.split(x,y):\n",
" splitter = IndexSplitter(val_idx)\n",
" splits.append(val_idx)\n",
"\n",
" mnist = DataBlock(blocks=(ImageBlock(cls=PILImageBW), CategoryBlock), \n",
" get_items=get_image_files, \n",
" splitter=splitter,\n",
" get_y=parent_label)\n",
"\n",
" dls = mnist.dataloaders(path,bs=16)\n",
" learn = cnn_learner(dls,resnet18,metrics=accuracy)\n",
" learn.fine_tune(2,reset_opt=True)\n",
" \n",
" # store predictions\n",
" p, t, c = learn.get_preds(ds_idx=1,with_decoded=True)\n",
" preds.append(p); targs.append(t); preds_c.append(c); items.append(dls.valid.items)"
],
"execution_count": 7,
"outputs": [
{
"output_type": "error",
"ename": "IndexError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-7-bc9e9c824e12>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 11\u001b[0m get_y=parent_label)\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mdls\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmnist\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdataloaders\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mbs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m16\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 14\u001b[0m \u001b[0mlearn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcnn_learner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdls\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mresnet18\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mmetrics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maccuracy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mlearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfine_tune\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mreset_opt\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/data/block.py\u001b[0m in \u001b[0;36mdataloaders\u001b[0;34m(self, source, path, verbose, **kwargs)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[0mdsets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatasets\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msource\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mverbose\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdls_kwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'verbose'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdsets\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdataloaders\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mafter_item\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitem_tfms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mafter_batch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbatch_tfms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m _docs = dict(new=\"Create a new `DataBlock` with other `item_tfms` and `batch_tfms`\",\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/data/core.py\u001b[0m in \u001b[0;36mdataloaders\u001b[0;34m(self, bs, shuffle_train, shuffle, val_shuffle, n, path, dl_type, dl_kwargs, device, drop_last, val_bs, **kwargs)\u001b[0m\n\u001b[1;32m 235\u001b[0m \u001b[0mdef_kwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'bs'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mbs\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mval_bs\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mval_bs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'shuffle'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mval_shuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'n'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'drop_last'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 236\u001b[0m dls = [dl] + [dl.new(self.subset(i), **merge(kwargs,def_kwargs,val_kwargs,dl_kwargs[i]))\n\u001b[0;32m--> 237\u001b[0;31m for i in range(1, self.n_subsets)]\n\u001b[0m\u001b[1;32m 238\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dbunch_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mdls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdevice\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/data/core.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 235\u001b[0m \u001b[0mdef_kwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'bs'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mbs\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mval_bs\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mval_bs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'shuffle'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mval_shuffle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'n'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'drop_last'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 236\u001b[0m dls = [dl] + [dl.new(self.subset(i), **merge(kwargs,def_kwargs,val_kwargs,dl_kwargs[i]))\n\u001b[0;32m--> 237\u001b[0;31m for i in range(1, self.n_subsets)]\n\u001b[0m\u001b[1;32m 238\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dbunch_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mdls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdevice\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/data/core.py\u001b[0m in \u001b[0;36msubset\u001b[0;34m(self, i)\u001b[0m\n\u001b[1;32m 342\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__repr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mcoll_repr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 343\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfull\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfull\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfull\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mo_\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtl\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtuplify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 344\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0msubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtls\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtl\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_inp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_inp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 345\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_new\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mitems\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_new\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtfms\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtfms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdo_setup\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 346\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0moverlapping_splits\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtls\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moverlapping_splits\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastcore/foundation.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(cls, x, *args, **kwargs)\u001b[0m\n\u001b[1;32m 95\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0margs\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 97\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 98\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[0;31m# Cell\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastcore/foundation.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, items, use_list, match, *rest)\u001b[0m\n\u001b[1;32m 103\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mitems\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mrest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muse_list\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0muse_list\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mis_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 105\u001b[0;31m \u001b[0mitems\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlistify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mrest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muse_list\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0muse_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmatch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 106\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastcore/basics.py\u001b[0m in \u001b[0;36mlistify\u001b[0;34m(o, use_list, match, *rest)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mis_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 56\u001b[0;31m \u001b[0;32melif\u001b[0m \u001b[0mis_iter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 57\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmatch\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/data/core.py\u001b[0m in \u001b[0;36m<genexpr>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 342\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__repr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mcoll_repr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 343\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfull\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfull\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfull\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mo_\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtl\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mtuplify\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 344\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0msubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtls\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtl\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_inp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_inp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 345\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_new\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mitems\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_new\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtfms\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtfms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdo_setup\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 346\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0moverlapping_splits\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtls\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moverlapping_splits\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/data/core.py\u001b[0m in \u001b[0;36msubset\u001b[0;34m(self, i)\u001b[0m\n\u001b[1;32m 260\u001b[0m \u001b[0msplit_idx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mifnone\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msplit_idx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit_idx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 261\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_new\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtfms\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtfms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdo_setup\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtypes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtypes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msplit_idx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msplit_idx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 262\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0msubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_new\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplits\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msplit_idx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 263\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_after_item\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtfms\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 264\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__repr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34mf\"{self.__class__.__name__}: {self.items}\\ntfms - {self.tfms.fs}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastcore/foundation.py\u001b[0m in \u001b[0;36m_get\u001b[0;34m(self, i)\u001b[0m\n\u001b[1;32m 117\u001b[0m return (self.items.iloc[list(i)] if hasattr(self.items,'iloc')\n\u001b[1;32m 118\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'__array__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 119\u001b[0;31m else [self.items[i_] for i_ in i])\n\u001b[0m\u001b[1;32m 120\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 121\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__setitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastcore/foundation.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 117\u001b[0m return (self.items.iloc[list(i)] if hasattr(self.items,'iloc')\n\u001b[1;32m 118\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'__array__'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 119\u001b[0;31m else [self.items[i_] for i_ in i])\n\u001b[0m\u001b[1;32m 120\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 121\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__setitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mIndexError\u001b[0m: list index out of range"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EOMB-6ipWsSt"
},
"source": [
"## Look at Predictions\n",
"\n",
"Lets throw it all in a dataframe so we can look at what we have a little easier. First, let's break out our differnt pieces of information."
]
},
{
"cell_type": "code",
"metadata": {
"id": "1GekdN6EWsSt"
},
"source": [
"items_flat = L(itertools.chain.from_iterable(items))\n",
"imgs = L(o for o in items_flat)\n",
"y_true = L(int(parent_label(o)) for o in items_flat) # Labels from dataset\n",
"y_targ = L(int(o) for o in torch.cat(targs)) # Labels from out predictions\n",
"y_pred = L(int(o) for o in torch.cat(preds_c)) # predicted labels or \"pseudo labels\"\n",
"p_max = torch.cat(preds).max(dim=1)[0] # max model score for row"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "iZukZteHWsSu"
},
"source": [
"We can double check we are matching things upp correctly by checking that the labels line up from the predictions and the original data. Throwing some simple assert statements in is nice because it takes no time and it will let you know if you screw something up later as you are tinkering with things."
]
},
{
"cell_type": "code",
"metadata": {
"id": "SveIkQBFWsSu"
},
"source": [
"assert (y_true == y_targ) # test we matched these up correct"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Wt0F6j5uWsSv"
},
"source": [
"Put it in a dataframe and see what we have."
]
},
{
"cell_type": "code",
"metadata": {
"id": "XLrPnGRRWsSv",
"outputId": "25833c9f-fe8e-43d9-bb93-05d0b881d7bd"
},
"source": [
"res = pd.DataFrame({'imgs':imgs,'y_true':y_true,'y_pred':y_pred,'p_max':p_max})\n",
"res.head(5)"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>imgs</th>\n",
" <th>y_true</th>\n",
" <th>y_pred</th>\n",
" <th>p_max</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>/home/isaacflath/.fastai/data/mnist_png/testing/1/8418.png</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0.864995</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>/home/isaacflath/.fastai/data/mnist_png/testing/1/2888.png</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" <td>0.900654</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>/home/isaacflath/.fastai/data/mnist_png/testing/1/6482.png</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0.906335</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>/home/isaacflath/.fastai/data/mnist_png/testing/1/7582.png</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0.902999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>/home/isaacflath/.fastai/data/mnist_png/testing/1/4232.png</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0.925955</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" imgs y_true y_pred \\\n",
"0 /home/isaacflath/.fastai/data/mnist_png/testing/1/8418.png 1 1 \n",
"1 /home/isaacflath/.fastai/data/mnist_png/testing/1/2888.png 1 7 \n",
"2 /home/isaacflath/.fastai/data/mnist_png/testing/1/6482.png 1 1 \n",
"3 /home/isaacflath/.fastai/data/mnist_png/testing/1/7582.png 1 1 \n",
"4 /home/isaacflath/.fastai/data/mnist_png/testing/1/4232.png 1 1 \n",
"\n",
" p_max \n",
"0 0.864995 \n",
"1 0.900654 \n",
"2 0.906335 \n",
"3 0.902999 \n",
"4 0.925955 "
]
},
"metadata": {
"tags": []
},
"execution_count": 9
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-8pmILwOWsSw"
},
"source": [
"Perfect so lets get a list of our images our model got 'wrong' and grab some random ones out of the top 5000 the model was most confident about. The theory is that many of these may be misclassified, and we can reclassify them either using the predicted 'pseudo' labels, or with manual classification."
]
},
{
"cell_type": "code",
"metadata": {
"id": "IxqdLPHpWsSw"
},
"source": [
"imgs = res[res.y_true != res.y_pred].sort_values('p_max',ascending=False)[:5000].sample(frac=1)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "DA1MVbX1WsSx"
},
"source": [
"And then we plot them and see our predicted labels of these are WAY better than the actual labels. A great way to identify some bad labels."
]
},
{
"cell_type": "code",
"metadata": {
"id": "4Fn1gtXKWsSx",
"outputId": "4b80eee0-608e-42db-b012-5deda881a900"
},
"source": [
"%matplotlib inline\n",
"fig, ax = plt.subplots(5,5,figsize=(10,10))\n",
"\n",
"for row in range(0,5):\n",
" for col in range(0,5):\n",
" img_path1 = imgs.iloc[row*4+col,0]\n",
" img_path1 = np.array(Image.open(img_path1))\n",
" ax[row,col].imshow(img_path1,cmap='Greys')\n",
" ax[row,col].set_title(f'Label:{parent_label(imgs.iloc[row*4+col,0])} | Pred:{imgs.iloc[row*4+col,2]}')\n",
" ax[row,col].get_xaxis().set_visible(False)\n",
" ax[row,col].get_yaxis().set_visible(False)"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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vryOjzjiCGuf9z6NxRxzGzS29BAREVEksNJDREREkRBq95Y53TynrqQ777zT1/N6V382p8ub5502bZqv5yXKD8xm9SOPPDKUPHi7xlesWKHjK664IsW5yZ/MqelXXnmljnfs2BHzNYcddpiOv//+e2tfhQoV/MscpaV///3X2t65c2dcrzNXgg4aW3qIiIgoEljpISIiokgItXvr8ssvzzYOWu3atRPaR+nH+4C7LVu26JjN6cEwZ2+Z3UoAUKdOncDOa678evvtt1v7zIebNm3aNLA85GfmivMAMHDgQB3//vvvMV9nPrTSnDV0+OGH+5i7/M1cyTisLuNEmQ8ZfuCBB+J6jff+LV26tK95yglbeoiIiCgSWOkhIiKiSGClh4iIiCIh1DE9YcnpKes5Pamd0o93+izH9ATPHNNjrtQL+D+mZ9euXTo+99xzdVytWjUr3aOPPqrjQoUi+bGWEHPF3Ndff93a9/nnn2f7mvvvv9/aNp/U3bVrVx9zFx1FixbV8dq1a619H374oY4vueQSHXtXG/eu0JwqH330kY6fffbZuF5jruIMACLia55ywpYeIiIiigRWeoiIiCgSItkO7H1IoslcJZrS3z///GNtm10vlHotWrRI6vV//fWXtT106FAdf/PNNzp+8cUXrXR8gGV8vPfHNddco+MJEyZY+8wuh/r16+vYu3ouf/fJM6esn3322THTXXvttTquW7eute/LL7/UsbkydhAmTZqk42HDhsX1mu7du+v4pptu8jlH8WNLDxEREUUCKz1EREQUCZHp3pozZ07YWaAAmLNPAGDhwoU6Npt/ixcvnrI8Rdl7772nY3MmjznDB7BX0p47d66O+/fvb6UzV2E2V23v0aNH8pmNoOuvv97anjhxYsy0VapU0fGsWbN0zO4s/5mzFOO1bNkya/vUU0/V8eTJk6195udfvXr1Yh7TnI1pdid7j/fGG2/o2FyR2cucQfvQQw/puEiRIjFfEzS29BAREVEksNJDREREkcBKDxEREUVCZMb0zJ49O+wsUBLMqbVDhgyJmc6cFlmsWDEdX3zxxcFkLILKlCmj41GjRln7zDE5DRo00HHJkiWtdN6xWFlq1qxpbZtjCZo3b67jggUL5iLH0fbHH3/o+K233or7deYK2KVKlfI1T2Tr0KGDjn/88UdrX/v27XW8atWqmMcwl2Jp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Ais9REREFAms9BAREVEksNJDREREkZCrZ28RBWnbtm06/uKLL6x9t99+u44zMzN1PHXqVCvdySefHEzmKCkvvviitf3BBx9km+6bb76xtnv16qXjfv366fiwww7zMXfkl3bt2um4YMGC1r5YZU6USmzpISIiokhgpYeIiIgigZUeIiIiioS0GdPz999/W9vjx4/X8Y4dO2K+btOmTTp+6KGHYqZTSulYRBLJIurUqaNjc+xBxYoVEzoeATt37tRxkyZNdLx8+XIrXazyO/XUU610hx9+uI4PHDig40GDBlnpunfvruPSpUvnNtsUh40bN+r4lltusfa1adNGx8cee6yOhw8fbqV78803dVyvXj0dP/roo1Y6c+wPhce8N6dNm2bt++mnn3RsljlRKrGlh4iIiCKBlR4iIiKKhFC7t5YuXarjFi1aWPvMbqt45dRtlWiXlsnscjHzO3/+fCtdiRIlkj5XVGzevFnH3i4tU8uWLXXcoUMHHS9atMhKN3PmTB2bU+DN6c6A3T3y9ttv67hRo0aHzjQlrU+fPjo+99xzY6Y77rjjdGx2UbZv395KN3fuXB0/88wzOi5cuHBS+aTEmV3S2W1T7q1bt07HjRs3tvaZ94f38y5VPv/8c2t77NixOjbvy+LFi6cqSwdhSw8RERFFAis9REREFAmhdm+tWrVKx7t37076eGXKlIm5r0GDBjouWbKktW/JkiXZ5iknv//+u469M8/YvRWbOVsLADp27JhtumOOOcba9jabxmP9+vU6fv311619t912m44vvPBCHf/www9WuvLly+f6vOQwV002Z+YlyryvvKv7nn766ToePXq0jvv27Zv0eckfd911l44nT54cYk7yLrO7yPx8A4AJEybo2JydCgDlypULMlta//79rW1z6EeRIkV0/Nxzz6UkP9lhSw8RERFFAis9REREFAms9BAREVEkhDqmp3Xr1jo2V+sEgD179uT6eN6xOqbKlSvr2OxbBICGDRvm+lzmCrNc0Td+3333nbW9YMECHVevXl3HP//8c9LnqlKlio69KwJv375dx+YqwNdff72Vzuwnp8SZK2UDwEcffaTjnKasx+IdNzdq1Cgdm+MKOKYnfeS0sj7FZo4ZzWnMqbkC+t69ewPNk8lcGiSnMn7nnXd0zDE9RERERAFjpYeIiIgiIW0eOFqrVq1Aj79161Ydm1OUAWDx4sVxHcPsIrn//vt1zFVfc2Y2zw4YMMDaZ66U/fLLL6csT0cddVS2efBj5W46WNeuXa3tyy67TMdDhgzRcaVKlRI6vvkwYLPL9MUXX7TS9e7dO6HjU/LuvvvusLOQJ61evVrH5nIMXjfeeKOOE72PEmFOozeXf0lXbOkhIiKiSGClh4iIiCKBlR4iIiKKhLQZ0xOEb775RsfmU51zmg5tPsriiy++sPaZj0YoVChf/+p8ZT4B2/tE+hNOOEHH5qMEKH/xTks3l5d44okndGwuH+Bljm3wTnmdOnWqjs2neZtPaadwlS1bNuws5EmdO3cOOwsHWbt2rY5zumdN3kcLhYUtPURERBQJrPQQERFRJOSJPhqzuRoAfvzxRx2bT1t+8MEHrXTmqs4HDhyI61xPP/20juvXr2/tK1iwYFzHIJv3idgm8+nbqZz6f8YZZ6TsXHSwXr166di7Gnssf/zxh469yxuYT5x+/PHHddysWbNEs0hx2r17t47XrVsXYk7yp5xWYQ6LueLzli1b4npNKpckyQlbeoiIiCgSWOkhIiKiSEib7i3vA9LMGVbe7pGhQ4cGlo8rrrhCx7fddpu17//+7/+yTVe1alUrXYEC0a5L/vnnn9b2I488EjOt+XtMJfMBtCeffLKOJ06caKV74YUXdJzTA20pd/r166fjevXq6di7Wvqxxx6rY3MVdPNhsoC9wrO5OjMFb+nSpTpeuHBhiDnJH8whFkDsh3h6h19cddVVgeUpP4n2tzMRERFFBis9REREFAms9BAREVEkpM2YHnPVXgBo1apVOBkxmNNgAeCOO+7INn7jjTesdJ06dQo2Y2nu888/t7bNJ5d7V8g95ZRTUpInL3N6vDkG5Ntvvw0jO5Fjjs8xTZkyxdo2x/OtXLlSx+bK6QBX+01H5cuXt7a9ZUbZM5dmAID9+/dnm27Xrl3W9ubNm3VcunRp/zOWT7Clh4iIiCKBlR4iIiKKhLTp3kpUiRIldNy6dWtrX+/evXW8adMmHb/33nsxj7dgwQIde6dexzJ48GBr+/zzz9dxkSJF4jpGVDRo0MDa5u8n/9q+fbuOb731VmvfzJkzdWyuyv3rr79a6apVq6bjGjVq+J1FCtCpp55qbdeqVSuknOQt3qVSxo0bp2OzC8t8AC8AtG3bVscnnnhiQLk7OB/xGjRokI69Q0JS+bQDtvQQERFRJLDSQ0RERJGQNt1bJ510krX91ltv6di7InO7du103Lx5cx1Xr149rnP17Nkz5r6tW7fqeMmSJda+iy66SMfmzK5ly5ZZ6cwZKBdffHFceSLKb8wVY81uKsB+aLDZRb1o0SIrndlM/+KLL+rY7Lomyk+8q43/8ssvOj777LN17F39+vfff882ThfvvPOOjgcOHGjtGzlyZMrywZYeIiIiigRWeoiIiCgSWOkhIiKiSEibMT1mvz4AdOzYMds4aOYqokcccYS1b/fu3XEdw1w5lgClVLZxmP7++28df/XVVzpu2rSplY5T6nNmTksH7HE8//vf/3RsPq0eOPh+z+JdsXv06NE6vvPOO3XcuXNnKx1XZE4P6XJ/5yeHHXaYjs3xrd6V77t165ayPCWiVKlSOv6///u/0PLBlh4iIiKKBFZ6iIiIKBLSpnsrHf3777/W9s6dO+N6HafT2swHjppxmH777Tcdmytvn3baaVY688GkdDDvSssbN27U8WuvvZb08c176ZprrtGxd7ru6aefnvS5KHnpcn/nV+ayLF26dLH2XXrppToePny4te/YY4/Vsbn0yuLFi6109957b1z5mDRpko6935MmMx/mNPVChcKrerClh4iIiCKBlR4iIiKKhEDamMyVjI888sggThEYc/bBAw88ENdrbr/9dmu7dOnSvuYprylevHjMfdOmTbO2zS7DVP7eXn/99Wz/v1ixYinLQ141depUHY8ZM8baN2vWrMDOa96bH3/8sbWP3Vvh8c7go9TwdiWaXUZ33313XMdo2LChtT1hwoS4Xmd2s61Zs0bHlStXttKZXXBhdmmZ2NJDREREkcBKDxEREUUCKz1EREQUCYF0shUtWlTHa9eutfZ9+OGHOr7kkkt07J0aHGvF1qB99NFHOn722Wfjeo25ijPAaZvnn3++tX3GGWfo2DvmY9SoUToeNmxYYHkyn1QM2E/sNg0ZMiSwPOQX5lT0xo0bW/uaN28e2HnN+8qcnkvhCvK+pbylQoUK1nadOnVCyklsbOkhIiKiSGClh4iIiCIh8CnrZ599dsx01157rY7r1q1r7fvyyy91bD5wLQjm6pLxNtV2795dxzfddJPPOcrbvFMTn3rqKR17p0jec889Op49e7aOzW5QIOdp8LHs2bNHxzfccIO1b9u2bTo2y8/7PqSc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dPz999/r+KuvvkoqrwBw99136zjq3VleRYsWtbbN7sgpU6ZY+1555RUdm9/B5mrKXm3atNGxWf5e5sNNt27dau0zH2jbtWtXHYf5EGO29BAREVEksNJDREREkRB491aVKlWs7V9++UXHZ599to4XLlxopfv999+zjdPFO++8o2OziRgARo4cmers5Hvnn3++jsuUKaNj7wrfOTXXUnj27NljbXu7hLNMmjTJ2i5RokRgeYqiZs2aWdvmAz0zMzOtfRdeeGEqsnSQbt266fimm24KJQ95gXcYhfm9M23aNGuf+VDtsmXL6rhv375WOnM2l5kuJzNmzNCx90GnZte1udp6nTp14jp2ENjSQ0RERJHASg8RERFFAis9REREFAmBj+nxOuyww3T8wQcf6Pjzzz+30pn9uumoVKlSOv6///u/EHNCJnNMSMeOHUPMCZm849xWrlyp4+bNm+v49NNPT1meosi7wvWECRN0/NRTT1n73nvvvVRk6aBxn+ZU+UKFUv4VlWcdeeSROjZXVgbsJyEUKVJEx/GO28mJOY7SO6bS/L73LkcRFrb0EBERUSSw0kNERESREGrbYfXq1XXcpUsXa9+ll16q4+HDh1v7jj32WB1fdNFFOl68eLGV7t57740rH2aXiPchbiYzH+Y0dTbBpo8vv/wy7CyQ68cff9Txww8/HDPdM888k4rsUDbMB/SeccYZ1r558+Zl+5o333zT2l6/fr2OGzZsqGOzawMArrnmmmyPZ662DtjdL5SYChUqBHr8jRs36nj58uUx07Vu3VrHfnSl+YEtPURERBQJrPQQERFRJKRNv4x31LfZZWQ+dC4nZtMqYM9MyInZzbZmzRodV65c2UpndsGxS4voYH/99ZeOze6SXbt2WenMB1+aqwJTeLzdTOasunj+32vJkiVxpQvz4ZOUGPPhod5V8WOlSxds6SEiIqJIYKWHiIiIIoGVHiIiIooEDkzJgXfaX5hPhqX/mGO3vv766xBzEk3mk5Pvuusua9+7776rY7Ov3ztmb9y4cTqeOHGijm+55RYrnbk0hLkKOuUfN9xwQ9hZoEPwjo/99NNPdWze27fffruVrm3btsFmLAFs6SEiIqJIYKWHiIiIIoHdW5TnPPLIIzr2Tp/ds2ePjrdt26bjcuXKBZ2tfMv78ML69evr2Px9A4BSSsclSpTQcb169WIe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Hnlktvu8KzIXKMC/y4Jk3lfmir4A8Mcff+i4Tp06KcuTyXw49Jw5c6x95hIiFCxvN7P5kFHT4Ycfbm0XLVo0sDwlip8oREREFAms9BAREVEkpG2/zMCBA3XsnSGyZs0aHf/22286Llu2rJWuSZMmcZ1r7969OjYfmOZdabl///46Nh+sSMEzVxE1m9q93Vuc7ZNaNWvWjLnduHHjuI5hrujq7Sq+9tprE88cHdLDDz+s4xtuuMHat2vXrlRn5yDmzKAdO3ZY+84888xUZyeyfvzxR2t71KhROr7ssst0/NJLL6UsT4liSw8RERFFAis9REREFAms9BAREVEkpO2YHnM8ToUKFax9gwYN0rE5pdX8fwCoWLGijhcvXqxj76qv5mrNM2bM0HHnzp2tdCNGjIgr70SUs1jjRZo1a2Zte8eZkL/MpTfuuecea98nn3yi4+OOO07H3mUF/LZy5Uodm0tQtG3b1krXo0ePQPMRRebq6OZTEW677TYrXevWrXX8/PPP67hYsWIB5s4fbOkhIiKiSGClh4iIiCIhbbu3zFVgW7VqZe2L9TBS7wPzZs6cqWNzdVhzijoAVKpUScc33nijjm+++WYrnTltmogS9+CDD2b7/957joJVpkwZHbdr187ad+utt2abrlevXla6ZLu7zIdXAsApp5yiY3PZkO7du1vpvA+xpdzbvHmztf3yyy/r2Fw25vvvv7fSHX/88cFmLEBs6SEiIqJIYKWHiIiIIiFtu7dMr732mrXdtGlTHX/zzTc6XrRokZVu7ty5OjYfOHrhhRda6a666iodFy9ePKm8UmqdcMIJ1ja7INPTtm3brO1HHnkknIxQTN6HSJozXs2V6r/77jsrnTkk4Jhjjol5fHP1fPOzefDgwVY6s0vLnJF7+eWXxzw22avRe7sczdmSEyZM0LH3IbMTJ07U8S+//KLjo446yrd8ho0tPURERBQJrPQQERFRJLDSQ0RERJGQJ8b0FClSxNr2rg5J0bVw4UJre//+/TrmlNb04b2HzTEH5pPVjzzyyJTliWze++Xjjz/Wsbky9iuvvGKle+GFF3Rcq1atmMc3V1o2eV/z5JNP6rh379455Dh6zLE5I0eOtPaZ08q9YxunTJmi44svvljH5rR0ABgwYICOixYtmlxm0xRbeoiIiCgSWOkhIiKiSMgT3VtE8fr11191fOKJJ4aYEzKZU5QBYM+ePTo2u7fKlSuXqizRIZQoUULH5kq93bp1s9KZU93ffvttHXu7R8wVnlu0aKFj74NE82u3it8+/PBDa9ucsl63bl1r3/z583XcqFGjQPOV7tjSQ0RERJHASg8RERFFAis9REREFAkc00N5jvkYEe802L/++ivFuaF4VK9e3do2p9R27NhRxzVr1kxZnigx5iN9stum4JQqVUrH8+bNCzEneRdbeoiIiCgSWOkhIiKiSGD3FuU5//vf/7KNKX15n9JsrgrrnXpLRBQUtvQQERFRJLDSQ0RERJHA7i0iSrkJEyaEnQUiiiC29BAREVEksNJDREREkcBKDxEREUUCKz1EREQUCaz0EBERUSSw0kNERESRIEqp+BOLbAKw8pAJyU+1lFKV/D4oyzI0LM/8g2WZv/henizL0MQsy1xVeoiIiIjyKnZvERERUSSw0kNERESRwEoPERERRQIrPURERBQJrPQQERFRJLDSQ0RERJHASg8RERFFAis9REREFAms9BAREVEk/D8+wFyXceH0RwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 720x720 with 25 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "aVCkRwFHWsSy"
},
"source": [
"## What Next?"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YrnKU6BJWsSy"
},
"source": [
"Now that we have found mislabeled data, we can fix them. We see that in this problem in the top 5000 most confident wrong answers our predicted labels are much better.\n",
"\n",
"So the next step would be to replace the labels with our predicted labels, then train our model on the newly cleaned labels!\n",
"\n",
">Note: This same approach can be used on unlabeled data to get data points the model is confident in to expand the training data."
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment