[de45a9]: / DL_Genomics_v10_resnet-fastai-fastq.ipynb

Download this file

1805 lines (1804 with data), 137.7 kB

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Deep learning in genomics - Basic model with PyTorch and fastai"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook is based on the [jupyter notebook](https://nbviewer.jupyter.org/github/abidlabs/deep-learning-genomics-primer/blob/master/A_Primer_on_Deep_Learning_in_Genomics_Public.ipynb) from the publication [\"A primer on deep learning in genomics\"](https://www.nature.com/articles/s41588-018-0295-5) but uses the [fastai](https://www.fast.ai) library based on [PyTorch](https://pytorch.org)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Notebook setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%reload_ext autoreload\n",
    "%autoreload 2\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from fastai import *\n",
    "from fastai.vision import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import LabelEncoder, OneHotEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pdb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.0.39.dev0'"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# fastai version\n",
    "__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# From https://forum.pyro.ai/t/a-clever-trick-to-debug-tensor-memory/556\n",
    "def debug_memory():\n",
    "    import collections, gc, torch\n",
    "    tensors = collections.Counter((str(o.device), o.dtype, tuple(o.shape))\n",
    "                                  for o in gc.get_objects()\n",
    "                                  if torch.is_tensor(o))\n",
    "    for line in sorted(tensors.items()):\n",
    "        print('{}\\t{}'.format(*line))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Data setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "## Data frame setup from raw data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 274,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PosixPath('/Volumes/HDD08/ugenomfit/data')"
      ]
     },
     "execution_count": 274,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PATH_raw_data = Path('/Volumes/HDD08/ugenomfit/data/'); PATH_raw_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 275,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "from Bio import SeqIO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 276,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "def get_seqs(path, seq_per_file=500):\n",
    "    label, seq, score = [], [], []\n",
    "    for n, fn in enumerate((path).glob('*.fastq')):\n",
    "        \n",
    "        # print file number n\n",
    "        #print(n)\n",
    "        \n",
    "        # print file number n and filename fn\n",
    "        print(n, fn)\n",
    "        \n",
    "        # append sequences\n",
    "        for m, record in enumerate(SeqIO.parse(fn, 'fastq')):\n",
    "            \n",
    "            #print(m)\n",
    "            if m == seq_per_file: break # only read in the first m sequences per fastq file\n",
    "            \n",
    "            # append sequences\n",
    "            seq.append(str(record.seq))\n",
    "            score.append(record.letter_annotations['phred_quality'])\n",
    "            \n",
    "            # print genome name including contig number and sequence length\n",
    "            #print(\"%s %i\" % (record.id, len(record)))\n",
    "        \n",
    "            # append genome labels\n",
    "            label.append(str(record.id))\n",
    "            \n",
    "            #pdb.set_trace() # start debugger\n",
    "                    \n",
    "        # break loop\n",
    "        #if n == 1: break\n",
    "    return label, seq, score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 277,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 /Volumes/HDD08/ugenomfit/data/SRR1993099.sra_1.fastq\n",
      "1 /Volumes/HDD08/ugenomfit/data/SRR1993099.sra_2.fastq\n",
      "2 /Volumes/HDD08/ugenomfit/data/SRR5665975.sra_1.fastq\n",
      "3 /Volumes/HDD08/ugenomfit/data/SRR5665975.sra_2.fastq\n"
     ]
    }
   ],
   "source": [
    "label, seq, score = get_seqs(PATH_raw_data, seq_per_file=5000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 278,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "#label[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 279,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "#seq[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 280,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "#score[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 281,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20000, 20000, 20000)"
      ]
     },
     "execution_count": 281,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(label), len(seq), len(score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 282,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "col_names = ['label', 'sequence', 'score']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 283,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "seq_score = [(a,b) for a,b in zip(seq, score)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 284,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "fastq_df = pd.DataFrame({'label': label, 'seq_score': seq_score})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 285,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "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>label</th>\n",
       "      <th>seq_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>SRR1993099.sra.1</td>\n",
       "      <td>(ATCTACAAGAAGGGTGAAGTGCTTTTCGAATTTTGCCACTGCAAG...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>SRR1993099.sra.2</td>\n",
       "      <td>(TGTGCTCCATGTCGATATTTCGTGGAGCAAACCAAAAAAGATGCG...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>SRR1993099.sra.3</td>\n",
       "      <td>(NACCCTTTATAAAAGCCTAGATGTAGCAGTGCGAAGCGAACTCGA...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>SRR1993099.sra.4</td>\n",
       "      <td>(CGAATGGGACCTTGAATGGATTAACGAGATTCCCACTGTCCCTAT...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>SRR1993099.sra.5</td>\n",
       "      <td>(CACACCGCAGTAGATGGAAAACTCGAGTTTTACATGGAACAGGTA...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              label                                          seq_score\n",
       "0  SRR1993099.sra.1  (ATCTACAAGAAGGGTGAAGTGCTTTTCGAATTTTGCCACTGCAAG...\n",
       "1  SRR1993099.sra.2  (TGTGCTCCATGTCGATATTTCGTGGAGCAAACCAAAAAAGATGCG...\n",
       "2  SRR1993099.sra.3  (NACCCTTTATAAAAGCCTAGATGTAGCAGTGCGAAGCGAACTCGA...\n",
       "3  SRR1993099.sra.4  (CGAATGGGACCTTGAATGGATTAACGAGATTCCCACTGTCCCTAT...\n",
       "4  SRR1993099.sra.5  (CACACCGCAGTAGATGGAAAACTCGAGTTTTACATGGAACAGGTA..."
      ]
     },
     "execution_count": 285,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fastq_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 286,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "def recode_label(label, inv=False):\n",
    "\n",
    "    if label.find('SRR1993099') != -1:\n",
    "        return 0 if inv == False else 1\n",
    "       \n",
    "    elif label.find('SRR5665975') != -1:\n",
    "        return 1 if inv == False else 0\n",
    "    \n",
    "    else:\n",
    "        return np.nan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 287,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "fastq_df['target'] = fastq_df['label'].apply(recode_label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 288,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "fastq_df['nottarget'] = fastq_df['label'].apply(partial(recode_label,inv=True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 289,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "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>label</th>\n",
       "      <th>seq_score</th>\n",
       "      <th>target</th>\n",
       "      <th>nottarget</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>SRR1993099.sra.1</td>\n",
       "      <td>(ATCTACAAGAAGGGTGAAGTGCTTTTCGAATTTTGCCACTGCAAG...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>SRR1993099.sra.2</td>\n",
       "      <td>(TGTGCTCCATGTCGATATTTCGTGGAGCAAACCAAAAAAGATGCG...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>SRR1993099.sra.3</td>\n",
       "      <td>(NACCCTTTATAAAAGCCTAGATGTAGCAGTGCGAAGCGAACTCGA...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>SRR1993099.sra.4</td>\n",
       "      <td>(CGAATGGGACCTTGAATGGATTAACGAGATTCCCACTGTCCCTAT...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>SRR1993099.sra.5</td>\n",
       "      <td>(CACACCGCAGTAGATGGAAAACTCGAGTTTTACATGGAACAGGTA...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              label                                          seq_score  \\\n",
       "0  SRR1993099.sra.1  (ATCTACAAGAAGGGTGAAGTGCTTTTCGAATTTTGCCACTGCAAG...   \n",
       "1  SRR1993099.sra.2  (TGTGCTCCATGTCGATATTTCGTGGAGCAAACCAAAAAAGATGCG...   \n",
       "2  SRR1993099.sra.3  (NACCCTTTATAAAAGCCTAGATGTAGCAGTGCGAAGCGAACTCGA...   \n",
       "3  SRR1993099.sra.4  (CGAATGGGACCTTGAATGGATTAACGAGATTCCCACTGTCCCTAT...   \n",
       "4  SRR1993099.sra.5  (CACACCGCAGTAGATGGAAAACTCGAGTTTTACATGGAACAGGTA...   \n",
       "\n",
       "   target  nottarget  \n",
       "0       0          1  \n",
       "1       0          1  \n",
       "2       0          1  \n",
       "3       0          1  \n",
       "4       0          1  "
      ]
     },
     "execution_count": 289,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fastq_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 290,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "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>label</th>\n",
       "      <th>seq_score</th>\n",
       "      <th>target</th>\n",
       "      <th>nottarget</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>19995</th>\n",
       "      <td>SRR5665975.sra.4996</td>\n",
       "      <td>(TTTCTACCATCTCCAGCGGAGCAGAATCGGTGGCGGTTTCCGCTT...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19996</th>\n",
       "      <td>SRR5665975.sra.4997</td>\n",
       "      <td>(CCCGTGCGCGCGGCTATACGCCGGGACGTTTCAGCTTTAACGTTC...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19997</th>\n",
       "      <td>SRR5665975.sra.4998</td>\n",
       "      <td>(ATTTTCCGCAAACCAGGCTTTAACCGCGCCAGCGAAGGCTATTTT...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19998</th>\n",
       "      <td>SRR5665975.sra.4999</td>\n",
       "      <td>(TGCAAAATGGTGCTAATTTTGGCCCCTGGCGATTACGCAACTATT...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19999</th>\n",
       "      <td>SRR5665975.sra.5000</td>\n",
       "      <td>(AACGGCAAAATTATCGCCGTTGCCAGCAATATCCCTTCTGACATT...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     label                                          seq_score  \\\n",
       "19995  SRR5665975.sra.4996  (TTTCTACCATCTCCAGCGGAGCAGAATCGGTGGCGGTTTCCGCTT...   \n",
       "19996  SRR5665975.sra.4997  (CCCGTGCGCGCGGCTATACGCCGGGACGTTTCAGCTTTAACGTTC...   \n",
       "19997  SRR5665975.sra.4998  (ATTTTCCGCAAACCAGGCTTTAACCGCGCCAGCGAAGGCTATTTT...   \n",
       "19998  SRR5665975.sra.4999  (TGCAAAATGGTGCTAATTTTGGCCCCTGGCGATTACGCAACTATT...   \n",
       "19999  SRR5665975.sra.5000  (AACGGCAAAATTATCGCCGTTGCCAGCAATATCCCTTCTGACATT...   \n",
       "\n",
       "       target  nottarget  \n",
       "19995       1          0  \n",
       "19996       1          0  \n",
       "19997       1          0  \n",
       "19998       1          0  \n",
       "19999       1          0  "
      ]
     },
     "execution_count": 290,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fastq_df.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 291,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 20000 entries, 0 to 19999\n",
      "Data columns (total 4 columns):\n",
      "label        20000 non-null object\n",
      "seq_score    20000 non-null object\n",
      "target       20000 non-null int64\n",
      "nottarget    20000 non-null int64\n",
      "dtypes: int64(2), object(2)\n",
      "memory usage: 625.1+ KB\n"
     ]
    }
   ],
   "source": [
    "fastq_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 292,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "# pickle data frame to disk\n",
    "fastq_df.to_pickle('fastq_df.pkl')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load data frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load pickled data frame\n",
    "fastq_df = pd.read_pickle('fastq_df.pkl')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "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>label</th>\n",
       "      <th>seq_score</th>\n",
       "      <th>target</th>\n",
       "      <th>nottarget</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>SRR1993099.sra.1</td>\n",
       "      <td>(ATCTACAAGAAGGGTGAAGTGCTTTTCGAATTTTGCCACTGCAAG...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>SRR1993099.sra.2</td>\n",
       "      <td>(TGTGCTCCATGTCGATATTTCGTGGAGCAAACCAAAAAAGATGCG...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>SRR1993099.sra.3</td>\n",
       "      <td>(NACCCTTTATAAAAGCCTAGATGTAGCAGTGCGAAGCGAACTCGA...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>SRR1993099.sra.4</td>\n",
       "      <td>(CGAATGGGACCTTGAATGGATTAACGAGATTCCCACTGTCCCTAT...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>SRR1993099.sra.5</td>\n",
       "      <td>(CACACCGCAGTAGATGGAAAACTCGAGTTTTACATGGAACAGGTA...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              label                                          seq_score  \\\n",
       "0  SRR1993099.sra.1  (ATCTACAAGAAGGGTGAAGTGCTTTTCGAATTTTGCCACTGCAAG...   \n",
       "1  SRR1993099.sra.2  (TGTGCTCCATGTCGATATTTCGTGGAGCAAACCAAAAAAGATGCG...   \n",
       "2  SRR1993099.sra.3  (NACCCTTTATAAAAGCCTAGATGTAGCAGTGCGAAGCGAACTCGA...   \n",
       "3  SRR1993099.sra.4  (CGAATGGGACCTTGAATGGATTAACGAGATTCCCACTGTCCCTAT...   \n",
       "4  SRR1993099.sra.5  (CACACCGCAGTAGATGGAAAACTCGAGTTTTACATGGAACAGGTA...   \n",
       "\n",
       "   target  nottarget  \n",
       "0       0          1  \n",
       "1       0          1  \n",
       "2       0          1  \n",
       "3       0          1  \n",
       "4       0          1  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# show pandas data frame head\n",
    "fastq_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "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>label</th>\n",
       "      <th>seq_score</th>\n",
       "      <th>target</th>\n",
       "      <th>nottarget</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>19995</th>\n",
       "      <td>SRR5665975.sra.4996</td>\n",
       "      <td>(TTTCTACCATCTCCAGCGGAGCAGAATCGGTGGCGGTTTCCGCTT...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19996</th>\n",
       "      <td>SRR5665975.sra.4997</td>\n",
       "      <td>(CCCGTGCGCGCGGCTATACGCCGGGACGTTTCAGCTTTAACGTTC...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19997</th>\n",
       "      <td>SRR5665975.sra.4998</td>\n",
       "      <td>(ATTTTCCGCAAACCAGGCTTTAACCGCGCCAGCGAAGGCTATTTT...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19998</th>\n",
       "      <td>SRR5665975.sra.4999</td>\n",
       "      <td>(TGCAAAATGGTGCTAATTTTGGCCCCTGGCGATTACGCAACTATT...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19999</th>\n",
       "      <td>SRR5665975.sra.5000</td>\n",
       "      <td>(AACGGCAAAATTATCGCCGTTGCCAGCAATATCCCTTCTGACATT...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     label                                          seq_score  \\\n",
       "19995  SRR5665975.sra.4996  (TTTCTACCATCTCCAGCGGAGCAGAATCGGTGGCGGTTTCCGCTT...   \n",
       "19996  SRR5665975.sra.4997  (CCCGTGCGCGCGGCTATACGCCGGGACGTTTCAGCTTTAACGTTC...   \n",
       "19997  SRR5665975.sra.4998  (ATTTTCCGCAAACCAGGCTTTAACCGCGCCAGCGAAGGCTATTTT...   \n",
       "19998  SRR5665975.sra.4999  (TGCAAAATGGTGCTAATTTTGGCCCCTGGCGATTACGCAACTATT...   \n",
       "19999  SRR5665975.sra.5000  (AACGGCAAAATTATCGCCGTTGCCAGCAATATCCCTTCTGACATT...   \n",
       "\n",
       "       target  nottarget  \n",
       "19995       1          0  \n",
       "19996       1          0  \n",
       "19997       1          0  \n",
       "19998       1          0  \n",
       "19999       1          0  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fastq_df.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 20000 entries, 0 to 19999\n",
      "Data columns (total 4 columns):\n",
      "label        20000 non-null object\n",
      "seq_score    20000 non-null object\n",
      "target       20000 non-null int64\n",
      "nottarget    20000 non-null int64\n",
      "dtypes: int64(2), object(2)\n",
      "memory usage: 625.1+ KB\n"
     ]
    }
   ],
   "source": [
    "fastq_df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## fastai data object"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Setup custom fastai data object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# open sequence image function\n",
    "def open_fastq_image(seq_score:list, seq_len:int=50, cls:type=Image)->Image:\n",
    "    \"Return `Image` object created from sequence string `seq`.\"\n",
    "    \n",
    "    # unpack tuple of lists to separate tuples\n",
    "    if isinstance(seq_score,(np.ndarray)): # fastai dataset loads tuple in np.array???\n",
    "        seq, score = seq_score[0]\n",
    "    else:\n",
    "        seq, score = seq_score\n",
    "    \n",
    "    if seq_len != None:\n",
    "        seq = seq[:seq_len]\n",
    "        score = score[:seq_len]\n",
    "    \n",
    "    int_enc = LabelEncoder() # setup class instance to encode the four different bases to integer values (1D)\n",
    "    #one_hot_enc = OneHotEncoder(categories=[range(4)]) # setup one hot encoder to encode integer encoded classes (1D) to one hot encoded array (4D)\n",
    "    \n",
    "    enc = int_enc.fit_transform(list(seq)) # bases (ACGT) to int (0,1,2,3)\n",
    "    enc = np.array(enc).reshape(-1,1) # reshape to get rank 2 array (from rank 1 array)\n",
    "    #enc = one_hot_enc.fit_transform(enc) # encoded integer encoded bases to sparse matrix (sparse matrix dtype)\n",
    "    #enc = enc.toarray().T#.reshape(1,-1,4) # export sparse matrix to np array\n",
    "    \n",
    "    # one-hot-encode base position\n",
    "    adenosine = enc == 0\n",
    "    thymine = enc == 3\n",
    "    cytosine = enc == 1\n",
    "    \n",
    "    # base pair encoding: AT = False, GC = True\n",
    "    # https://stackoverflow.com/questions/32192163/python-and-operator-on-two-boolean-lists-how\n",
    "    basepair_enc = np.array([not(a or t) for a, t in zip(adenosine, thymine)]).astype('int')*255\n",
    "    \n",
    "    # strandpostion encodes the position of A/C or T/G on the the strand: A or C = False, T or G = True\n",
    "    strandposition_enc = np.array([not(a or c) for a, c in zip(adenosine, cytosine)]).astype('int')*255\n",
    "    \n",
    "    score_enc = np.array(score)\n",
    "    \n",
    "    enc = np.stack((basepair_enc, strandposition_enc, score_enc), axis=0)\n",
    "    \n",
    "    enc = enc.reshape(1,-1,3)\n",
    "    \n",
    "    # https://stackoverflow.com/questions/22902040/convert-black-and-white-array-into-an-image-in-python\n",
    "    x = PIL.Image.fromarray(enc.astype('uint8')).convert('RGB')\n",
    "    x = pil2tensor(x,np.float32)\n",
    "    x.div_(255)\n",
    "    \n",
    "    #pdb.set_trace()\n",
    "    \n",
    "    # optional functions not needed\n",
    "    #x = x.view(4,-1) # remove first dimension\n",
    "    #x = x.expand(3, 4, 50) # expand to 3 channel image\n",
    "    \n",
    "    return cls(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAABADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD4q/YJ/wCTS/i7/wBj74T/APTP4spNG/5RFfGr/r/H/pP4Goor+vuLP+UjOJP+wqr/AOqTBn3fGP8Ayizw9/2G4j/1IifV3/BE7/kzfxb/ANlT+D3/AKdPh/W9+17/AMnk6D/2kH8df+mrwrRRX4rw58Oaf1/zM6p8pwN8XHX/AGFZl/6rpn5ZePv+Q3af9i5pH/putq564/1H/bvH/MUUV+f8Sf8AI/x//X6v/wCpOINOI/8AkbV/8X/tlMZB/qE/3B/Kiiivianxv1f5s8mXxM//2Q==\n",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAABHNCSVQICAgIfAhkiAAAAGlJREFUCJlNzEEKwkAQRNHXyaggwRzB3P9yQjAEJUO7yETtRUHXL36Q6e8yg4BECClFq1IGsaMjfos8PiKaS9KU2cDXmTvL+2QqRUGphZ61qy7xYBl1w9kb61YN+dKdmLen3ui6VNtt8QEKyixbTwHqlAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "Image (3, 1, 50)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# test open sequence image function\n",
    "open_fastq_image(fastq_df.seq_score[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "class SeqItemList(ImageItemList):\n",
    "    \"Sequence Item List\"\n",
    "    _bunch,_square_show = ImageDataBunch,True\n",
    "    def __post_init__(self):\n",
    "        super().__post_init__()\n",
    "        self.sizes={}\n",
    "    \n",
    "    def open(self, seq_score): return open_fastq_image(seq_score)\n",
    "    \n",
    "    def get(self, i):\n",
    "        seq = self.items[i][0]\n",
    "        res = self.open(seq)\n",
    "        return res\n",
    "    \n",
    "    @classmethod\n",
    "    def import_from_df(cls, df:DataFrame, seq_score:IntsOrStrs=0, **kwargs)->'ItemList':\n",
    "        \"Get the sequences in `col` of `df` and return cls and df.\"\n",
    "        return cls(items=zip(df[seq_score].values), xtra=df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "bs = 64"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = (SeqItemList.import_from_df(fastq_df, ['seq_score'], seq_len=50) #seq_len is not set in SeqItemList yet, only in open_fastq_image !!!\n",
    "        .random_split_by_pct(valid_pct=0.25)\n",
    "        #.split_by_idxs(range(1500), range(1500,2000))\n",
    "        .label_from_df(['target', 'nottarget']) #one_hot=True !\n",
    "        .databunch(bs=bs))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Verify data object"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Check data object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ImageDataBunch;\n",
       "\n",
       "Train: LabelList\n",
       "y: MultiCategoryList (15000 items)\n",
       "[MultiCategory nottarget, MultiCategory nottarget, MultiCategory nottarget, MultiCategory nottarget, MultiCategory nottarget]...\n",
       "Path: .\n",
       "x: SeqItemList (15000 items)\n",
       "[Image (3, 1, 50), Image (3, 1, 50), Image (3, 1, 50), Image (3, 1, 50), Image (3, 1, 50)]...\n",
       "Path: .;\n",
       "\n",
       "Valid: LabelList\n",
       "y: MultiCategoryList (5000 items)\n",
       "[MultiCategory target, MultiCategory target, MultiCategory nottarget, MultiCategory target, MultiCategory target]...\n",
       "Path: .\n",
       "x: SeqItemList (5000 items)\n",
       "[Image (3, 1, 50), Image (3, 1, 50), Image (3, 1, 50), Image (3, 1, 50), Image (3, 1, 50)]...\n",
       "Path: .;\n",
       "\n",
       "Test: None"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, ['target', 'nottarget'])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check classes\n",
    "data.c, data.classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check batch size\n",
    "data.train_dl.batch_size"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Check data points"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAABADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDA/wCC2X/KOrRP+y8/GH/07+Jq7X9uH/k3v9pT/sMWH/q47eiivxTgX/kTVf8ArzmP/q4y8+v4d/3bB/8AY6w//peWnafsHf8ANB/+yZ6x/wC9Or4c/Zb/AOPzwR/2aX8O/wD1ammUUV/QHAX/ACa7Mv8ArzD/ANImeV9KX/k5HEH/AHM/+k5mfLvx6/5Kxf8A/XrY/wDpJBXKXH+rP+6P60UV8rkf/Iow3/XuH/pKPofFP/k5ed/9heJ/9PTFXoPpRRRXqnwB/9k=\n",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAABHNCSVQICAgIfAhkiAAAAGBJREFUCJlNzTEOwlAQA9HnjRTEKcL9L0hB+KZIClyNrJGdVpNqAwKpiqC9yrQa0qhKov7SktxeaO+t2+/FXF9JaTQ4Dq99t8MaM7X6lu1pcloexsdaY2az1hecZUtk4geo+jB3hBcTdAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "Image (3, 1, 50)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "i = 2\n",
    "data.x[i]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MultiCategory nottarget"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.y[i]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAABADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDP/bT/AOSb6N/2bx4B/wDVnaRX5w6d/wAi/wDtH/8Acc/9L7uiivs/Cf8A5I7xJ/7GWJ/9Oo/srhz4eHf+vOI/9VWfifsN/wDJhH7SH/ZNIf8A06LX6eftVf8AIreA/wDsk3gv/wBRz43UUV+g+LP+54f/ALAMp/8AVfjD+QMX/wAi3KP+wqX55efl7+0B/wAnI/EX/soGt/8ApfPXH9n/AN5f6UUV/OuTf8iPC/8AXml/6apHyvCX/JK5f/14of8ApmkPj/1a/wC6KKKK9Y9s/9k=\n",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAABHNCSVQICAgIfAhkiAAAAF9JREFUCJlFyzEOwkAAA8HxXaDiFeH/v6MBEpkiEFxY8mqdalMqxJGSUAWRA/p6etJ/enZK83v12EiirSS0h1PcV+ucJsYYGMaA3d5h5mV/LnKtWETtW43Lw3u7WWZ8ALB/KHh7WYNvAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "Image (3, 1, 50)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "i = 3\n",
    "data.x[i]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MultiCategory nottarget"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.y[i]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAIFCAYAAADP+Fw1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAH1ZJREFUeJzt3W2sZWdZN/D/NZ2+dyhp8Xl4BqXYIoEStcGIEj+IpsFoTGxU0NgoAVEkmOgHQoLB2A+NWBMTRSMaI5aQKMQIYgFjiDE0iPhG1GhfKJohU/qiWNvpUKxMez8f1hrcZ+817e7M1Tlnpr9fspKz1r7Xve61z97XWf+11j67xhgBAADg1O3b7QEAAACcLQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbB4yqrqUFVdu0vbvrmqbtyNbQOnn3oD7JaqGlX1wpX5V1bV3XtpTOxNAhanVVWds9tjAJ4Z1BtgL6mq/bs9Bk4PAYunpKrem+T5SW6pqqNV9daq+sOquq+qHqqqW6vqpSvtb66qd1XVR6vqi0m+o6our6pbqupIVf1tVd1YVZ9YWefFVfWxqnqgqu6sqtfMy38yyfVJ3jpv+5bTvPvAaaTeAB3mK+Fvqap/mmvH+6vqgvmxn6iqz8414E+q6uC8/NZ59X+ca8Brk/xpkoPz/NGqOlhVL6+qv6qqB6vq3qr6jao6b2Xbo6reXFV3JblrXvaqud48VFW/WVUfr6o3rKzz+qq6var+q6r+rKquOMGYfuhpf/I4OWMMk+kpTUkOJbl2Zf71SQ4kOT/Jryb5h5XHbk7yUJJvyxToL0jyvnm6KMnVSQ4n+cTc/uJ5/nVJ9id5WZIvJHnpSn837vZzYDKZTs+k3phMplOd5jryN0kOJrksye1JfirJd87v+ZfNNeXXk9y6st5I8sKV+VcmuXut729K8q1zDXnB3PfPrvXxsXm7FyZ5TpIjSb5/Xudnknw5yRvm9tcl+WySl8yPvz3JJ080JtPenFzB4pSNMd49xnh4jPFokhuSfGNVXbrS5ENjjL8cYzyeqYj8QJJfGGM8Msa4Lcl7Vtp+b5JDY4zfG2McG2N8OskfJfnB07M3wF6m3gAn6Z1jjHvGGA8kuSXJNZmuUr97jPHpuaa8LckrquoF23Y6xvj7Mcan5hpyKMlvJ/n2tWbvGGM8MMb4UpLvSfIvY4wPjDGOJXlnkvtW2r5xbn/7/PgvJrnm+FUszgwCFqekqs6pql+qqn+tqiOZzhIl0xma4w6v/PxVmc7IHD7B41ck+Zb5UvuDVfVgpgL43P7RA2cS9QY4Bash5pEkl2S6ovW54wvHGEeT/GeS523baVW9qKo+PN+6fCRTIHrOWrPVunNwdX6MMZKs/uOMK5L82kpNeiBJPZUxsfsELE7GWPn5R5J8X5Jrk1ya6fJ4MhWDpfb/keRYkq9eWfY1Kz8fTvLxMcazV6ZLxhhvWugLOPupN8DT5Z5MgSZJUlUXJ7k8yedP0H6pJrwryR1Jvm6M8awkP5edNWl9vXuzUpOqqrKzRh1O8sa1unThGOOTW+4Te4CAxcm4P8mV888Hkjya6YzPRZnO3JzQGOOxJB9IckNVXVRVL07yYytNPpzkRVX1o1V17jx9c1W9ZGHbwNlPvQGeLr+f5HVVdU1VnZ+ppvz1fKtfslkD7k9y+dptyQcyfabq6Fxj3pQn9pEkX19V19X0XwXfnJ1XzX8ryduO/wOfqrq0ql69NgZ1aY8TsDgZ70jy9vnS9WWZLq9/PsltST61xfo/nens831J3pvkDzIdNGWM8XCSVyX54Uxnlu5LclOmD58mye8muXq+dP7HXTsE7FnqDfC0GGP8eZKfz/TZy3uTXJWpHhx3Q5L3zDXgNWOMOzLVkH+blx1M8pZMV9cfTvI7Sd7/JNv8QpJXJ/nlTCeLrk7yd/nfuvTBTHXoffMth/+c5LtPNKaT33ueTjXd+gm7p6puSvLcMcZrd3sswNlNvQH2kqral+kzWNePMf5it8dDD1ewOO3m7535hpq8PMmPJ/ngbo8LOPuoN8BeU1XfVVXPnm9LPP6ZrW2uyHOG8I3S7IYDmS6xH0zy70l+JcmHdnVEwNlKvQH2mldk+vzXeZlud75u/hfunCXcIggAANDELYIAAABNBCwAAIAme/YzWJXauHdxLHy/2/o3uS0tWbLNjZFLPS2tt90WN9ethd7Glr1ttloY2ZYDG2PpWdwc7VZ9bfGkLe/3plroa/mO1p0Na/Ols7iPi7t05eZXS1y1Nr9//x552xxbWLY2tG1fr48tLDvnqY8oSXLnnXdu+5bYU2rhhbn4enuir4/8Sl9bvUM3NrDterUwsOWX+NrCpR3astCNtbGdUv3a4nnddr8XC8W6pedr6a/H1sV8Z3/rz82Jtrn4F+uqzZqzvmTP1Jw96oysOQtvoJN+X2x9FLJuu7/FJygum4u2+sjJQo1b2PFt9mix3pzkp14W3/vbfoRmbeXl53DLrrZZuO0+Lj09X3vFxrIr95+3Y36p2uzbtzSyzaOEfSd92WbzKGSMJz8KWTreW9zxLy+81s9dX2u799Ftt922VUNXsAAAAJoIWAAAAE0ELAAAgCb+TTsAAEATV7AAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgA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YAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAEATAQsAAKCJgAUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhanrKpGVb1wZf6VVXX3XhoTcGaqqkNVde0ubfvmqrpxN7YN7D7HN5wsAYs9p6r27/YYgDNfVZ2z22MAOM7xzTOHgMVXzGeK31JV/1RVD1XV+6vqgvmxn6iqz1bVA1X1J1V1cF5+67z6P1bV0ap6bZI/TXJwnj9aVQer6uVV9VdV9WBV3VtVv1FV561se1TVm6vqriR3zcteVVV3zmP5zar6eFW9YWWd11fV7VX1X1X1Z1V1xQnG9ENP+5MHtKuq9yZ5fpJb5vfyW6vqD6vqvrku3FpVL11pf3NVvauqPlpVX0zyHVV1eVXdUlVHqupvq+rGqvrEyjovrqqPzbXtzqp6zbz8J5Ncn+St87ZvOc27DzRxfMNpN8YwmTLGSJJDSf4mycEklyW5PclPJfnOJF9I8rIk5yf59SS3rqw3krxwZf6VSe5e6/ubknxrkv1JXjD3/bNrfXxs3u6FSZ6T5EiS75/X+ZkkX07yhrn9dUk+m+Ql8+NvT/LJE43JZDKdmdNcl65dmX99kgNzLfrVJP+w8tjNSR5K8m2ZTiBekOR983RRkquTHE7yibn9xfP86+Y68rK51r10pb8bd/s5MJlMpzY5vjGd7skVLNa9c4xxzxjjgSS3JLkm01ncd48xPj3GeDTJ25K8oqpesG2nY4y/H2N8aoxxbIxxKMlvJ/n2tWbvGGM8MMb4UpLvSfIvY4wPjDGOJXlnkvtW2r5xbn/7/PgvJrnm+Fke4Ow0xnj3GOPhuRbdkOQbq+rSlSYfGmP85Rjj8UwHLT+Q5BfGGI+MMW5L8p6Vtt+b5NAY4/fm2vTpJH+U5AdPz94Ap5HjG04bAYt1q2/yR5JckumMz+eOLxxjHE3yn0met22nVfWiqvrwfGvPkUwF4zlrzQ6v/HxwdX6MMZKsfrD0iiS/Nl+SfzDJA0nqqYwJOLNU1TlV9UtV9a9zHTk0P7RaS1bryFdlOgN8+ASPX5HkW47XkbmWXJ/kuf2jB3aZ4xtOGwGLbdyT6Q2fJKmqi5NcnuTzJ2g/Fpa9K8kdSb5ujPGsJD+XqWCcaL17k3z1yjZrdT5TcXrjGOPZK9OFY4xPbrlPwJlhtS78SJLvS3Jtkksz3Y6T7Kwlq+3/I8mx7KwdX7Py8+EkH1+rI5eMMd600Bdw9nF8w9NCwGIbv5/kdVV1TVWdn+nszF/Pl8KT5P4kV660vz/J5Wu37RzIdM/x0ap6cZI35Yl9JMnXV9V1Nf3XnTdn51nl30rytuMfcK+qS6vq1WtjWB0TcGZafS8fSPJopjPMF2WqRSc0xngsyQeS3FBVF82158dWmnw4yYuq6ker6tx5+uaqesnCtoGzj+MbnhYCFk9qjPHnSX4+02cT7k1yVZIfXmlyQ5L3zJezXzPGuCPJHyT5t3nZwSRvyXT2+eEkv5Pk/U+yzS8keXWSX850MHV1kr/LdHCVMcYHk9yU5H3zJfl/TvLdJxrTye89sMvekeTt860yl2W6nefzSW5L8qkt1v/pTFe77kvy3ky16XgdeTjJqzLVs3vmNjdl+rB7kvxukqvnOvLHXTsE7A2Ob3i61HTrJ+xtVbUv0z3K148x/mK3xwOcmarqpiTPHWO8drfHAuD45uzkChZ7VlV9V1U9e75sf/ye5m3OWAMk+cr3XH1DTV6e5MeTfHC3xwU8czm+Ofv5Rmn2sldkuj/6vEy3A103/4tTgG0dyHRLz8Ek/57kV5J8aFdHBDzTOb45y7lFEAAAoIlbBAEAAJrs3VsEa+m7Bta/VuCJv2jgiS213Oz/ZFdb6unpvVa42fvi3owtR7bWbOlCZ23Z1VhruPirXRjX2HafTnKsY+n1dMXmF6Vfcd55O+bP22iR1L7Nvh47trns3HO/vDaGhXMcj2+u92htttuXxzb7r3N39n9s88n4Yv3PxrKL9m3u1Tn1+M5h/c/m9v77sc1xfe7QZ7Z4I+09tfDCHAuvy41mCy+ubV+766/BxTZbvqCX3+9rs7Uwri3es1P/G50tjGuhr63vklh7LrZ8FS33X084+1TU4vO/PobtimEt7dQlmzXnyv9zzo75/fs332fHxuay/Qu/zDF2vo9roZYsP4Ob7/fx2OYhw0P3Hdsxf+DAZv/3PXzvxrL/e/DAxrL7H9u57Hn7H94cw3jWxrLPfObOM6/m1OYva+m9uPFaW2qy5cL1l/LS6/HU/tavrbe02mL/2xxYLezP0t/wbQ/ttilL29agLWrj1i/QbQr5QqPlvxMLXT1/4Rjn3PN3zJ+bxzfa7F+KCwuHL4+svVguztGNNl/KxRvLLnxss939/33+xrLLL9l5jLPvv49stHn8vM3acvejX95Ydtn5O+/IPD+bteWcfZs7edcdt2/163QFCwAAoImABQAA0ETAAgAAaCJgAQAANPFv2gEAAJq4ggUAANBEwAIAAGgiYAEAADQRsAAAAJoIWAAAAE0ELAAAgCYCFgAAQBMBCwAAoImABQAA0ETAAgAAaCJgAQAANBGwAAAAmghYAAAATQQsAACAJgIWAABAEwELAACgiYAFAADQRMACAABoImABAAA0EbAAAACaCFgAAABNBCwAAIAmAhYAAECT/w/8kWtanSRF0AAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 864x864 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data.show_batch(rows=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Model setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Custom fastai ResNet model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = create_cnn(data, models.resnet18, metrics=accuracy_thresh)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BCEWithLogitsLoss()"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "learn.loss_func.func"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "#learn.model[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Sequential(\n",
       "  (0): AdaptiveConcatPool2d(\n",
       "    (ap): AdaptiveAvgPool2d(output_size=1)\n",
       "    (mp): AdaptiveMaxPool2d(output_size=1)\n",
       "  )\n",
       "  (1): Lambda()\n",
       "  (2): BatchNorm1d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "  (3): Dropout(p=0.25)\n",
       "  (4): Linear(in_features=1024, out_features=512, bias=True)\n",
       "  (5): ReLU(inplace)\n",
       "  (6): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "  (7): Dropout(p=0.5)\n",
       "  (8): Linear(in_features=512, out_features=2, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "learn.model[1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Model training"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train basic model with fastai"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 315,
   "metadata": {},
   "outputs": [],
   "source": [
    "#learn = Learner(data, net_basic_fastai, loss_func=F.binary_cross_entropy_with_logits, metrics=accuracy_thresh)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "======================================================================\n",
      "Layer (type)         Output Shape         Param #    Trainable \n",
      "======================================================================\n",
      "Conv2d               [64, 64, 1, 25]      9408       False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 64, 1, 25]      128        True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 64, 1, 25]      0          False     \n",
      "______________________________________________________________________\n",
      "MaxPool2d            [64, 64, 1, 13]      0          False     \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 64, 1, 13]      36864      False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 64, 1, 13]      128        True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 64, 1, 13]      0          False     \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 64, 1, 13]      36864      False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 64, 1, 13]      128        True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 64, 1, 13]      36864      False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 64, 1, 13]      128        True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 64, 1, 13]      0          False     \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 64, 1, 13]      36864      False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 64, 1, 13]      128        True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 128, 1, 7]      73728      False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 128, 1, 7]      256        True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 128, 1, 7]      0          False     \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 128, 1, 7]      147456     False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 128, 1, 7]      256        True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 128, 1, 7]      8192       False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 128, 1, 7]      256        True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 128, 1, 7]      147456     False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 128, 1, 7]      256        True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 128, 1, 7]      0          False     \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 128, 1, 7]      147456     False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 128, 1, 7]      256        True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 256, 1, 4]      294912     False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 256, 1, 4]      512        True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 256, 1, 4]      0          False     \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 256, 1, 4]      589824     False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 256, 1, 4]      512        True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 256, 1, 4]      32768      False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 256, 1, 4]      512        True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 256, 1, 4]      589824     False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 256, 1, 4]      512        True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 256, 1, 4]      0          False     \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 256, 1, 4]      589824     False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 256, 1, 4]      512        True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 512, 1, 2]      1179648    False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 512, 1, 2]      1024       True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 512, 1, 2]      0          False     \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 512, 1, 2]      2359296    False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 512, 1, 2]      1024       True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 512, 1, 2]      131072     False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 512, 1, 2]      1024       True      \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 512, 1, 2]      2359296    False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 512, 1, 2]      1024       True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 512, 1, 2]      0          False     \n",
      "______________________________________________________________________\n",
      "Conv2d               [64, 512, 1, 2]      2359296    False     \n",
      "______________________________________________________________________\n",
      "BatchNorm2d          [64, 512, 1, 2]      1024       True      \n",
      "______________________________________________________________________\n",
      "AdaptiveAvgPool2d    [64, 512, 1, 1]      0          False     \n",
      "______________________________________________________________________\n",
      "AdaptiveMaxPool2d    [64, 512, 1, 1]      0          False     \n",
      "______________________________________________________________________\n",
      "Lambda               [64, 1024]           0          False     \n",
      "______________________________________________________________________\n",
      "BatchNorm1d          [64, 1024]           2048       True      \n",
      "______________________________________________________________________\n",
      "Dropout              [64, 1024]           0          False     \n",
      "______________________________________________________________________\n",
      "Linear               [64, 512]            524800     True      \n",
      "______________________________________________________________________\n",
      "ReLU                 [64, 512]            0          False     \n",
      "______________________________________________________________________\n",
      "BatchNorm1d          [64, 512]            1024       True      \n",
      "______________________________________________________________________\n",
      "Dropout              [64, 512]            0          False     \n",
      "______________________________________________________________________\n",
      "Linear               [64, 2]              1026       True      \n",
      "______________________________________________________________________\n",
      "\n",
      "Total params:  11705410\n",
      "Total trainable params:  538498\n",
      "Total non-trainable params:  11166912\n"
     ]
    }
   ],
   "source": [
    "learn.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.lr_find()\n",
    "learn.recorder.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "Total time: 50:06 <p><table style='width:300px; margin-bottom:10px'>\n",
       "  <tr>\n",
       "    <th>epoch</th>\n",
       "    <th>train_loss</th>\n",
       "    <th>valid_loss</th>\n",
       "    <th>accuracy_thresh</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>1</th>\n",
       "    <th>0.432172</th>\n",
       "    <th>0.960091</th>\n",
       "    <th>0.520400</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>2</th>\n",
       "    <th>0.187206</th>\n",
       "    <th>3.096432</th>\n",
       "    <th>0.525900</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>3</th>\n",
       "    <th>0.144700</th>\n",
       "    <th>2.654047</th>\n",
       "    <th>0.530000</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>4</th>\n",
       "    <th>0.120802</th>\n",
       "    <th>0.110985</th>\n",
       "    <th>0.948200</th>\n",
       "  </tr>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.fit_one_cycle(4, max_lr=1e-2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.recorder.plot_losses()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.recorder.plot_metrics()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "Total time: 49:36 <p><table style='width:300px; margin-bottom:10px'>\n",
       "  <tr>\n",
       "    <th>epoch</th>\n",
       "    <th>train_loss</th>\n",
       "    <th>valid_loss</th>\n",
       "    <th>accuracy_thresh</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>1</th>\n",
       "    <th>0.144766</th>\n",
       "    <th>1.269982</th>\n",
       "    <th>0.513300</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>2</th>\n",
       "    <th>0.149426</th>\n",
       "    <th>1.271635</th>\n",
       "    <th>0.512700</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>3</th>\n",
       "    <th>0.123069</th>\n",
       "    <th>0.155888</th>\n",
       "    <th>0.938300</th>\n",
       "  </tr>\n",
       "  <tr>\n",
       "    <th>4</th>\n",
       "    <th>0.107704</th>\n",
       "    <th>0.106997</th>\n",
       "    <th>0.950500</th>\n",
       "  </tr>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.fit_one_cycle(4, max_lr=1e-2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.recorder.plot_losses()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.recorder.plot_metrics()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn.save('resnet18_epoch-8')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Interpretation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "interpret = learn.interpret()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "#interpret.confusion_matrix() # does not work yet!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "#debug_memory()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}