1274 lines (1273 with data), 82.5 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.32.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": {},
"source": [
"## Data loading"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import requests"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"URL_seq = 'https://raw.githubusercontent.com/abidlabs/deep-learning-genomics-primer/master/sequences.txt'"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"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": {},
"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": {},
"outputs": [],
"source": [
"# setup df from list\n",
"seq_df = pd.DataFrame(seq_raw, columns=['Sequences'])"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# show head of dataframe\n",
"#seq_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"URL_labels = 'https://raw.githubusercontent.com/abidlabs/deep-learning-genomics-primer/master/labels.txt'"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"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": {},
"outputs": [
{
"data": {
"text/plain": [
"2000"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(seq_labels)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"seq_label_series = pd.Series(seq_labels)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"seq_df['Target'] = seq_label_series.astype('float')"
]
},
{
"cell_type": "code",
"execution_count": 16,
"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.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC...</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA...</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC...</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA...</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Sequences Target\n",
"0 CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGA... 0.0\n",
"1 GAGTTTATATGGCGCGAGCCTAGTGGTTTTTGTACTTGTTTGTCGC... 0.0\n",
"2 GATCAGTAGGGAAACAAACAGAGGGCCCAGCCACATCTAGCAGGTA... 0.0\n",
"3 GTCCACGACCGAACTCCCACCTTGACCGCAGAGGTACCACCAGAGC... 1.0\n",
"4 GGCGACCGAACTCCAACTAGAACCTGCATAACTGGCCTGGGAGATA... 1.0"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seq_df.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# setup one hot encoded y data"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"seq_arr_list = np.array(seq_labels).reshape(-1,1)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"one_hot_enc_seq = OneHotEncoder(categories=[range(2)])"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"seq_one_hot_enc = one_hot_enc_seq.fit_transform(seq_arr_list).toarray()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1., 0.],\n",
" [1., 0.],\n",
" [1., 0.],\n",
" [0., 1.],\n",
" ...,\n",
" [0., 1.],\n",
" [1., 0.],\n",
" [0., 1.],\n",
" [0., 1.]])"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seq_one_hot_enc"
]
},
{
"cell_type": "markdown",
"metadata": {
"heading_collapsed": true
},
"source": [
"## Data encoding test (incorporated into \"open_seq_image\" function)"
]
},
{
"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": {},
"source": [
"## Data setup for NN"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"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": 22,
"metadata": {},
"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": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test open sequence image function\n",
"open_seq_image('CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGACACC')"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"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": 24,
"metadata": {},
"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_one_hot_enc)\n",
" .databunch())"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ImageDataBunch;\n",
"Train: LabelList\n",
"y: MultiCategoryList (2000 items)\n",
"[MultiCategory 1.0;0.0, MultiCategory 1.0;0.0, MultiCategory 1.0;0.0, MultiCategory 0.0;1.0, MultiCategory 0.0;1.0]...\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",
"Valid: LabelList\n",
"y: MultiCategoryList (2000 items)\n",
"[MultiCategory 1.0;0.0, MultiCategory 1.0;0.0, MultiCategory 1.0;0.0, MultiCategory 0.0;1.0, MultiCategory 0.0;1.0]...\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",
"Test: None"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAEADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD4w8Xy6l4X/ZU0P9tjVvEWr+JPib4h/sptR8X+J9Zubu/WS7vvFFpbzwXJkE9rPYnwnps9rNDIkgea6ina4tpFto+R+CXxy+Inx08ZXvw+1+40jS9Dt/CPiDxTd+H9E8MafHo99rWjaPeapaX7aTJBJp0E7GwtLOZ7a2hM9oksT7jcXLzFFd2WYTCYnhbNMZVpxlVo1sRCnJpfu4U6lONOMFpGMYKTUFGMVG75eV6v9sD4bfGTWfip4N+IHijxN4M8IrY/DXwjD4r8NeFrPwlZx6UNcm1jTdMlvZbfyzv8z+05LmS3DLayyWlhBJC9lZW9lGftAfE3wp+zn8efG37M3hP9nf4dap4M8G+LtS0Kez8QeH5Li/11rK6kt0vrnVFmTUbadxDDI8Vhc2lqXRgLdUlmSQor2MFlWX1eNcVl8ofuIU1KMFKaSlai+ZctSL5rzk+Zty5nzX5kmg9c/ZP+D+m/tZ+DdE8U6r4r1fwJZ634ufwzP4d+GRttHsF05NY8J6MiyKsLS3s4sPGeswG6vJLi4lR41lkkUzLN5H8EvivB+0J4yvfh78Tfh1pE+h2fhHxB4jGi2Gp6rZ2DXekaPeavBGlnBepbW0D3UOo7oreOJY08QamLf7OWtWtSivjsFetmXENKT0wv8Gzs6f7yMbxkrSbs2uaUpyV3aSuwOQ/4be+O0/77WdN+HWr3j/Ndat4g+DHhfUb+9kP3p7m7utOknup3OWeaZ3kkdmZ2ZmJJRRX7F/qnwx/0B0/ua/BVEl6JJLZJJJIP/9k=\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAAECAYAAADMHGwBAAAABHNCSVQICAgIfAhkiAAAAG9JREFUKJFj/Ptc5T8DAwODu5QBAzrY+ewCivjOZxcYcKnFpp4cADMDm934xBldGEP+43MQNscjGwqTw2YRroDAZh66GDa34PM8ikcIOYKUmCAmMLB5Cp/5uGgGBgaER3BFHSHDCcmRktzwOZSQ/QB3Y3zUxXVH0gAAAABJRU5ErkJggg==\n",
"text/plain": [
"Image (1, 4, 50)"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.x[1499]"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"MultiCategory 0.0;1.0"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.y[1499]"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Image (1, 4, 50), MultiCategory 1.0;0.0)"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_ds[0]#, data.train_ds.classes"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAIcCAYAAADrIQ9mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAF8RJREFUeJzt3U+oXHcZx+HvG2KttAaqC0NcuIoIBdO1Wl2JSwviQkXtRkHd1a2i6KpKlwWtIFIXIoKCUlCLiODCpVGr2KJY8E8QpERTFMH83NzAcHvmZnLnnTNnbp4HAsnk3DNn7sy8uZ/MnN/UGCMAAABs79y+DwAAAOCsEFgAAABNBBYAAEATgQUAANBEYAEAADQRWAAAAE0EFgAAQBOBxVpV9bqq+l5VvVxVL1bVB9dsV1X1eFX94+jXl6qqTtjvU1X1+6q6WVWP3uYYXl1VX6+qf1bVtap6bMubBSyQeQPMxbxh187v+wBYtCeT/DfJG5I8lOSZqro6xnju2HYfT/JIkitJRpJnk/wxyVfW7Pdqkm8neXyDY/h8kstJ3pTkYpKfVtVvxxg/vLObAiyceQPMxbxhp7yCxaSqui/J+5J8doxxY4zx8yTfT/Lhic0/muSJMcafxxh/SfJEkkdX9vWr1f8dGmM8Ocb4SZL/bHAoH0nyxTHGS2OM3yX52uq+gcNn3gBzMW+Yg1ewWOfNSf43xnh+5bKrSd41se2DR3+3ut2Dt/4wxnjraQ6gqh5Icmli34+cZn/AYpk3wFzMG3bOK1isc3+S68cuu57ktRtsez3J/Se9T/kOjuHW/m53DMDhMm+AuZg37JzAYp0bSS4cu+xCkn9tsO2FJDfGGKPhGG7t73bHABwu8waYi3nDzgks1nk+yfmqurxy2ZUkx08AzdFlVzbY7o6MMV5K8rdd7BtYFPMGmIt5w84JLCaNMV5O8t0kX6iq+6rq7Unem+SbE5s/neSxqnpjVV1K8ukk37j1l1X1p9XlSqvqnqq6N0kleVVV3VtV6x6LTyf5TFU9UFVvSfKx1X0Dh8+8AeZi3jAHgcVJPpnkNUn+nuRbST4xxniuqh6uqhsr2301yQ+S/DrJb5I8c3RZquqeJK9P8ouV7X+c5N9J3pbkqaPfv/No+w9V1er/4HwuyR+SvJjkZ0m+bAlTOJPMG2Au5g07Vdu/jRTWq6p3JPnUGOMD+z4W4Gwzb4C5mDecRGABAAA08RZBAACAJgILAACgicACAABoIrAAAACanN/XFd+8dvkVq2u859JDr9juR3/95Ssum9puyjZfu2vdxza1vyn7uv1n9X7stun9uKl9fZ+evfmd2ssVn+Dd597fuqLPvh6Xu36uL32WzGHT+3aOx8BS5t++Zvimj8dzF19Y1MzZZt5s8+/AvmbQWZ4Hxy3p55kl7+8s/1uyyc84XsECAABoIrAAAACaCCwAAIAme/ug4an3Jx/i+9k732M6x/tVtzm3oPtY5rCU94ov5TjuxDbHfDecg7WpQ7zvN9F9ntKSzmvYxr7O3zq+v7vtXJylzZx9/YyzjUM7v3NJ388l/2y5bn+d50Eu/efS7tu/yTmfXsECAABoIrAAAACaCCwAAIAmAgsAAKDJoha5WJIln4C89BM7p+zjJO872V/3SZanPY5u+3qsLO2E82SembOkhRr28Vhd+my6mz4s+BAXKjpLC+tsOm+W9JzZxlJ+xlnS435JH0a/69m3pMfxHLffBw0DAADMSGABAAA0EVgAAABNBBYAAECTg1zkYl+fcL2kk/g6Lel2zXFfLOX+XtIJsFO2WeRjk085n9vNa5dbh92+Prn+bpo5+5r13V+7qaWcnD5l6fN1aYtcTM2bJc33KUv+920piwBte71Tzuqc38aSfj6aul6LXAAAAMxIYAEAADQRWAAAAE0EFgAAQJO9LXIBAABw1ngFCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisFirql5XVd+rqper6sWq+uCa7aqqHq+qfxz9+lJV1Qn7faqqfl9VN6vq0dscw6ur6utV9c+qulZVj215s4AFMm+AuZg37Nr5fR8Ai/Zkkv8meUOSh5I8U1VXxxjPHdvu40keSXIlyUjybJI/JvnKmv1eTfLtJI9vcAyfT3I5yZuSXEzy06r67Rjjh3d2U4CFM2+AuZg37JRXsJhUVfcleV+Sz44xbowxfp7k+0k+PLH5R5M8Mcb48xjjL0meSPLoyr5+tfq/Q2OMJ8cYP0nynw0O5SNJvjjGeGmM8bskX1vdN3D4zBtgLuYNc/AKFuu8Ocn/xhjPr1x2Ncm7JrZ98OjvVrd78NYfxhhvPc0BVNUDSS5N7PuR0+wPWCzzBpiLecPOeQWLde5Pcv3YZdeTvHaDba8nuf+k9ynfwTHc2t/tjgE4XOYNMBfzhp0TWKxzI8mFY5ddSPKvDba9kOTGGGM0HMOt/d3uGIDDZd4AczFv2DmBxTrPJzlfVZdXLruS5PgJoDm67MoG292RMcZLSf62i30Di2LeAHMxb9g5gcWkMcbLSb6b5AtVdV9VvT3Je5N8c2Lzp5M8VlVvrKpLST6d5Bu3/rKq/rS6XGlV3VNV9yapJK+qqnurat1j8ekkn6mqB6rqLUk+trpv4PCZN8BczBvmILA4ySeTvCbJ35N8K8knxhjPVdXDVXVjZbuvJvlBkl8n+U2SZ44uS1Xdk+T1SX6xsv2Pk/w7yduSPHX0+3cebf+hqlr9H5zPJflDkheT/CzJly1hCmeSeQPMxbxhp2r7t5HCelX1jiSfGmN8YN/HApxt5g0wF/OGkwgsAACAJt4iCAAA0ERgAQAANBFYAAAATc7v64rffe79Tv465kd//eUrLnvPpYc22m7K1Nd2H8s2+5uyzXXsyya3bY77Yo77bNPrPXfxhW0/5b7dkmbONvdV5/3c/Zg5K5Zy/6zb35Ql329zPM6evfmdRc2cbebN0p+Xuz6+Jf0sNKX7es/CzFj6Y3ZTm96OTeaNV7AAAACaCCwAAIAmAgsAAKCJwAIAAGiytw8anjoBdI6T5Pa1EMBS9t998vaUfS2s0H0sU077/dv0eKcc4omiSzvhPNn8pPPuRUXOysm/p7Wv5/TdPjuX/j3uvn+WNnPmWFRnSd//0z7+5piFh3i9h/bz1iH+G7nN9VrkAgAAYEYCCwAAoInAAgAAaCKwAAAAmixqkYspZ2Xhi879d1vSyeD7sq9FM05rSSc3T1naCedJcvPa5Y1mzr5O1t31AgTdj49De84ky1rkYY79dR7HlDmeA50nnc9pat4sabbs+nF1Vp4bS78dS5kZ3ZY+qy1yAQAAMCOBBQAA0ERgAQAANBFYAAAATfa2yMWmJ4BO2fTktylL+RTtQ1y8Y1+WtHDAoek+gXrT7ZZ2wnmy+cI6h2iT+2VJJ8l7Tu/eWZ7/U85dfGFRM2dq3iz93/19PLeWtHjFlEN8zmxj1/fHPhaV28V1bDJvvIIFAADQRGABAAA0EVgAAABNBBYAAECTvS1yAQAAcNZ4BQsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAAoInAAgAAaCKwAAAAmggsAACAJgILAACgicACAABoIrAAAACaCCwAAIAmAgsAAKCJwAIAAGgisAAAAJoILAAAgCYCCwAA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\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": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"## JUST FOR TESTING"
]
},
{
"cell_type": "code",
"execution_count": 136,
"metadata": {},
"outputs": [],
"source": [
"test_learn = create_cnn(data, models.resnet34)"
]
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<function torch.nn.functional.binary_cross_entropy_with_logits(input, target, weight=None, size_average=None, reduce=None, reduction='elementwise_mean', pos_weight=None)>"
]
},
"execution_count": 137,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_learn.loss_func"
]
},
{
"cell_type": "code",
"execution_count": 138,
"metadata": {},
"outputs": [],
"source": [
"#test_learn.model[0]"
]
},
{
"cell_type": "code",
"execution_count": 139,
"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": 139,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_learn.model[1]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"def Flatten(): return Lambda(lambda x: x.view((x.size(0), -1)))"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"def ResizeInput(): return Lambda(lambda x: x.view((-1,)+x.size()[-2:]))"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"#def ResizeOutput(): return Lambda(lambda x: x.view(-1))"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"net = 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.Linear(in_features=288, out_features=16),\n",
" nn.ReLU(),\n",
" nn.Linear(in_features=16, out_features=2),\n",
" #Debugger()\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 34,
"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): Linear(in_features=288, out_features=16, bias=True)\n",
" (5): ReLU()\n",
" (6): Linear(in_features=16, out_features=2, bias=True)\n",
")"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"net"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"## JUST FOR TESTING"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Image (1, 4, 50), MultiCategory 0.0;1.0)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_ds[3]"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([1, 4, 50])"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_ds[0][0].data.shape"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[-0.0212, -0.2126]], grad_fn=<ThAddmmBackward>)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"net(data.train_ds[0][0].data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Learner setup"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"learn = Learner(data, net, loss_func=nn.BCEWithLogitsLoss())#, metrics=accuracy)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"================================================================================\n",
"Layer (type) Output Shape Param # \n",
"================================================================================\n",
"Lambda [64, 4, 50] 0 \n",
"________________________________________________________________________________\n",
"Conv1d [64, 32, 39] 1568 \n",
"________________________________________________________________________________\n",
"MaxPool1d [64, 32, 9] 0 \n",
"________________________________________________________________________________\n",
"Lambda [64, 288] 0 \n",
"________________________________________________________________________________\n",
"Linear [64, 16] 4624 \n",
"________________________________________________________________________________\n",
"ReLU [64, 16] 0 \n",
"________________________________________________________________________________\n",
"Linear [64, 2] 34 \n",
"________________________________________________________________________________\n",
"Total params: 6226\n"
]
}
],
"source": [
"learn.summary()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"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": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total time: 00:25\n",
"epoch train_loss valid_loss\n",
"1 0.726247 0.675351 (00:01)\n",
"2 0.604617 0.338061 (00:01)\n",
"3 0.365617 0.021571 (00:01)\n",
"4 0.205116 0.003383 (00:01)\n",
"5 0.119641 0.001752 (00:01)\n",
"6 0.071585 0.001130 (00:01)\n",
"7 0.043498 0.000799 (00:01)\n",
"8 0.026702 0.000605 (00:01)\n",
"9 0.016518 0.000485 (00:01)\n",
"10 0.010292 0.000409 (00:01)\n",
"11 0.006465 0.000361 (00:01)\n",
"12 0.004106 0.000332 (00:01)\n",
"13 0.002649 0.000316 (00:01)\n",
"14 0.001749 0.000310 (00:01)\n",
"15 0.001195 0.000309 (00:01)\n",
"\n"
]
}
],
"source": [
"learn.fit_one_cycle(15, max_lr=1e-3)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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5qby3cmDeGnpDl5asj3U4RhjmjFt2jReffVVTpw4AcDmzZvZsWMHo0ePZvLkyRQWFjJy5EhefvnlM47dvHkzI0aMAOD48eNMnz6dUaNGcc0113D8+PHGcjfffHPjtNs/+9nPAHjwwQfZsWMHF154IRdeeCEAeXl57N27F4D77ruPESNGMGLECB544IHGzxs2bBg33XQTw4cPZ8qUKad8TrB4Ns2FqtaKyK3APMAPPKqqq0TkLqBMVRsSxAxgtkba0OpW3DJpIO+uq+CnL61kbG4vW/7TmNa8Ngt2rQhunX1HwtR7mn07LS2N8ePH849//IPLL7+c2bNnc8011xAfH8+LL75IcnIye/fupaSkhMsuu6zZ9Y9/97vf0aNHD5YvX87y5cspLCxsfO/uu+8mNTWVuro6Jk+ezPLly7ntttu47777mD9/Punp6afUtWjRIh577DEWLFiAqlJcXMznPvc5evXqxfr163n66af5wx/+wNVXX83zzz/PtddeG5xz5fJ0nIKqzlXVwao6UFXvdvfdEZAQUNU7VTXyJh1vRZTfx/3XjAbg+88uo76+S+U8Y7qMwCakhqYjVeXHP/4xo0aN4qKLLmL79u3s3r272Trefffdxn/Oo0aNYtSoUY3vPfPMMxQWFjJmzBhWrVrV5LTbgd5//32uvPJKEhISSExM5Etf+hLvvfceAPn5+Ywe7fxf8Wp6bpsQr72qj8G2j6HvKEhIb7JIdmoPfvIvw5j1wgpmL9zGV4pzOjlIYyJIC9/ovXTFFVdw++23s3jxYo4fP05hYSGPP/44FRUVLFq0iOjoaPLy8pqcLjtQU1cRmzZt4te//jULFy6kV69eXHfdda3W01KjSWxsbOO23+/3pPnIprlor30b4C9Xwoa3Wix2zbhsJgxI4xdz17CrsuVfBmNM50tMTGTSpElcf/31jR3MlZWV9O7dm+joaObPn8+WLVtarOOCCy7gySefBGDlypUsX74ccKbdTkhIICUlhd27d/Paa681HpOUlMThw2feun7BBRfw0ksvcezYMY4ePcqLL77I+eefH6wft1WWFNqrz3CISXKuFlogItxz1UhO1NXzy3982knBGWPOxowZM1i2bBnTp08H4Ktf/SplZWUUFRXx5JNPMnTo0BaPv/nmmzly5AijRo3i3nvvZfz48QCce+65jBkzhuHDh3P99def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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": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.000309012]"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.validate()#metrics=[accuracy])"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
"interpret = ClassificationInterpretation.from_learner(learn)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"ename": "RuntimeError",
"evalue": "Expected object of scalar type Float but got scalar type Long for argument #2 'other'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-45-7cdf6701acab>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0minterpret\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconfusion_matrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/Downloads/fastai/fastai/vision/learner.py\u001b[0m in \u001b[0;36mconfusion_matrix\u001b[0;34m(self, slice_size)\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[0;34m\"Confusion matrix as an `np.ndarray`.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 109\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 110\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mslice_size\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mcm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpred_class\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0my_true\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 111\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[0mcm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mRuntimeError\u001b[0m: Expected object of scalar type Float but got scalar type Long for argument #2 'other'"
]
}
],
"source": [
"interpret.confusion_matrix()"
]
},
{
"cell_type": "code",
"execution_count": 158,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"> \u001b[0;32m/Users/MMP/Downloads/fastai/fastai/vision/learner.py\u001b[0m(110)\u001b[0;36mconfusion_matrix\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m 108 \u001b[0;31m \u001b[0;34m\"Confusion matrix as an `np.ndarray`.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0m\u001b[0;32m 109 \u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0m\u001b[0;32m--> 110 \u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mslice_size\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mcm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpred_class\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m&\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0my_true\u001b[0m\u001b[0;34m==\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0m\u001b[0;32m 111 \u001b[0;31m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0m\u001b[0;32m 112 \u001b[0;31m \u001b[0mcm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0m\n",
"ipdb> x\n",
"tensor([0, 1])\n",
"ipdb> x.type()\n",
"'torch.LongTensor'\n",
"ipdb> self.data.c\n",
"2\n",
"ipdb> x[:,None]\n",
"tensor([[0],\n",
" [1]])\n",
"ipdb> x[:,None,None]\n",
"tensor([[[0]],\n",
"\n",
" [[1]]])\n",
"ipdb> x[:,None].type()\n",
"'torch.LongTensor'\n",
"ipdb> x[:,None,None].type()\n",
"'torch.LongTensor'\n",
"ipdb> self.pred_class==x[:,None]\n",
"tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0, 0, 0],\n",
" [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],\n",
" dtype=torch.uint8)\n",
"ipdb> self.y_true==x[:,None,None]\n",
"*** RuntimeError: Expected object of scalar type Float but got scalar type Long for argument #2 'other'\n",
"ipdb> q\n"
]
}
],
"source": [
"%debug"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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
}