3856 lines (3855 with data), 242.8 kB
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deep learning in genomics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook is based on the [jupyter notebook](https://github.com/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": [
{
"data": {
"text/plain": [
"'1.0.35.dev0'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# fastai version\n",
"__version__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data setup"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"## Load data from the web, generate dataframe, and save to disk"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"import requests"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"URL_seq = 'https://raw.githubusercontent.com/abidlabs/deep-learning-genomics-primer/master/sequences.txt'"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# get data from URL\n",
"seq_raw = requests.get(URL_seq).text.split('\\n')\n",
"seq_raw = list(filter(None, seq_raw)) # Removes empty lists"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"2000"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check length\n",
"len(seq_raw)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# setup df from list\n",
"seq_df = pd.DataFrame(seq_raw, columns=['Sequences'])"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# show head of dataframe\n",
"#seq_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"URL_labels = 'https://raw.githubusercontent.com/abidlabs/deep-learning-genomics-primer/master/labels.txt'"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"seq_labels = requests.get(URL_labels).text.split('\\n')\n",
"seq_labels = list(filter(None, seq_labels)) # Removes empty entries"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"2000"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(seq_labels)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"seq_label_series = pd.Series(seq_labels)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"seq_df['Target'] = seq_label_series.astype('int')"
]
},
{
"cell_type": "code",
"execution_count": 16,
"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>Sequences</th>\n",
" <th>Target</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sequences Target\n",
"0 CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA... 0\n",
"1 GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC... 0\n",
"2 GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA... 0\n",
"3 GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC... 1\n",
"4 GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA... 1"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seq_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"seq_df.to_csv('seq_df.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data frame setup"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"seq_df = pd.read_csv('seq_df.csv', index_col=0)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"#seq_df.drop('Unnamed: 0', axis=1, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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>Sequences</th>\n",
" <th>Target</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA...</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA...</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sequences Target\n",
"0 CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA... 0\n",
"1 GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC... 0\n",
"2 GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA... 0\n",
"3 GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC... 1\n",
"4 GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA... 1"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seq_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 0, 0, 1, ..., 1, 0, 1, 1])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"targA = seq_df['Target'].values; targA"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 1, 1, 0, ..., 0, 1, 0, 0])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"targB = np.logical_not(seq_df['Target'].values).astype(int); targB"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([[0, 1], [0, 1], [0, 1], [1, 0]], '...', [[1, 0], [0, 1], [1, 0], [1, 0]])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"targ = [[a,b] for a, b in zip(targA, targB)]; targ[:4], '...', targ[-4:]#, len(targ)"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"### Preprocessing for MultiTarget (only needed for fastai training)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"seq_df['MultiTarget'] = targ"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"def joinarray(x):\n",
" y = ';'.join((str(x[0]),str(x[1])))\n",
" return y"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"seq_df['MultiTarget'] = seq_df['MultiTarget'].apply(joinarray)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"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>Sequences</th>\n",
" <th>Target</th>\n",
" <th>MultiTarget</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA...</td>\n",
" <td>0</td>\n",
" <td>0;1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC...</td>\n",
" <td>0</td>\n",
" <td>0;1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA...</td>\n",
" <td>0</td>\n",
" <td>0;1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC...</td>\n",
" <td>1</td>\n",
" <td>1;0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA...</td>\n",
" <td>1</td>\n",
" <td>1;0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sequences Target MultiTarget\n",
"0 CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA... 0 0;1\n",
"1 GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC... 0 0;1\n",
"2 GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA... 0 0;1\n",
"3 GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC... 1 1;0\n",
"4 GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA... 1 1;0"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seq_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset setup for training with basic PyTorch"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setup sqeuence to array function"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def seq2array(seq:str)->List:\n",
" \"Return `List` object with np.array created from sequence string `seq`.\"\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 # export sparse matrix to np array\n",
" \n",
" return enc"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(array([[0., 0., 0., 1., ..., 0., 1., 0., 0.],\n",
" [1., 1., 0., 0., ..., 1., 0., 1., 1.],\n",
" [0., 0., 1., 0., ..., 0., 0., 0., 0.],\n",
" [0., 0., 0., 0., ..., 0., 0., 0., 0.]]), (4, 50))"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test open sequence function\n",
"test_arr = seq2array('CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGACACC'); test_arr, test_arr.shape"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAA9CAYAAABWdClAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAAbhJREFUeJzt3cFNwzAYhmESMQTizp0lEBMwJRMgluDeO2KKhgmcguXEzpfnubZq3Ch5Val/3WlZljsAssy9FwBAe+IOEEjcAQKJO0AgcQcIJO4AgcQdIJC4AwQSd4BA970O/DK/Nf1p7Mf3V/Gx18fnloeqMvr6trD2nktan4ua816z7rXXI0PtPdz63v+8vk9/eZ5P7gCBxB0gkLgDBBJ3gEDiDhBI3AECTb3+rOP68/TvA48yanbGsUZuqx2hLBnhWtriWi+9Zutxwj3v0y3GJEvmh4tRSICzEneAQOIOEEjcAQKJO0CgbtMyNRuH7fmN9Jo9pxhG33yr9TpGmHAYYUrlltbXdMmRz0XrJoxyLmwcBnBi4g4QSNwBAok7QCBxBwgk7gCBDjUKeQR7bYpUs4Zao4yAHXl8rcboG9S1HpEd/f2OwigkwImJO0AgcQcIJO4AgcQdIJC4AwTqNgoJwHZ8cgcIJO4AgcQdIJC4AwQSd4BA4g4QSNwBAok7QCBxBwgk7gCBxB0gkLgDBBJ3gEDiDhBI3AECiTtAIHEHCCTuAIHEHSCQuAMEEneAQOIOEEjcAQL9Al/6fGlF2Jm2AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(test_arr)\n",
"plt.axis('off');"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[[0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 1., 1., 0., 0., 0., 1., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0.],\n",
" [1., 1., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 0., 0.,\n",
" 0., 1., 0., 0., 1., 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 1.],\n",
" [0., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 1., 1., 0., 0., 0., 1.,\n",
" 1., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1.,\n",
" 1., 0., 0., 0., 0., 0., 0., 1., 0., 1., 1., 0., 0., 0., 0., 0.],\n",
" [0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 1., 1., 1., 0.,\n",
" 0., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.,\n",
" 0., 0., 1., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_ten = tensor(test_arr).view(1,4,50).type(torch.float); test_ten"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"# run test data through network\n",
"#net(test_ten)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setup datasets"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"x = [tensor(seq2array(s)).view(1,4,50).type(torch.float) for s in seq_df['Sequences'].values]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"x = torch.stack(x) # convert list to tensor"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"y = tensor(targ).type(torch.float)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2000, 2000)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(x), len(y)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor([[[0., 1., 0., 0., 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 0., 1., 1.,\n",
" 1., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0.,\n",
" 1., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
" [0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.,\n",
" 0., 1., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 1., 1., 0., 1.,\n",
" 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 1., 0.],\n",
" [1., 0., 0., 0., 0., 1., 0., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 1., 0., 0., 1., 1., 0., 0., 1., 0., 0., 0.],\n",
" [0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1.]]]),\n",
" tensor([0., 1.]))"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check data\n",
"i = 2\n",
"x[i], y[i]"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"# split dataset\n",
"train_ds = TensorDataset(x[:1500],y[:1500])\n",
"valid_ds = TensorDataset(x[-500:],y[-500:])"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1500, 500)"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# verify dataset length\n",
"len(train_ds), len(valid_ds)"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"## fastai data object"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true,
"hidden": true
},
"source": [
"### Data encoding test (incorporated into \"open_seq_image\" function in the next section)"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# setup class instance to encode the four different bases to integer values (1D)\n",
"int_enc = LabelEncoder()"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# setup one hot encoder to encode integer encoded classes (1D) to one hot encoded array (4D)\n",
"one_hot_enc = OneHotEncoder(categories=[range(4)])"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"seq_enc = []\n",
"\n",
"for s in seq:\n",
" enc = int_enc.fit_transform(list(s)) # 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",
" seq_enc.append(enc.toarray()) # export sparse matrix to np array"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"2000"
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(seq_enc)"
]
},
{
"cell_type": "code",
"execution_count": 462,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"(array([[0., 0., 0., 1., ..., 0., 1., 0., 0.],\n",
" [1., 1., 0., 0., ..., 1., 0., 1., 1.],\n",
" [0., 0., 1., 0., ..., 0., 0., 0., 0.],\n",
" [0., 0., 0., 0., ..., 0., 0., 0., 0.]]), (4, 50))"
]
},
"execution_count": 462,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seq_enc[0].T, seq_enc[0].T.shape"
]
},
{
"cell_type": "code",
"execution_count": 311,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAAECAMAAAD7wpwzAAADAFBMVEUAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkqKiorKyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6Ojo7Ozs8PDw9PT0+Pj4/Pz9AQEBBQUFCQkJDQ0NERERFRUVGRkZHR0dISEhJSUlKSkpLS0tMTExNTU1OTk5PT09QUFBRUVFSUlJTU1NUVFRVVVVWVlZXV1dYWFhZWVlaWlpbW1tcXFxdXV1eXl5fX19gYGBhYWFiYmJjY2NkZGRlZWVmZmZnZ2doaGhpaWlqampra2tsbGxtbW1ubm5vb29wcHBxcXFycnJzc3N0dHR1dXV2dnZ3d3d4eHh5eXl6enp7e3t8fHx9fX1+fn5/f3+AgICBgYGCgoKDg4OEhISFhYWGhoaHh4eIiIiJiYmKioqLi4uMjIyNjY2Ojo6Pj4+QkJCRkZGSkpKTk5OUlJSVlZWWlpaXl5eYmJiZmZmampqbm5ucnJydnZ2enp6fn5+goKChoaGioqKjo6OkpKSlpaWmpqanp6eoqKipqamqqqqrq6usrKytra2urq6vr6+wsLCxsbGysrKzs7O0tLS1tbW2tra3t7e4uLi5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDBwcHCwsLDw8PExMTFxcXGxsbHx8fIyMjJycnKysrLy8vMzMzNzc3Ozs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v7////isF19AAAAO0lEQVR4nGWNSQoAMAgD8/9PT6loIq0HMauShOR9DwphIkO5eALbEI1xp5DUoxYnNtf3t1rci9mGy30A2+0xz9q2+b0AAAAASUVORK5CYII=\n",
"text/plain": [
"<PIL.Image.Image image mode=P size=50x4 at 0x1A20462668>"
]
},
"execution_count": 311,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"PIL.Image.fromarray(seq_enc[0].T.astype('uint8')*255).convert('P')"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Setup custom fastai data object"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# open sequence image function\n",
"def open_seq_image(seq:str, cls:type=Image)->Image:\n",
" \"Return `Image` object created from sequence string `seq`.\"\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 # export sparse matrix to np array\n",
" #print('enc', enc, enc.shape)\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('P')\n",
" x = pil2tensor(x,np.float32)\n",
" #x = x.view(4,-1) # remove first dimension\n",
" #x = x.expand(3, 4, 50) # expand to 3 channel image\n",
" #print('x', x, x.shape)\n",
" return cls(x)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAEADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD80/8AhrrUr/8A0rxT8B/h1q95B/pGltNotzaWGm6iflfUYdIsrmDSvPkjjsopUeze3nTTrfzYZGadpvuj4Jf8EwP2bf2gf2wL39kD4j6n4uuYLDwj4g1u38e/8JEz68IdG8WXnhax0rMqvZ/YlsbG3faLUTCVcJMkAWBSivm/HbGYzgrIq2IyKrLDTjhcTUThKSanTdBQkuZztbnleKXLK95xqOMXD9sPnT9kmOD9rf8A4Wbb6rcav4Ls/gx8Ita+Inwp0/wV4s1VYfCuqaf5LmKyF/dXRhguriVbqcg+eZreIxTQqHR+R+CXxp8V/tC+Mr34X/FXTdI1fwnpnhHxBrWlaFqWlx3s2nWmjaPearZaJaapd+bqtnpYkso4TbwXkbeTLOFkWSZ5SUV9lXwmGhmfENJRVsJDCOj3pSq0HOpKEvjUpz9+cudylJuTbbk2Hrn7DnwE+DH7cXg3xd4t1X4aaR8PovBvi7wX4fsNJ8DWguIbqPxRrA0fUbm4l1v+0Ll50tdptsTLHazJ58UayvI7/On/AA2R480r/ibfDvwF4R8F+IW+SXxP4N0uXT7mWE/vXiaCOb7H/wAfuL+OUW4mtLmK3+ySW0VpaQwFFHCuFoZnx5n2W4xOrQw06KpQnKUoxU6VKUk+ab51KUm2qjqpt+SSA/4ba+Mn/QmfCL/xH/wf/wDKqiiiv0n/AFT4Y/6A6f3S/wDlgH//2Q==\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAAECAYAAADMHGwBAAAABHNCSVQICAgIfAhkiAAAAHNJREFUKJFjdGEM+c8ABTufXWBwlzJgQAe4xNHVMDAwoKiD6cMmRwlANhdmJuPf5yr/cVlCjAdIdQAMELIP3bHobkEPJEZYjKBLYLMMV6gji+GykJDHcHkOm9uwqWNETlqEDEF2LD7LiUlK+JIxTC8pKQIA7jhk1J8wofAAAAAASUVORK5CYII=\n",
"text/plain": [
"Image (1, 4, 50)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test open sequence image function\n",
"open_seq_image('CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGACACC')"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"class SeqItemList(ImageItemList):\n",
" _bunch,_square_show = ImageDataBunch,True\n",
" def __post_init__(self):\n",
" super().__post_init__()\n",
" self.sizes={}\n",
" \n",
" def open(self, seq): return open_seq_image(seq)\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, cols:IntsOrStrs=0, **kwargs)->'ItemList':\n",
" \"Get the sequences in `col` of `df` and will had `path/folder` in front of them, `suffix` at the end.\"\n",
" return cls(items=df[cols].values)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"bs = 64"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"data = (SeqItemList.import_from_df(seq_df, ['Sequences'])\n",
" .random_split_by_pct(valid_pct=0.25)\n",
" #.split_by_idxs(range(1500), range(1500,2000))\n",
" .label_from_list(seq_df['Target'].values) # --> Two categories! AND WRONG LOSS FUNCTION!?\n",
" #.label_from_list(targ) # --> MultiCategory\n",
" #.label_from_list(seq_df['MultiTarget'], sep=';')\n",
" #.label_from_list(seq_df['Target'].values, sep=';')\n",
" .databunch(bs=bs))"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Verify data object"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"#### Check data object"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"ImageDataBunch;\n",
"\n",
"Train: LabelList\n",
"y: CategoryList (2000 items)\n",
"[Category 0, Category 0, Category 0, Category 1, Category 1]...\n",
"Path: .\n",
"x: SeqItemList (1500 items)\n",
"[Image (1, 4, 50), Image (1, 4, 50), Image (1, 4, 50), Image (1, 4, 50), Image (1, 4, 50)]...\n",
"Path: .;\n",
"\n",
"Valid: LabelList\n",
"y: CategoryList (2000 items)\n",
"[Category 0, Category 0, Category 0, Category 1, Category 1]...\n",
"Path: .\n",
"x: SeqItemList (500 items)\n",
"[Image (1, 4, 50), Image (1, 4, 50), Image (1, 4, 50), Image (1, 4, 50), Image (1, 4, 50)]...\n",
"Path: .;\n",
"\n",
"Test: None"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"(2, [0, 1])"
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check classes\n",
"data.c, data.classes"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"64"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_dl.batch_size"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# show array data of one batch\n",
"#next(iter(data.train_dl))"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"#### Check data points"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAEADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD4w8Ny6l4h/wCEMjg8RavpkXi34ReJviPYjS9ZuY5vDeteHv7ej0f7DcmRrmSC0tfD1taQR3kt0beG7vfIaKWcSp5F/wANpfGDwt/xKvgLN/wq/wAPP++uPB/g3XtWl0qe/wD4dTaDUr27xeptgMdwpV4JLS3li8uWJZAUV9NwtlOWZnisTDF0Y1Iw5bRklKOtXGxu4tOLfLRp2lKMpJx5oyjKU5VP2wP+G0vjB4k/dfGub/hY8EnyX8HjDXtWX+0oT8zxXj2N7bSXm+WLTpDLMzzD+xtNiWRYLZYSf8NmfESD/QtL+HXw6s9Ktfm0bw/D8PtPawspF+SGeaGSNhq88Nu1xbxTar9ukjS8uJFYTyeeCivsf9U+GtlhIJfypOMV5qEZRhF9Lxgnb3bqOgHrvhC+8V/Ef9lTXP2vPiV471fXvEei/wBqxNaXc0cMN9aWV94XsZLOWe3SO9SC9i8X6018IbmJr2aZZ5mebfJJyOi/GDUvEHwG8SftK6t4U0ibxZoPi7RPDmoyuLk2HiGyv7XVbq3iv9OM32JoNOl0TTTZ2cMMNkqWyRz29xGqopRX5tl+EwtetjoygrU8wp0IJLlUaMnHmppR5VyO+1t7NNNRcQ/RX9n/AP4N/P2OP2kfgN4J/aJ8d/Ej4i2euePvCOm+I9Zs/D91o9jYQXd9ax3M0dtbR6bst4FeVgkS/KiBVHAooor/ADY4j8ePGTAcRY3C4bPcRCnTrVoQipQtGMK1WEYr909IxjGK1eiWr3Yf/9k=\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAAECAYAAADMHGwBAAAABHNCSVQICAgIfAhkiAAAAHBJREFUKJFjdGEM+b/z2QUGdykDBgYGBgZcbBgfBtylDLDykWlsAJuZ2PQQcge6+YwujCH/8SnABYgxHFkO2cPIYuieIMdcdykDBsa/z1X+oytENxjdEcR4EJ8+YgMMmztweRgeI6SEBK0AOUkTJgYA3Nhz1DR798MAAAAASUVORK5CYII=\n",
"text/plain": [
"Image (1, 4, 50)"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"i = 2\n",
"data.x[i]"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"Category 0"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.y[i]"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAEADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD4C+Nvxp8V/s9eMrL4bfCrTdI0vw5P4R8P+JtP0y00uOCbTdU1PR7PWIrqK/h2X8k+n3d7J9huJ7maeCENA0ksM91HOfBL45fET46eMr34fa/caRpeh2/hHxB4pu/D+ieGNPj0e+1rRtHvNUtL9tJkgk06CdjYWlnM9tbQme0SWJ9xuLl5iivpv7Jyz/UX+0XRi6/subnavLm57czbbvK32mua/vcylq/2w679kmSf9t7/AIWbY/tCW+kX2lfCr4Ra18QfD2i6J4T0rSIZLvTfJ8vTGksbWKe30uU3E8k1paS26vNPLcApPI8zeRf8NrfGeT/iY3K6QuuTfNqfi3TbA6ZrGqSR/vbOe7vLB4Jbie3vcagJnYyXF3HBJeNdi2tkhKKMlynLMZxhnOArUYyo4f6p7KFvdh7XD1KlXlV7fvJxjOd+ZSlFNq6uB1/xJ+NPiv4I+Dfh/wCJPgbpukeFtN+IfhGbxHfeFk0uPVbDSbtdY1LSLiOwbVvtdzbwXlrpdut5EZmW8Rnhn8y28u3TkP8AhtH4rP8A6be+HPCOpah/Dd+IvC8Gr20Gfkf7Ppt+J9Nst0EOnWo+zWsXlW2kWUMXlIJhMUV7OQcPZHjssVbEYeM5udVOTTcmo168I80uZSlaMIxvKTbUVzOTu5B1/wC0B4y+BP7PXx58bfALRv2Kvh1r1n4H8Xal4ftdc8Qa14o+36jHZXUlstzc/ZdZgg8+QRh38mGKPezbI0XCgooo4cyHLsfw7gsViPaSqVKNGcn7fEaynRpTk9MQlrKUnoktdElZIP/Z\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAAECAYAAADMHGwBAAAABHNCSVQICAgIfAhkiAAAAHRJREFUKJFjdGEM+c+ABHY+u8DgLmWAwYbxGRgYUMSw6SMkDhPDZj42u3GpRwaMMI8gOxLdEHTHIxsMA8h8bA7HZjY2gK4Wn3nIcox/n6v8JyYkCTkAl6MIhTi+WMZmFq4YZnRhDPlPDUeiyxHjOGLNI0YfAGvwc9QnBcXaAAAAAElFTkSuQmCC\n",
"text/plain": [
"Image (1, 4, 50)"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"i = 3\n",
"data.x[i]"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"Category 1"
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.y[i]"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"data.show_batch(rows=2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model setup"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Basic model for PyTorch training"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"def Flatten(): return Lambda(lambda x: x.view((x.size(0), -1)))"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"def ResizeInput(): return Lambda(lambda x: x.view((-1,)+x.size()[-2:]))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"#def ResizeOutput(): return Lambda(lambda x: x.view(-1))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"drop_p = 0.2"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"# inplace=True seems to generate problems?"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"net_basic = nn.Sequential(ResizeInput(),\n",
" nn.Conv1d(in_channels=4, out_channels=32, kernel_size=12),\n",
" nn.MaxPool1d(kernel_size=4),\n",
" Flatten(),\n",
" nn.Dropout(drop_p),\n",
" nn.Linear(in_features=288, out_features=16),\n",
" nn.ReLU(),\n",
" nn.Dropout(drop_p),\n",
" nn.Linear(in_features=16, out_features=2),\n",
" #nn.Dropout(drop_p), # not at the end?\n",
" #Debugger()\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Sequential(\n",
" (0): Lambda()\n",
" (1): Conv1d(4, 32, kernel_size=(12,), stride=(1,))\n",
" (2): MaxPool1d(kernel_size=4, stride=4, padding=0, dilation=1, ceil_mode=False)\n",
" (3): Lambda()\n",
" (4): Dropout(p=0.2)\n",
" (5): Linear(in_features=288, out_features=16, bias=True)\n",
" (6): ReLU()\n",
" (7): Dropout(p=0.2)\n",
" (8): Linear(in_features=16, out_features=2, bias=True)\n",
")"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check network architecture\n",
"net_basic"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"# initialize weights with kaiming normal initialization\n",
"apply_init(net_basic, nn.init.kaiming_normal_)"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"## Basic model for fastai training"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"def Flatten(): return Lambda(lambda x: x.view((x.size(0), -1)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"def ResizeInput(): return Lambda(lambda x: x.view((-1,)+x.size()[-2:]))"
]
},
{
"cell_type": "code",
"execution_count": 184,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"drop_p = 0.4"
]
},
{
"cell_type": "code",
"execution_count": 194,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"net_basic_fastai = nn.Sequential(ResizeInput(),\n",
" nn.Conv1d(in_channels=4, out_channels=32, kernel_size=12),\n",
" nn.MaxPool1d(kernel_size=4),\n",
" Flatten(),\n",
" nn.Dropout(drop_p),\n",
" nn.Linear(in_features=288, out_features=16),\n",
" nn.ReLU(),\n",
" nn.Dropout(drop_p),\n",
" nn.Linear(in_features=16, out_features=2),\n",
" #nn.Dropout(drop_p), # not at the end?\n",
" #Debugger()\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 195,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"Sequential(\n",
" (0): Lambda()\n",
" (1): Conv1d(4, 32, kernel_size=(12,), stride=(1,))\n",
" (2): MaxPool1d(kernel_size=4, stride=4, padding=0, dilation=1, ceil_mode=False)\n",
" (3): Lambda()\n",
" (4): Dropout(p=0.4)\n",
" (5): Linear(in_features=288, out_features=16, bias=True)\n",
" (6): ReLU()\n",
" (7): Dropout(p=0.4)\n",
" (8): Linear(in_features=16, out_features=2, bias=True)\n",
")"
]
},
"execution_count": 195,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"net_basic_fastai"
]
},
{
"cell_type": "code",
"execution_count": 196,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# initialize weights with kaiming normal initialization\n",
"apply_init(net_basic_fastai, nn.init.kaiming_normal_)"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"## Custom fastai ResNet model"
]
},
{
"cell_type": "code",
"execution_count": 230,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"learn_dummy = create_cnn(data, models.resnet18)"
]
},
{
"cell_type": "code",
"execution_count": 231,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"CrossEntropyLoss()"
]
},
"execution_count": 231,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn_dummy.loss_func.func"
]
},
{
"cell_type": "code",
"execution_count": 233,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"#learn_resnet.model[0]"
]
},
{
"cell_type": "code",
"execution_count": 234,
"metadata": {
"hidden": true
},
"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": 234,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn_dummy.model[1]"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Setup custom input stage"
]
},
{
"cell_type": "code",
"execution_count": 235,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"# define function to create 3 channel image from 1 channel image.\n",
"def ExpandInput(): return Lambda(lambda x: x.expand(-1, 3, 4, 50))"
]
},
{
"cell_type": "code",
"execution_count": 236,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"EI = ExpandInput()"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"#### Test ExpandInput layer"
]
},
{
"cell_type": "code",
"execution_count": 237,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([64, 1, 4, 50])"
]
},
"execution_count": 237,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tt = torch.rand((64,1,4,50)); tt.shape"
]
},
{
"cell_type": "code",
"execution_count": 238,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([64, 3, 4, 50])"
]
},
"execution_count": 238,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tt.expand(-1, 3, 4, 50).shape"
]
},
{
"cell_type": "code",
"execution_count": 239,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAEADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0L9jzUtGv/jVZ/BpfBWlR+FPHXwLfU9Z0N/PuIxei2aw+0iS4lkllkNpCluWneUmN5lPFxP5nl/7DllP8RP2o/g18HPiDrF9rOneOdF8Uabq0t3clPs8FvcavdoLW3i2Wltvk0w+aEgC3B1C6kmEky2stsUUAeo/HD4C+EdU+Bng/4i6VqN/oGsaTf+KNV0rUPC62+mz2V8i3Fk0sUtvEskcckD20clsrC1kTTbOMw+VG0b7n7Pvwa+EnjD/gn343/aQtPhzpejeIPhp8Pte8RaAmmxvJDI9/4Z1i4mtJftTTSC3Etysi+U8cu+2ikaR5DM8pRQB8xf8ABQ26n/ZL0bxJ8ZvhfNI93o98dUstDvpnTSI5NPt/B2i2iR2VsYorcR2es3KpJAI5kEUCJIkUflN7f8IPgp8OfjRaWHgLx34btLnStU+Ad78UrG3NjA7aNql/Db6i1pZySIzpaxX2qXNypdnunKwxz3E8MSQgooA+H7T/AILqftD+H7SLQdc/Zx+EHiK9sY1t7zxBrWm60LzU5UG17qcW2qRQiWRgXfyoo49zHaiLhQUUUAf/2Q==\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAAECAYAAADMHGwBAAAABHNCSVQICAgIfAhkiAAAAsxJREFUKJEFwU8oswEcB/Dv2xubRj27aP7UehZ6aoqbi7QMB7QcVv4eJKVxYaOmXd4RrTlInssepHYQ82hx2JbDE5NmJS4OVtQ2NTbimWcus/Z7P58/NpuNOI7D9vY2FhYWMDw8DI/Hg6WlJQwMDKCnpweSJCEWi4HneUQiEYyMjKBYLOLm5gbv7+8wmUw4PT2FKIowGAyoqalBJBJBMplEIBDAxcUFNjc3cXd3h+vra1RUVMDhcECSJOzu7iKRSKCpqQl7e3toaWnB6Ogouru7YTKZkEql4PF4cHh4iHQ6jWAwCEVRkMvlwHEc7HY77u/v8YdhGOJ5HuFwGBMTEzg7O8PGxgaurq6QzWbx8vICvV6PQCCAUCiElZUV5PN5sCyLcrkMq9UKp9MJi8WC2tpaaDQa9Pf3I5/PY2xsDIqiQKfToVwuw2w2o1AoIBgM4vj4GLOzs5ibm0M8HgfP85BlGQaDAXq9Hu3t7Xh+fkZDQwMODg4gSRJmZmZgt9uRy+Vwfn4OIkJXVxeKxSIQj8cpFovR0dERdXR0kNvtpmQySYVCgfx+P9XX15PRaCSbzUa3t7ekUqno5+eH1tbWSBRFcjqdtLq6Sk9PT9TX10f7+/vEcRyJokiNjY2USqVoenqaZFmmaDRK2WyWNBoNpdNpcrlctL6+ToIgEMuyJAgCuVwuam1tJYfDQX6/n15fX8lsNpNWq6WHhwfy+XxksVgok8nQ0NAQVVZWkizL9Pf7+/ufSqUCwzBIJBLIZDJQq9XQarUAgN/fX3x9fWFqago7OztgWRZutxuCIECn0+Hz8xMfHx9obm7G4OAgHh8f0dnZiVKpBIZh4PP50Nvbi8vLS1RVVaGtrQ2Tk5Ooq6vD/Pw8xsfHUV1djVKpBKvViuXlZXi9XiwuLiIcDiMYDOLk5ARGoxGhUAjRaBRbW1tQq9VQFAVvb2/wer34D7Y2cqnH+KS8AAAAAElFTkSuQmCC\n",
"text/plain": [
"Image (3, 4, 50)"
]
},
"execution_count": 239,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Image(EI(tt)[0])"
]
},
{
"cell_type": "markdown",
"metadata": {
"hidden": true
},
"source": [
"### Insert custom input stage"
]
},
{
"cell_type": "code",
"execution_count": 240,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"net_custom_resnet = nn.Sequential(ExpandInput(), learn_dummy.model) # insert ExpandInput layer at the beginning of the network"
]
},
{
"cell_type": "code",
"execution_count": 242,
"metadata": {
"hidden": true
},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([64, 3, 4, 50])"
]
},
"execution_count": 242,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# run dummy data through custom input stage to test it\n",
"net_custom_resnet[0](tt).shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model training"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train basic model with PyTorch"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"bs = 64"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"train_dl = DataLoader(train_ds, batch_size=bs, shuffle=True)\n",
"valid_dl = DataLoader(valid_ds, batch_size=bs*2, shuffle=False)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"opt = optim.SGD(net_basic.parameters(), lr=1e-3, momentum=0.9)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"# Based on https://github.com/fastai/fastai_docs/blob/master/dev_nb/mnist_sample.py\n",
"\n",
"def simple_loss_batch(model, loss_func, xb, yb, opt=None):\n",
" loss = loss_func(model(xb), yb)\n",
"\n",
" if opt is not None:\n",
" loss.backward()\n",
" opt.step()\n",
" opt.zero_grad()\n",
"\n",
" return loss.item(), len(xb)\n",
"\n",
"def simple_fit(epochs, model, loss_func, opt, train_dl, valid_dl):\n",
" for epoch in range(epochs):\n",
" model.train()\n",
" for xb,yb in train_dl: simple_loss_batch(model, loss_func, xb, yb, opt)\n",
"\n",
" model.eval()\n",
" with torch.no_grad():\n",
" losses,nums = zip(*[simple_loss_batch(model, loss_func, xb, yb)\n",
" for xb,yb in valid_dl])\n",
" \n",
" # Accuracy metric:\n",
" thr = 0.5\n",
" comp = [np.array(torch.sigmoid(model(xb)).detach().numpy()>thr).astype(int)==yb.detach().numpy().astype(int)\n",
" for xb,yb in valid_dl]\n",
" acc = np.concatenate(comp).mean()\n",
" \n",
" # use fastai accuracy() func?\n",
" #output = \n",
" \n",
" val_loss = np.sum(np.multiply(losses,nums)) / np.sum(nums)\n",
"\n",
" #if epoch % 10 == 0:\n",
" print(epoch, val_loss, acc)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 0.19586651754379272 0.932\n",
"1 0.19660570287704468 0.929\n",
"2 0.19295910632610322 0.93\n",
"3 0.19240641164779662 0.931\n",
"4 0.18970949673652648 0.935\n",
"5 0.18764417684078216 0.933\n",
"6 0.18706315910816193 0.935\n",
"7 0.18746764409542083 0.932\n",
"8 0.1857880744934082 0.937\n",
"9 0.18319485437870026 0.94\n",
"10 0.1809044394493103 0.938\n",
"11 0.18096670472621917 0.936\n",
"12 0.1783504251241684 0.941\n",
"13 0.17732288146018982 0.94\n",
"14 0.17641971135139464 0.939\n",
"15 0.1762392818927765 0.939\n",
"16 0.17381491482257844 0.941\n",
"17 0.17343695032596587 0.942\n",
"18 0.17324936163425445 0.939\n",
"19 0.17034213876724244 0.944\n",
"20 0.1676717177629471 0.946\n",
"21 0.1668849548101425 0.945\n",
"22 0.16691377973556518 0.942\n",
"23 0.16495974087715148 0.943\n",
"24 0.1630959119796753 0.949\n",
"25 0.16274057507514952 0.947\n",
"26 0.16158011531829833 0.95\n",
"27 0.16742867410182952 0.941\n",
"28 0.15947548139095308 0.95\n",
"29 0.1593805228471756 0.947\n",
"30 0.1568965196609497 0.951\n",
"31 0.15801458489894868 0.947\n",
"32 0.15776014626026152 0.949\n",
"33 0.15457441079616546 0.951\n",
"34 0.15362511539459228 0.952\n",
"35 0.15219071578979493 0.952\n",
"36 0.1506350815296173 0.953\n",
"37 0.1537935564517975 0.952\n",
"38 0.14976262950897218 0.953\n",
"39 0.1489207707643509 0.953\n",
"40 0.14762648367881775 0.955\n",
"41 0.14656222760677337 0.954\n",
"42 0.14717706191539764 0.955\n",
"43 0.14746305215358735 0.955\n",
"44 0.1449376015663147 0.955\n",
"45 0.14503019607067108 0.949\n",
"46 0.1485990196466446 0.955\n",
"47 0.1428705039024353 0.955\n",
"48 0.1437623779773712 0.956\n",
"49 0.14199172329902648 0.957\n"
]
}
],
"source": [
"simple_fit(50, net_basic, F.binary_cross_entropy_with_logits, opt, train_dl, valid_dl)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [],
"source": [
"valid_dl = DataLoader(valid_ds, batch_size=bs*2, shuffle=False)"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(torch.Size([128, 1, 4, 50]), torch.Size([128, 2]))"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xbatch, ybatch = next(iter(valid_dl)); xbatch.shape, ybatch.shape"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0, 1],\n",
" [1, 0],\n",
" [1, 0],\n",
" [1, 0],\n",
" [1, 0],\n",
" [1, 0],\n",
" [1, 0],\n",
" [1, 0],\n",
" [0, 1],\n",
" [1, 0]])"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ybatch[:10].detach().numpy().astype(int)"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0, 1],\n",
" [1, 0],\n",
" [1, 0],\n",
" [1, 0],\n",
" [1, 0],\n",
" [1, 0],\n",
" [0, 1],\n",
" [1, 0],\n",
" [0, 1],\n",
" [1, 0]])"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.array(torch.sigmoid(net_basic(xbatch[:10])).detach().numpy()>0.5).astype(int)"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"#np.array(torch.sigmoid(net(xbatch)).detach().numpy()>0.5).astype(int)==ybatch.detach().numpy().astype(int)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9453125"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.array(np.array(torch.sigmoid(net_basic(xbatch)).detach().numpy()>0.5).astype(int)==ybatch.detach().numpy().astype(int)).mean()"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9453125"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.concatenate(np.array(torch.sigmoid(net_basic(xbatch)).detach().numpy()>0.5).astype(int)==ybatch.detach().numpy().astype(int)).mean()"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.957"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.concatenate([np.array(torch.sigmoid(net_basic(xb)).detach().numpy()>0.5).astype(int)==yb.detach().numpy().astype(int) for xb,yb in valid_dl]).mean()\n"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.9453125, 0.94921875, 0.98046875, 0.9525862068965517]"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[np.concatenate(np.array(torch.sigmoid(net_basic(xb)).detach().numpy()>0.5).astype(int)==yb.detach().numpy().astype(int)).mean() for xb,yb in valid_dl]\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'data' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-55-6ff02be695bd>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_ds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_ds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'data' is not defined"
]
}
],
"source": [
"data.train_ds[0][1], data.train_ds[3][1]"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'data' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-56-1af02c3ed750>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnet_basic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_ds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnet_basic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_ds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'data' is not defined"
]
}
],
"source": [
"net_basic(data.train_ds[0][0].data), net_basic(data.train_ds[3][0].data)"
]
},
{
"cell_type": "code",
"execution_count": 169,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[False, True]])"
]
},
"execution_count": 169,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"torch.sigmoid(net_basic(data.train_ds[0][0].data)).detach().numpy()>0.5"
]
},
{
"cell_type": "code",
"execution_count": 170,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ True, False]])"
]
},
"execution_count": 170,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"torch.sigmoid(net_basic(data.train_ds[3][0].data)).detach().numpy()>0.5"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"## Tensorboard logger"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"hidden": true
},
"outputs": [],
"source": [
"import tensorflow as tf\n",
"\n",
"# From https://gist.github.com/gyglim/1f8dfb1b5c82627ae3efcfbbadb9f514\n",
"\"\"\"Simple example on how to log scalars and images to tensorboard without tensor ops.\n",
"License: Copyleft\n",
"\"\"\"\n",
"#__author__ = \"Michael Gygli\"\n",
"\n",
"#import tensorflow as tf\n",
"#from StringIO import StringIO\n",
"#import matplotlib.pyplot as plt\n",
"#import numpy as np\n",
"\n",
"class Logger(object):\n",
" \"\"\"Logging in tensorboard without tensorflow ops.\"\"\"\n",
"\n",
" def __init__(self, log_dir):\n",
" \"\"\"Creates a summary writer logging to log_dir.\"\"\"\n",
" self.writer = tf.summary.FileWriter(log_dir)\n",
"\n",
" def log_scalar(self, tag, value, step):\n",
" \"\"\"Log a scalar variable.\n",
" Parameter\n",
" ----------\n",
" tag : basestring\n",
" Name of the scalar\n",
" value\n",
" step : int\n",
" training iteration\n",
" \"\"\"\n",
" summary = tf.Summary(value=[tf.Summary.Value(tag=tag,\n",
" simple_value=value)])\n",
" self.writer.add_summary(summary, step)\n",
"\n",
" def log_images(self, tag, images, step):\n",
" \"\"\"Logs a list of images.\"\"\"\n",
"\n",
" im_summaries = []\n",
" for nr, img in enumerate(images):\n",
" # Write the image to a string\n",
" s = StringIO()\n",
" plt.imsave(s, img, format='png')\n",
"\n",
" # Create an Image object\n",
" img_sum = tf.Summary.Image(encoded_image_string=s.getvalue(),\n",
" height=img.shape[0],\n",
" width=img.shape[1])\n",
" # Create a Summary value\n",
" im_summaries.append(tf.Summary.Value(tag='%s/%d' % (tag, nr),\n",
" image=img_sum))\n",
"\n",
" # Create and write Summary\n",
" summary = tf.Summary(value=im_summaries)\n",
" self.writer.add_summary(summary, step)\n",
" \n",
"\n",
" def log_histogram(self, tag, values, step, bins=1000):\n",
" \"\"\"Logs the histogram of a list/vector of values.\"\"\"\n",
" # Convert to a numpy array\n",
" values = np.array(values)\n",
" \n",
" # Create histogram using numpy \n",
" counts, bin_edges = np.histogram(values, bins=bins)\n",
"\n",
" # Fill fields of histogram proto\n",
" hist = tf.HistogramProto()\n",
" hist.min = float(np.min(values))\n",
" hist.max = float(np.max(values))\n",
" hist.num = int(np.prod(values.shape))\n",
" hist.sum = float(np.sum(values))\n",
" hist.sum_squares = float(np.sum(values**2))\n",
"\n",
" # Requires equal number as bins, where the first goes from -DBL_MAX to bin_edges[1]\n",
" # See https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/summary.proto#L30\n",
" # Thus, we drop the start of the first bin\n",
" bin_edges = bin_edges[1:]\n",
"\n",
" # Add bin edges and counts\n",
" for edge in bin_edges:\n",
" hist.bucket_limit.append(edge)\n",
" for c in counts:\n",
" hist.bucket.append(c)\n",
"\n",
" # Create and write Summary\n",
" summary = tf.Summary(value=[tf.Summary.Value(tag=tag, histo=hist)])\n",
" self.writer.add_summary(summary, step)\n",
" self.writer.flush()\n",
" \n",
"\"A `Callback` that saves tracked metrics into a log file for Tensorboard.\"\n",
"# Based on https://gist.github.com/gyglim/1f8dfb1b5c82627ae3efcfbbadb9f514\n",
"# and devforfu: https://nbviewer.jupyter.org/gist/devforfu/ea0b3fcfe194dad323c3762492b05cae\n",
"# Contribution from MicPie\n",
"\n",
"#from ..torch_core import *\n",
"#from ..basic_data import DataBunch\n",
"#from ..callback import *\n",
"#from ..basic_train import Learner, LearnerCallback\n",
"#import tensorflow as tf\n",
"\n",
"__all__ = ['TBLogger']\n",
"\n",
"@dataclass\n",
"class TBLogger(LearnerCallback):\n",
" \"A `LearnerCallback` that saves history of metrics while training `learn` into log files for Tensorboard.\"\n",
" \n",
" log_dir:str = 'logs'\n",
" log_name:str = 'data'\n",
" log_scalar:bool = True # log scalar values for Tensorboard scalar summary\n",
" log_hist:bool = True # log values and gradients of the parameters for Tensorboard histogram summary\n",
" log_img:bool = False # log values for Tensorboard image summary\n",
"\n",
" def __post_init__(self): \n",
" super().__post_init__()\n",
" #def __init__(self):\n",
" # super().__init__()\n",
" self.path = self.learn.path\n",
" (self.path/self.log_dir).mkdir(parents=True, exist_ok=True) # setup logs directory\n",
" self.Log = Logger(str(self.path/self.log_dir/self.log_name))\n",
" self.epoch = 0\n",
" self.batch = 0\n",
" self.log_grads = {}\n",
" \n",
" def on_backward_end(self, **kwargs:Any):\n",
" self.batch = self.batch+1\n",
" #print('\\nBatch: ',self.batch)\n",
" \n",
" if self.log_hist:\n",
" for tag, value in learn.model.named_parameters():\n",
" tag_grad = tag.replace('.', '/')+'/grad'\n",
" \n",
" if tag_grad in self.log_grads:\n",
" #self.log_grads[tag_grad] += value.grad.data.cpu().detach().numpy()\n",
" self.log_grads[tag_grad] = self.log_grads[tag_grad] + value.grad.data.cpu().detach().numpy() # gradients are summed up from every batch\n",
" #print('if')\n",
" else:\n",
" self.log_grads[tag_grad] = value.grad.data.cpu().detach().numpy()\n",
" #print('else')\n",
" \n",
" #print(tag_grad, self.log_grads[tag_grad].sum())\n",
" return self.log_grads\n",
" \n",
" #def on_step_end(self, **kwards:Any):\n",
" #print('Step end: ', self.log_grads)\n",
"\n",
" def on_epoch_end(self, epoch:int, smooth_loss:Tensor, last_metrics:MetricsList, **kwargs:Any) -> bool:\n",
" last_metrics = ifnone(last_metrics, [])\n",
" tr_info = {name: stat for name, stat in zip(self.learn.recorder.names, [epoch, smooth_loss] + last_metrics)}\n",
" self.epoch = tr_info['epoch']\n",
" self.batch = 0 # reset batch count\n",
" #print('\\nEpoch: ',self.epoch)\n",
" \n",
" if self.log_scalar:\n",
" for tag, value in tr_info.items():\n",
" if tag == 'epoch': continue\n",
" self.Log.log_scalar(tag, value, self.epoch+1)\n",
" \n",
" if self.log_hist:\n",
" for tag, value in learn.model.named_parameters():\n",
" \n",
" tag = tag.replace('.', '/')\n",
" self.Log.log_histogram(tag, value.data.cpu().numpy(), self.epoch+1)\n",
" \n",
" tag_grad = tag.replace('.', '/')+'/grad'\n",
" self.Log.log_histogram(tag_grad, self.log_grads[tag_grad], self.epoch+1)\n",
" #print(tag_grad, self.log_grads[tag_grad].sum())\n",
" \n",
" #if self.log_img:\n",
" # for tag, value in learn.model.named_parameters():\n",
" # \n",
" # tag = tag.replace('.', '/')\n",
" # self.Log.log_images(tag, value.data.cpu().numpy(), self.epoch+1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train basic model with fastai"
]
},
{
"cell_type": "code",
"execution_count": 208,
"metadata": {},
"outputs": [],
"source": [
"#learn = Learner(data, net, loss_func=nn.functional.cross_entropy, metrics=accuracy)#, callback_fns=[TBLogger])"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {},
"outputs": [],
"source": [
"#def accuracy_float(input:Tensor, targs:LongTensor)->Rank0Tensor:\n",
"# \"Compute accuracy with `targs` when `input` is bs * n_classes.\"\n",
"# n = targs.shape[0]\n",
"# input = input.argmax(dim=-1).view(n,-1)\n",
"# targs = targs.type(torch.long) # convert to torch.long = int64 --> difference to accuracy metric!\n",
"# targs = targs.view(n,-1)\n",
"# return (input==targs).float().mean()"
]
},
{
"cell_type": "code",
"execution_count": 197,
"metadata": {},
"outputs": [],
"source": [
"learn = Learner(data, net_basic_fastai, loss_func=nn.CrossEntropyLoss(), metrics=accuracy)#_float)#, callback_fns=[TBLogger])"
]
},
{
"cell_type": "code",
"execution_count": 198,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"======================================================================\n",
"Layer (type) Output Shape Param # Trainable \n",
"======================================================================\n",
"Lambda [64, 4, 50] 0 False \n",
"______________________________________________________________________\n",
"Conv1d [64, 32, 39] 1568 True \n",
"______________________________________________________________________\n",
"MaxPool1d [64, 32, 9] 0 False \n",
"______________________________________________________________________\n",
"Lambda [64, 288] 0 False \n",
"______________________________________________________________________\n",
"Dropout [64, 288] 0 False \n",
"______________________________________________________________________\n",
"Linear [64, 16] 4624 True \n",
"______________________________________________________________________\n",
"ReLU [64, 16] 0 False \n",
"______________________________________________________________________\n",
"Dropout [64, 16] 0 False \n",
"______________________________________________________________________\n",
"Linear [64, 2] 34 True \n",
"______________________________________________________________________\n",
"\n",
"Total params: 6226\n",
"Total trainable params: 6226\n",
"Total non-trainable params: 0\n"
]
}
],
"source": [
"learn.summary()"
]
},
{
"cell_type": "code",
"execution_count": 190,
"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": 199,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Total time: 01:10 <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</th>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <th>0.808901</th>\n",
" <th>0.696700</th>\n",
" <th>0.486000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <th>0.745595</th>\n",
" <th>0.691503</th>\n",
" <th>0.526000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <th>0.723365</th>\n",
" <th>0.692632</th>\n",
" <th>0.526000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <th>0.711237</th>\n",
" <th>0.692701</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <th>0.704650</th>\n",
" <th>0.692727</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <th>0.699970</th>\n",
" <th>0.692452</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <th>0.697248</th>\n",
" <th>0.693120</th>\n",
" <th>0.520000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <th>0.696850</th>\n",
" <th>0.692632</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <th>0.695233</th>\n",
" <th>0.692109</th>\n",
" <th>0.538000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <th>0.695056</th>\n",
" <th>0.692462</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <th>0.693362</th>\n",
" <th>0.692276</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <th>0.693612</th>\n",
" <th>0.692432</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <th>0.693073</th>\n",
" <th>0.692542</th>\n",
" <th>0.522000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <th>0.694058</th>\n",
" <th>0.692453</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <th>0.694301</th>\n",
" <th>0.692406</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <th>0.694489</th>\n",
" <th>0.692508</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <th>0.693986</th>\n",
" <th>0.692486</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <th>0.693991</th>\n",
" <th>0.692442</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <th>0.693757</th>\n",
" <th>0.692496</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <th>0.693211</th>\n",
" <th>0.692496</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <th>0.693314</th>\n",
" <th>0.692187</th>\n",
" <th>0.532000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <th>0.693238</th>\n",
" <th>0.692367</th>\n",
" <th>0.520000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <th>0.692705</th>\n",
" <th>0.692310</th>\n",
" <th>0.526000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <th>0.693227</th>\n",
" <th>0.692130</th>\n",
" <th>0.534000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <th>0.692926</th>\n",
" <th>0.692118</th>\n",
" <th>0.526000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <th>0.691910</th>\n",
" <th>0.691956</th>\n",
" <th>0.544000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <th>0.692560</th>\n",
" <th>0.693303</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <th>0.692612</th>\n",
" <th>0.691863</th>\n",
" <th>0.522000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <th>0.692581</th>\n",
" <th>0.692014</th>\n",
" <th>0.526000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <th>0.690990</th>\n",
" <th>0.692390</th>\n",
" <th>0.516000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <th>0.689374</th>\n",
" <th>0.694501</th>\n",
" <th>0.470000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <th>0.688460</th>\n",
" <th>0.693731</th>\n",
" <th>0.496000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <th>0.688441</th>\n",
" <th>0.694964</th>\n",
" <th>0.488000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <th>0.687376</th>\n",
" <th>0.692058</th>\n",
" <th>0.516000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <th>0.686783</th>\n",
" <th>0.692316</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <th>0.685919</th>\n",
" <th>0.694010</th>\n",
" <th>0.504000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <th>0.684184</th>\n",
" <th>0.694457</th>\n",
" <th>0.504000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <th>0.682486</th>\n",
" <th>0.692658</th>\n",
" <th>0.512000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <th>0.679430</th>\n",
" <th>0.692462</th>\n",
" <th>0.548000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <th>0.678285</th>\n",
" <th>0.696438</th>\n",
" <th>0.500000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <th>0.675987</th>\n",
" <th>0.697282</th>\n",
" <th>0.480000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <th>0.672791</th>\n",
" <th>0.696124</th>\n",
" <th>0.506000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <th>0.674953</th>\n",
" <th>0.693692</th>\n",
" <th>0.522000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <th>0.671516</th>\n",
" <th>0.695707</th>\n",
" <th>0.494000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <th>0.670069</th>\n",
" <th>0.698502</th>\n",
" <th>0.486000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <th>0.670285</th>\n",
" <th>0.699495</th>\n",
" <th>0.466000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <th>0.664861</th>\n",
" <th>0.700545</th>\n",
" <th>0.502000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>48</th>\n",
" <th>0.658696</th>\n",
" <th>0.701243</th>\n",
" <th>0.514000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <th>0.654874</th>\n",
" <th>0.704650</th>\n",
" <th>0.490000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>50</th>\n",
" <th>0.652405</th>\n",
" <th>0.704934</th>\n",
" <th>0.498000</th>\n",
" </tr>\n",
"</table>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn.fit(50, lr=1e-3)"
]
},
{
"cell_type": "code",
"execution_count": 200,
"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": 201,
"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": 191,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Total time: 01:10 <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</th>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <th>1.168377</th>\n",
" <th>0.913809</th>\n",
" <th>0.474000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <th>1.095537</th>\n",
" <th>0.783380</th>\n",
" <th>0.478000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <th>1.007020</th>\n",
" <th>0.709974</th>\n",
" <th>0.520000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <th>0.924864</th>\n",
" <th>0.696400</th>\n",
" <th>0.526000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <th>0.861490</th>\n",
" <th>0.690772</th>\n",
" <th>0.520000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <th>0.810732</th>\n",
" <th>0.688738</th>\n",
" <th>0.522000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <th>0.776933</th>\n",
" <th>0.690691</th>\n",
" <th>0.518000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <th>0.751327</th>\n",
" <th>0.690573</th>\n",
" <th>0.516000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <th>0.732311</th>\n",
" <th>0.691513</th>\n",
" <th>0.506000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <th>0.721617</th>\n",
" <th>0.691588</th>\n",
" <th>0.518000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <th>0.712867</th>\n",
" <th>0.690809</th>\n",
" <th>0.534000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <th>0.706732</th>\n",
" <th>0.691571</th>\n",
" <th>0.530000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <th>0.702839</th>\n",
" <th>0.692533</th>\n",
" <th>0.526000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <th>0.699481</th>\n",
" <th>0.692117</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <th>0.696699</th>\n",
" <th>0.692151</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <th>0.695662</th>\n",
" <th>0.691885</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <th>0.695329</th>\n",
" <th>0.692889</th>\n",
" <th>0.540000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <th>0.694907</th>\n",
" <th>0.692345</th>\n",
" <th>0.526000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <th>0.694748</th>\n",
" <th>0.692222</th>\n",
" <th>0.532000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <th>0.693704</th>\n",
" <th>0.692105</th>\n",
" <th>0.522000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <th>0.693244</th>\n",
" <th>0.693354</th>\n",
" <th>0.484000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <th>0.693644</th>\n",
" <th>0.693125</th>\n",
" <th>0.498000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <th>0.693096</th>\n",
" <th>0.691109</th>\n",
" <th>0.532000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <th>0.691654</th>\n",
" <th>0.690741</th>\n",
" <th>0.534000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <th>0.691456</th>\n",
" <th>0.691289</th>\n",
" <th>0.558000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <th>0.691062</th>\n",
" <th>0.691855</th>\n",
" <th>0.532000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <th>0.691502</th>\n",
" <th>0.691863</th>\n",
" <th>0.540000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <th>0.691360</th>\n",
" <th>0.691669</th>\n",
" <th>0.492000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <th>0.691481</th>\n",
" <th>0.691453</th>\n",
" <th>0.496000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <th>0.690807</th>\n",
" <th>0.691247</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <th>0.689550</th>\n",
" <th>0.691366</th>\n",
" <th>0.506000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <th>0.689335</th>\n",
" <th>0.689921</th>\n",
" <th>0.508000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <th>0.688640</th>\n",
" <th>0.691200</th>\n",
" <th>0.510000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <th>0.689731</th>\n",
" <th>0.690699</th>\n",
" <th>0.504000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>35</th>\n",
" <th>0.689823</th>\n",
" <th>0.690284</th>\n",
" <th>0.522000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <th>0.689101</th>\n",
" <th>0.690490</th>\n",
" <th>0.512000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <th>0.689349</th>\n",
" <th>0.690819</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <th>0.688218</th>\n",
" <th>0.690734</th>\n",
" <th>0.510000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <th>0.688259</th>\n",
" <th>0.690722</th>\n",
" <th>0.520000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <th>0.688508</th>\n",
" <th>0.690674</th>\n",
" <th>0.522000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <th>0.687342</th>\n",
" <th>0.690307</th>\n",
" <th>0.522000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <th>0.687227</th>\n",
" <th>0.690143</th>\n",
" <th>0.524000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <th>0.688657</th>\n",
" <th>0.690059</th>\n",
" <th>0.514000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>44</th>\n",
" <th>0.689325</th>\n",
" <th>0.690089</th>\n",
" <th>0.512000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>45</th>\n",
" <th>0.690231</th>\n",
" <th>0.690118</th>\n",
" <th>0.526000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>46</th>\n",
" <th>0.690485</th>\n",
" <th>0.690157</th>\n",
" <th>0.516000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <th>0.689546</th>\n",
" <th>0.690161</th>\n",
" <th>0.516000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>48</th>\n",
" <th>0.690305</th>\n",
" <th>0.690155</th>\n",
" <th>0.516000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <th>0.688786</th>\n",
" <th>0.690150</th>\n",
" <th>0.518000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>50</th>\n",
" <th>0.687644</th>\n",
" <th>0.690150</th>\n",
" <th>0.518000</th>\n",
" </tr>\n",
"</table>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn.fit_one_cycle(50, max_lr=1e-3)"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEKCAYAAAAB0GKPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xt8XWWd7/HPb19yT9o0TUuhd2gLbSklhEtFpAhyG+UmI3RERVRGHHRmGB1R5wgy44hHXxz0HEdEh3KcYehBEUQGREerCMOtxVIKFVpogdBbek+TNMne+3f+WCvpJk3S3SYre6f7+3699muvvdbKs37PXsn65VnPWs8yd0dERORAYvkOQERERgYlDBERyYkShoiI5EQJQ0REcqKEISIiOVHCEBGRnChhiIhITpQwREQkJ0oYIiKSk0S+AzhYY8eO9alTp+Y7DBGREWX58uVb3b1+MGWMuIQxdepUli1blu8wRERGFDN7Y7BlRHZKyszuMrMtZrbqAOudbGZpM7s8qlhERGTwouzDuBs4f6AVzCwOfBN4LMI4RERkCESWMNz9cWD7AVb7LHA/sCWqOEREZGjkrQ/DzI4CLgXeC5x8gHWvBa4FmDx5cvTBiciw6Orqoqmpib179+Y7lMNGWVkZEydOJJlMDnnZ+ez0vh34orunzWzAFd39TuBOgMbGRj3AQ+Qw0dTURHV1NVOnTuVAxwE5MHdn27ZtNDU1MW3atCEvP58JoxFYEv6SjAUuNLOUuz+Yx5hEZBjt3btXyWIImRl1dXU0NzdHUn7eEoa796Q/M7sbeFjJQqT4KFkMrSi/z8gShpndCywExppZE3ATkARw9zui2u5Alr+xnYqSBMdNqMnH5kVERrTIEoa7LzqIda+OKo5sH/z+UwCsv/XPhmNzIlLgtm3bxtlnnw3Apk2biMfj1NcHN0M/++yzlJSUHLCMj3/849x4443MmjUr0lgLwYi701tEZKjU1dWxYsUKAG6++Waqqqr4/Oc//4513B13Jxbr+y6ExYsXRx5nodDggyIivaxdu5a5c+fy6U9/moaGBjZu3Mi1115LY2Mjc+bM4ZZbbulZ993vfjcrVqwglUoxevRobrzxRk444QQWLFjAli2H1y1mamGISEH42i9e4uUNu4e0zNlH1nDTB+Yc0s++/PLLLF68mDvuCLpcb731VsaMGUMqleKss87i8ssvZ/bs2e/4mV27dnHmmWdy6623csMNN3DXXXdx4403DroehUItDBGRPhx99NGcfPK+e4rvvfdeGhoaaGhoYPXq1bz88sv7/Ux5eTkXXHABACeddBLr168frnCHRdG0MNIZ3e8nUsgOtSUQlcrKyp7pNWvW8J3vfIdnn32W0aNHc9VVV/V5d3p2J3k8HieVSg1LrMOlaFoYe7vS+Q5BREao3bt3U11dTU1NDRs3buSxx4pzvNSiaWF0pjL5DkFERqiGhgZmz57N3LlzmT59Oqeffnq+Q8oLcx9Zp2oaGxv9UB6gtHVPB43/9F+A7sMQKRSrV6/muOOOy3cYh52+vlczW+7ujYMpt2hOSWVGWGIUESk0xZMwdEZKRGRQiidhqIUhIjIoRZMwdFmtiMjgFE3CUAtDRGRwiihh5DsCEZGRrWgShk5JiUhvCxcu3O8mvNtvv53PfOYz/f5MVVUVABs2bODyyy/vt9wDXf5/++2309bW1vP5wgsvZOfOnbmGnhdFkzBG2v0mIhK9RYsWsWTJknfMW7JkCYsWHfhxPkceeSQ//elPD3nbvRPGI488wujRow+5vOFQNAkjrYQhIr1cfvnlPPzww3R0dACwfv16NmzYwPz58zn77LNpaGjg+OOP5+c///l+P7t+/Xrmzp0LQHt7O1deeSXz5s3jiiuuoL29vWe96667rmdY9JtuugmA7373u2zYsIGzzjqLs846C4CpU6eydetWAG677Tbmzp3L3Llzuf3223u2d9xxx/GpT32KOXPmcO65575jO8OhaIYG0SkpkQL36I2w6cWhLfOI4+GCW/tdXFdXxymnnMIvf/lLLr74YpYsWcIVV1xBeXk5DzzwADU1NWzdupXTTjuNiy66qN/nZX//+9+noqKClStXsnLlShoaGnqWff3rX2fMmDGk02nOPvtsVq5cyec+9zluu+02li5dytixY99R1vLly1m8eDHPPPMM7s6pp57KmWeeSW1tLWvWrOHee+/lhz/8IR/60Ie4//77ueqqq4bmu8pB0bQw1MAQkb5kn5bqPh3l7nz5y19m3rx5nHPOObz99tts3ry53zIef/zxngP3vHnzmDdvXs+y++67j4aGBk488UReeumlPodFz/bEE09w6aWXUllZSVVVFZdddhl/+MMfAJg2bRrz588H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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": 193,
"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": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 202,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[tensor([[0.6870, 0.3130],\n",
" [0.6266, 0.3734],\n",
" [0.7430, 0.2570],\n",
" ...,\n",
" [0.5513, 0.4487],\n",
" [0.5263, 0.4737],\n",
" [0.5589, 0.4411]]), tensor([0, 0, 0, ..., 0, 1, 1])]"
]
},
"execution_count": 202,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.get_preds(DatasetType.Train)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 203,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Category 0, Category 1)"
]
},
"execution_count": 203,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_ds[0][1], data.train_ds[3][1]"
]
},
{
"cell_type": "code",
"execution_count": 204,
"metadata": {},
"outputs": [],
"source": [
"#net(data.train_ds[0][0].data), net(data.train_ds[3][0].data)"
]
},
{
"cell_type": "code",
"execution_count": 205,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor([[ 0.0890, -0.0504]], grad_fn=<ThAddmmBackward>),\n",
" tensor([[ 0.1637, -1.3496]], grad_fn=<ThAddmmBackward>))"
]
},
"execution_count": 205,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.model(data.train_ds[0][0].data), net(data.train_ds[3][0].data)"
]
},
{
"cell_type": "code",
"execution_count": 206,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.52224 , 0.487406]], dtype=float32)"
]
},
"execution_count": 206,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"torch.sigmoid(learn.model(data.train_ds[0][0].data)).detach().numpy()#>0.5"
]
},
{
"cell_type": "code",
"execution_count": 207,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.510929, 0.462015]], dtype=float32)"
]
},
"execution_count": 207,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"torch.sigmoid(learn.model(data.train_ds[3][0].data)).detach().numpy()#>0.5"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 208,
"metadata": {},
"outputs": [],
"source": [
"i = 7"
]
},
{
"cell_type": "code",
"execution_count": 209,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Category 0"
]
},
"execution_count": 209,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_ds[i][1]"
]
},
{
"cell_type": "code",
"execution_count": 210,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[ 0.1135, -0.3763]], grad_fn=<ThAddmmBackward>)"
]
},
"execution_count": 210,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.model(data.train_ds[i][0].data)"
]
},
{
"cell_type": "code",
"execution_count": 211,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.528338, 0.407023]], dtype=float32)"
]
},
"execution_count": 211,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"torch.sigmoid(learn.model(data.train_ds[i][0].data)).detach().numpy()#>0.5"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 212,
"metadata": {},
"outputs": [],
"source": [
"preds, targs = learn.get_preds()"
]
},
{
"cell_type": "code",
"execution_count": 213,
"metadata": {},
"outputs": [],
"source": [
"#targs.view(-1,1)"
]
},
{
"cell_type": "code",
"execution_count": 214,
"metadata": {},
"outputs": [],
"source": [
"#preds"
]
},
{
"cell_type": "code",
"execution_count": 215,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor([0.4841, 0.5159]), tensor(0))"
]
},
"execution_count": 215,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"i = 0\n",
"preds[i], targs[i]"
]
},
{
"cell_type": "code",
"execution_count": 216,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((Image (1, 4, 50), Category 0), (Image (1, 4, 50), Category 1))"
]
},
"execution_count": 216,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_ds[0], data.train_ds[3]"
]
},
{
"cell_type": "code",
"execution_count": 217,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((Category 0, tensor(0), tensor([0.5348, 0.4652])),\n",
" (Category 0, tensor(0), tensor([0.5488, 0.4512])))"
]
},
"execution_count": 217,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.predict(data.train_ds[0][0]), learn.predict(data.train_ds[3][0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 125,
"metadata": {},
"outputs": [],
"source": [
"#learn.save('v6')"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {},
"outputs": [],
"source": [
"#learn.load('v6')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 218,
"metadata": {},
"outputs": [],
"source": [
"interpret = ClassificationInterpretation.from_learner(learn)"
]
},
{
"cell_type": "code",
"execution_count": 219,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[164, 98],\n",
" [153, 85]])"
]
},
"execution_count": 219,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"interpret.confusion_matrix()"
]
},
{
"cell_type": "code",
"execution_count": 220,
"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": [
"interpret.plot_confusion_matrix()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train custom fastai ResNet with fastai "
]
},
{
"cell_type": "code",
"execution_count": 243,
"metadata": {},
"outputs": [],
"source": [
"learn_resnet = Learner(data, net_custom_resnet, metrics=accuracy)"
]
},
{
"cell_type": "code",
"execution_count": 244,
"metadata": {},
"outputs": [],
"source": [
"#[p.shape for p in net_custom_resnet.parameters()]"
]
},
{
"cell_type": "code",
"execution_count": 245,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Total time: 04:01 <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</th>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <th>0.557348</th>\n",
" <th>0.841440</th>\n",
" <th>0.508000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <th>0.583182</th>\n",
" <th>0.879271</th>\n",
" <th>0.494000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <th>0.558499</th>\n",
" <th>0.848773</th>\n",
" <th>0.506000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <th>0.515747</th>\n",
" <th>0.914593</th>\n",
" <th>0.512000</th>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <th>0.476116</th>\n",
" <th>0.917134</th>\n",
" <th>0.504000</th>\n",
" </tr>\n",
"</table>\n"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn_resnet.fit_one_cycle(5)"
]
},
{
"cell_type": "code",
"execution_count": 246,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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L4WEiIj4pZAQERG/FBIiIuKXQkJERPxSSIiIiF8KCRER8UshISIifikkRETEL4WEiIj4pZAQERG/FBIiIuKXQkJERPxSSIiIiF8KCRER8UshISIifikkRETEL4WEiIj4pZAQERG/FBIiIuKXQkJERPxSSIiIiF8KCRER8UshISIifikkRETEL4WEiIj4pZAQERG/FBIiIuKXQkJERPxSSIiIiF8KCRER8ateIWFmPc0s2vd+vJndZWZtA1uaiIgEW32PJF4HqsysF/As0B34W8CqEhGRJqG+IVHtnKsErgEec87dDXQMXFkiItIU1DckKsxsKnAr8I5vXGRgShIRkaaiviExHTgfeNA5t8XMugN/PdVMZnaZma0zs41mNrOOzx81s+W+13oz29ew8kVEJJAi6jORcy4buAvAzBKBBOfcQyebx8zCgSeBiUAukGlmb/uWdWS5d9eY/gfA0AavgYiIBEx9r2761Mxam1k7YAUwy8weOcVsI4CNzrnNzrlyYA4w+STTTwVerk89IiJydtS3uamNc+4AcC0wyzk3HLjkFPN0BrbXGM71jTuBmXXDu2Lqk3rWIyIiZ0F9QyLCzDoCN3DsxPWpWB3jnJ9pbwJec85V1bkgsxlmlmVmWfn5+fX88SIicqbqGxK/BuYCm5xzmWbWA9hwinlygS41htOAPD/T3sRJmpqcc0875zKccxkpKSn1LFlERM5UfU9cvwq8WmN4M3DdKWbLBHr7roTagRcEX689kZn1BRKBhfWsWUREzpL6nrhOM7M3zWyPme02s9fNLO1k8/huvrsT7whkLfCKc26Nmf3azK6qMelUYI5zzl9TlIiIBInVZ99sZh/idcPxom/ULcDNzrmJAaytThkZGS4rK+ts/1gRkZBmZkuccxkNna++5yRSnHOznHOVvtdsQCcHRESaufqGxF4zu8XMwn2vW4CCQBYmIiLBV9+Q+Bbe5a+7gJ3AFLyuOkREpBmrV0g457Y5565yzqU459o7567Gu7FORESasTN5Mt09jVaFiIg0SWcSEnXdUS0iIs3ImYSE7msQEWnmTnrHtZkVU3cYGNAqIBWJiEiTcdKQcM4lnK1CRESk6TmT5iYREWnmFBIiIuKXQkJERPxSSIiIiF8KCRER8UshISIifikkRETEL4WEiIj4pZAQERG/FBIiIuKXQkJERPxSSIiIiF8K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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"learn_resnet.recorder.plot_losses()"
]
},
{
"cell_type": "code",
"execution_count": 248,
"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_resnet.recorder.plot_metrics()"
]
},
{
"cell_type": "code",
"execution_count": 138,
"metadata": {},
"outputs": [],
"source": [
"#test_learn.get_preds() # is not working!"
]
},
{
"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
}