1134 lines (1133 with data), 72.0 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": 6,
"metadata": {},
"outputs": [],
"source": [
"URL_seq = 'https://raw.githubusercontent.com/abidlabs/deep-learning-genomics-primer/master/sequences.txt'"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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_labels = pd.Series(seq_labels)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"seq_df['Target'] = seq_labels.astype('float')"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"#seq_df['Target1'] = seq_labels.astype('float')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"#target2 = ~seq_labels.astype('int').astype('bool')"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"#seq_labels.astype('int').astype('bool').head()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"#seq_labels.head()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"#target2.head()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"#seq_df['Target2'] = target2.astype('float')"
]
},
{
"cell_type": "code",
"execution_count": 22,
"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": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seq_df.head()"
]
},
{
"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": 24,
"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": 25,
"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": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test open sequence image function\n",
"open_seq_image('CCGAGGGCTATGGTTTGGAAGTTAGAACCCTGGGGCTTCTCGCGGACACC')"
]
},
{
"cell_type": "code",
"execution_count": 26,
"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": 27,
"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_df['Target'].values)\n",
" .databunch())"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ImageDataBunch;\n",
"Train: LabelList\n",
"y: FloatList (2000 items)\n",
"[FloatItem 0.0, FloatItem 0.0, FloatItem 0.0, FloatItem 1.0, FloatItem 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: FloatList (2000 items)\n",
"[FloatItem 0.0, FloatItem 0.0, FloatItem 0.0, FloatItem 1.0, FloatItem 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": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAAEADIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD4C/aA+MviP9nf48+Nv2UfDNr/AGj8KfBXi7UtBb4b32s6jbaV4h+xXUkKX+qLYXVtJeXryxR3LTF1xJFFHGsdtBDbR8h/w11qVh/xKPC3wH+HWkeHJ/3eqeEYdFubuw1K3HKRzG9uZ5/PjMl75WoJKmoQJqNxFFdRwrBFCUV9/wAOcP5Nj+HcFisRRUqlSjRnN3kuec6NKcqklGcVKo5Sb9pJOpe1qiUYKH7Yeu/BjUvGX7QP/CpLn4u+M/8AhIdQ+NPxdufhz4y1/wAReGdH1XVRpUH9iiKe3v7+ynuor0Lrt0guvNaQR29kikJaxKp+3bFpv7BX7Vfir9jTwt4d0j4geCfBn2FfDqfE3Rra+v7OO8sbe8uoI722jt544HN5eqIUdY4nu5LqJY71YruMor81y61fxap5JJL6o8NjqnskuWKnRx1CjSkuTkcXToznTjySglCTi4tbB65+wl+xd8Kf2+/hx4V+JPj7xH4u8Jz+M/i7ffDbxBp3g3xRP9mudBsvDtxrtjC39om7kb7PLZWFrGjO0S22n2/7szobhuR+CXwk/wCGjfBt74j+NXxN8Xa3pFr+zp4g+M83gf8Atr7LoNzr2j6xeaLaW32K2SNbey/s+xgtvLtjDLFEPLgmgjWNEKK/Ncy4hzvD8RZ9hadeShha0YUV7rdKLrUoWhJwc4vllKKlzc6T0nHSwfOn/DwH9vL/AKPa+Lv/AIcnVP8A4/RRRX9Wf6o8Jf8AQtw3/hPh/wD5QB//2Q==\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAADIAAAAECAYAAADMHGwBAAAABHNCSVQICAgIfAhkiAAAAHlJREFUKJFjdGEM+c8ABTufXYAxGdylDBiwgZ3PLqDIwfTgUo9LHyEzsfGx2QUTY4R5BJ9F6PK4DES2DJvnkPURsg+Xp3ABRhfGkP/YFCM7CJflxFqCy3HkeAybOQwMDAyMf5+r/CfHMYQMhvFhgNjQh6lFj3VCKQIAc+Zk1AtYFUIAAAAASUVORK5CYII=\n",
"text/plain": [
"Image (1, 4, 50)"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.x[1499]"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"FloatItem 1.0"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.y[1499]"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Image (1, 4, 50), FloatItem 0.0)"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_ds[0]#, data.train_ds.classes"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAIcCAYAAADrIQ9mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAFm5JREFUeJzt3U+orHd9x/HPN16okhioXSREERGui0Yal4K4EsmmoBs3tgshaFG6qW5CCZSKG7OXVhcSEloXgi5EUFx056oLg2YToZiFIRWCXLyhVPA+XeQELufObeac+Zxnnjl5veDAPXOfO/PMv+/M+855fmeWZQkAAACHe+DYOwAAAHBdCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQKLipl538z8cGbemJlXZubz99luZuabM/P62dezMzNr7y9w2swcYC3mDRd149g7wLXxrSR/TPJIko8l+fHMvLgsy0vntvtSks8meSLJkuRnSf4ryb+uuK/A6TNzgLWYN1zILMty7H3gxM3Mg0l+n+Sjy7K8fHbaC0l+uyzL0+e2/XmS55Zl+c7Z908l+eKyLB9febeBE2XmAGsxb7gMPyJIw0eS/OmtwXPmxSSP79j28bO/e7vtAO7HzAHWYt5wYQKLhoeS3Dp32q0k791j21tJHvIzysAFmDnAWswbLkxg0XA7ycPnTns4yR/22PbhJLcXP6sK7M/MAdZi3nBhAouGl5PcmJmbd532RJLzB3/m7LQn9tgO4H7MHGAt5g0XJrA42LIsbyT5QZKvz8yDM/OJJJ9J8sKOzZ9P8tWZef/MPJbka0meW21ngZNn5gBrMW+4DIFFy1eSvCfJ75J8L8mXl2V5aWY+OTO379ru20l+lOSXSX6V5MdnpwFchJkDrMW84UIs0w4AAFDiEywAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKLlxrAv+9AOfu/TyhT999Rf3nPbkYx+79HaHXMYx7Nq3XQ7Z3/b1X2Of3+naz4tDHgM/u/P92WvDFR0yc/Z1yG27r/Z9tRVrXIf27b6Gq35MHes1sf2asLWZc+e1m3vNm1N7nt7P+fvzWI+NYz3H13hdPTVrvAc/1u25z7zxCRYAAECJwAIAACgRWAAAACWzLFd+WMJO7eMhtv5zrfv8XPAax5Hte7lrnN++l3Gsn7NuXsbWf564fblbOx4i2X/mbH2WNB3reXRdb8/k9G7T9vEux5prW5s57Xmz9WOLjnH+Zsvx3h9cdj+uy/3tGCwAAIAVCSwAAIASgQUAAFAisAAAAEo2tcjFln7R5JYOMr1qa/wCyS1f/6vQ/KWLW7Lvc+CBR3+9qQPOk+MtrPNOen5t/ZfRHmJLi/y8k5zqzDlk3hxrZmx5QYs1tG+nLb1G7LKVhba29Bq577+1yAUAAMCKBBYAAECJwAIAACgRWAAAACVHW+Tizms377ngrRxwdyzvpOt6EVs6ALTpkANgd9nS82efA0DXtmvm7LKl2/EQ+zxutn4g8SH7ssvW77PrwMx5U3tRnbarfv6e4szc5VjXY40FMprXbev3d/t91D6L6vgECwAAoERgAQAAlAgsAACAEoEFAABQcrRFLgAAAK4bn2ABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgQUAAFAisAAAAEoEFgAAQInAAgAAKBFYAAAAJQILAACgRGABAACUCCwAAIASgUXFzLxvZn44M2/MzCsz8/n7bDcz882Zef3s69mZmbX3FzhtZg6whpn5+5n5z5n535l57m22/YeZeW1mbs3Md2fmz1baTTZGYNHyrSR/TPJIkr9J8i8z8/iO7b6U5LNJnkjyV0n+OsnfrbWTwLVh5gBreDXJN5J89//baGaeTPJ0kk8l+VCSDyf556veObZplmU59j5w4mbmwSS/T/LRZVlePjvthSS/XZbl6XPb/jzJc8uyfOfs+6eSfHFZlo+vvNvAiTJzgLXNzDeSfGBZli/c5+//PclvlmX5x7PvP5Xk35ZleXS9vWQrfIJFw0eS/OmtNzpnXkyy63+THz/7u7fbDuB+zBxga3bNmkdm5i+OtD8ckcCi4aEkt86ddivJe/fY9laShxwTAVyAmQNsza5Zk+yeS1xzAouG20kePnfaw0n+sMe2Dye5vfhZVWB/Zg6wNbtmTbJ7LnHNCSwaXk5yY2Zu3nXaE0le2rHtS2d/93bbAdyPmQNsza5Z89/Lsrx+pP3hiAQWB1uW5Y0kP0jy9Zl5cGY+keQzSV7YsfnzSb46M++fmceSfC3Jc6vtLHDyzBxgLTNzY2beneRdSd41M++emRs7Nn0+yVMz85cz8+dJnolZ844lsGj5SpL3JPldku8l+fKyLC/NzCdn5vZd2307yY+S/DLJr5L8+Ow0gIswc4A1PJPkf/LmEux/e/bnZ2bmgzNze2Y+mCTLsvwkybNJ/iPJK2df/3ScXebYLNMOAABQ4hMsAACAEoEFAABQIrAAAABKBBYAAEDJrmUmV/HpBz535atr/PTVX9xz2pOPfWwz53fZ8z9kP676Oqzlut63a1hjX3525/tTPcOCO6/dvGfmnOJjf1/n7+djPT8OmWu7XOf7bJd9b5fztn5/7/tv9/XAo7/e1MzZ9R7nkOu3pde3fa5H+3m6xvujQ7T375DHyi7tmXvVj4Fjvebsexn7vMfxCRYAAECJwAIAACgRWAAAACUCCwAAoGSW5crXmtjpkANAt36Q8z4Hzp3aIg33u4xDnOL9uK/LXrdjHcjbvm+3dsB5ctjCOsd6fl31c6R9kPOxFkLY0v7te377uupZcogtLTywtYV1tr6Q11W/3zrFxW229Pq79fdH+zjF22nfy7DIBQAAwIoEFgAAQInAAgAAKBFYAAAAJUdb5OLOazfvueBjHdS3pYOhm7a8b1fhGAeSH2KN3/x+rPt7awecJ/2FdU5t0ZctPT6OpX1A/ZYO0L+s6/K42NrMab/HsQDD5R3rebql224r73NP8fG56zL2WcjLJ1gAAAAlAgsAAKBEYAEAAJQILAAAgJKjLXJxyG85bx+YfowDRbe0iMaWDgDd19YPsr3s/X3V+5Gssy9bO+A8OWzmHMupPUeO9Xg71pzc+hw6bysHul/F+W1t5pzivLlqW38MHesy3ulO8X7cZ974BAsAAKBEYAEAAJQILAAAgBKBBQAAUHK0RS4AAACuG59gAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoFFxcz8/cz858z878w89zbb/sPMvDYzt2bmuzPzZyvtJnBNzMz7ZuaHM/PGzLwyM5+/z3YzM9+cmdfPvp6dmVl7f4HTZd5wUQKLlleTfCPJd/+/jWbmySRPJ/lUkg8l+XCSf77qnQOunW8l+WOSR5L8TZJ/mZnHd2z3pSSfTfJEkr9K8tdJ/m6tnQSuBfOGC5llWY69D1wjM/ONJB9YluUL9/n7f0/ym2VZ/vHs+08l+bdlWR5dby+BUzYzDyb5fZKPLsvy8tlpLyT57bIsT5/b9udJnluW5Ttn3z+V5IvLsnx85d0GTpB5w2X4BIu1PZ7kxbu+fzHJIzPzF0faH+D0fCTJn956s3Pmxbw5X87bNXN2bQewi3nDhQks1vZQklt3ff/Wn997hH0BTtP5OZKz73fNkV0z5yHHRQB7Mm+4MIHF2m4nefiu79/68x+OsC/AaTo/R3L2/a45smvm3F78fDywH/OGCxNYrO2lvHnw51ueSPLfy7K8fqT9AU7Py0luzMzNu057Im/Ol/N2zZxd2wHsYt5wYQKLipm5MTPvTvKuJO+amXfPzI0dmz6f5KmZ+cuZ+fMkzyR5bsVdBU7csixvJPlBkq/PzIMz84kkn0nywo7Nn0/y1Zl5/8w8luRrMXOAPZk3XIbAouWZJP+TN5dg/9uzPz8zMx+cmdsz88EkWZblJ0meTfIfSV45+/qn4+wycMK+kuQ9SX6X5HtJvrwsy0sz88mZuX3Xdt9O8qMkv0zyqyQ/PjsNYF/mDRdimXYAAIASn2ABAACUCCwAAIASgQUAAFAisAAAAEp2LaO9ijuv3bxndY0nH/vYpc/vp6/+4p7TDjm/9uXu2m4f+57XGtd1l8ter/tpX49D9u9Yt+k+DnncrfGY+tmd72/ut9Z/+oHP3TNztvRc2tdl79Njzdf2bbzGfXaKj4t97DsPt/66s8vWZs6uebOvd9JjfI35sMvW3x8ea75e1lb2437at/EDj/76beeNT7AAAABKBBYAAECJwAIAACgRWAAAACWzLJc+DvMg+x4AeooHSB/DdT4o9hTvs+YCA21rLJCxzwGgazvkoPNDHGuhkbXP/yKXsfXt9rWl2bSVmWNhnTdtfd5c9fm1FxXYZY3rdV0XyrqIrbw2bWne7jNvfIIFAABQIrAAAABKBBYAAECJwAIAACjZ/CIXh9jKwZ6HWOM3fG/pwMFT/I3mV30Q8Jbun31t7YDzJLnz2s17Zs6pzYPr7LrcnmscPL/LKd5W+9j3dtrawjq73uMc6/VtjfdC+5z/dXhPdqgtLTbU/rdXeV5X4ZDFVCxyAQAAsCKBBQAAUCKwAAAASgQWAABAyaYWuTjWQf/t3xq+5QP7rsvCCsc6UHSXrSxosaWDZ7e4yMW+C+sccr+37+erftyscV2PZSu38aH/9rK2tEDSGrfx1mbOvovqbOlxtfXn9FXb0vVf431p8/y2NFt2ad+PFrkAAABYkcACAAAoEVgAAAAlAgsAAKDkaItcAAAAXDc+wQIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABKBBYAAECJwAIAACgRWAAAACUCCwAAoERgAQAAlAgsAACAEoEFAABQIrAAAABK/g/8bS5oueNEyAAAAABJRU5ErkJggg==\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": 503,
"metadata": {},
"outputs": [],
"source": [
"test_learn = create_cnn(data, models.resnet34)"
]
},
{
"cell_type": "code",
"execution_count": 505,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"MSELossFlat()"
]
},
"execution_count": 505,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_learn.loss_func"
]
},
{
"cell_type": "code",
"execution_count": 512,
"metadata": {},
"outputs": [],
"source": [
"#test_learn.model[0]"
]
},
{
"cell_type": "code",
"execution_count": 513,
"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=1, bias=True)\n",
")"
]
},
"execution_count": 513,
"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": 34,
"metadata": {},
"outputs": [],
"source": [
"def Flatten(): return Lambda(lambda x: x.view((x.size(0), -1)))"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"def ResizeInput(): return Lambda(lambda x: x.view((-1,)+x.size()[-2:]))"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"#def ResizeOutput(): return Lambda(lambda x: x.view(-1))"
]
},
{
"cell_type": "code",
"execution_count": 37,
"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=1),\n",
" #ResizeOutput(),\n",
" #nn.Sigmoid()\n",
" #Debugger()\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 38,
"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=1, bias=True)\n",
")"
]
},
"execution_count": 38,
"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": 597,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Image (1, 4, 50), FloatItem 1.0)"
]
},
"execution_count": 597,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_ds[3]"
]
},
{
"cell_type": "code",
"execution_count": 598,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([1, 4, 50])"
]
},
"execution_count": 598,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.train_ds[0][0].data.shape"
]
},
{
"cell_type": "code",
"execution_count": 600,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[-0.0374]], grad_fn=<ThAddmmBackward>)"
]
},
"execution_count": 600,
"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": 39,
"metadata": {},
"outputs": [],
"source": [
"learn = Learner(data, net, loss_func=MSELossFlat())#, metrics=accuracy)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"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, 1] 17 \n",
"________________________________________________________________________________\n",
"Total params: 6209\n"
]
}
],
"source": [
"learn.summary()"
]
},
{
"cell_type": "code",
"execution_count": 41,
"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": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total time: 00:25\n",
"epoch train_loss valid_loss\n",
"1 0.730336 0.693010 (00:02)\n",
"2 0.706327 0.634384 (00:02)\n",
"3 0.646934 0.472077 (00:01)\n",
"4 0.526092 0.285917 (00:01)\n",
"5 0.416866 0.250008 (00:01)\n",
"6 0.350249 0.250291 (00:01)\n",
"7 0.311346 0.250170 (00:01)\n",
"8 0.288084 0.250373 (00:01)\n",
"9 0.273934 0.250141 (00:01)\n",
"10 0.265177 0.249842 (00:01)\n",
"11 0.259912 0.249849 (00:01)\n",
"12 0.256636 0.249877 (00:01)\n",
"13 0.254508 0.249915 (00:01)\n",
"14 0.252746 0.249891 (00:01)\n",
"15 0.251891 0.249888 (00:01)\n",
"\n"
]
}
],
"source": [
"learn.fit_one_cycle(15, max_lr=1e-4)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"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": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.24988788]"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"learn.validate()"
]
},
{
"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
}