From 9d405dd150ba1c6f2411f19d5f4ecf2d7bc4c283 Mon Sep 17 00:00:00 2001 From: Rajashekar Chintalapati Date: Mon, 9 Oct 2023 23:34:15 -0700 Subject: [PATCH] Adding pos data prep and train --- parsernaam/notebooks/03_pos_data_prep.ipynb | 1 + parsernaam/notebooks/04_pos_train.ipynb | 1 + 2 files changed, 2 insertions(+) create mode 100644 parsernaam/notebooks/03_pos_data_prep.ipynb create mode 100644 parsernaam/notebooks/04_pos_train.ipynb diff --git a/parsernaam/notebooks/03_pos_data_prep.ipynb b/parsernaam/notebooks/03_pos_data_prep.ipynb new file mode 100644 index 0000000..b5de4c0 --- /dev/null +++ b/parsernaam/notebooks/03_pos_data_prep.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"mount_file_id":"1SYr8LcaE0JUO_B8HEHk84J8Oe_qhaqAB","authorship_tag":"ABX9TyP+5PWMUqPifRxHXV6gh1Tk"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","execution_count":2,"metadata":{"id":"D36XISiyBBRI","executionInfo":{"status":"ok","timestamp":1696872554701,"user_tz":420,"elapsed":1225,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["import pandas as pd"]},{"cell_type":"code","source":["df = pd.read_csv(\"/content/drive/MyDrive/Colab/parsernaam/data/fl_reg_data.csv\")\n","\n","df.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"UzdIheZiBih_","executionInfo":{"status":"ok","timestamp":1696872578286,"user_tz":420,"elapsed":23587,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"1880692d-4fb7-4c0c-f668-1ca78c8c78de"},"execution_count":3,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" Unnamed: 0 name_first name_last gender birth_date race\n","0 0 Kathryn Binkley F 05/03/1976 White, Not Hispanic\n","1 1 Lakaya Brock F 11/23/1982 Black, Not Hispanic\n","2 2 Charles Fontaine M 11/11/1982 White, Not Hispanic\n","3 3 Suzanne Posselt F 08/20/1954 White, Not Hispanic\n","4 4 Bala Haeseler M 11/13/1980 White, Not Hispanic"],"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
Unnamed: 0name_firstname_lastgenderbirth_daterace
00KathrynBinkleyF05/03/1976White, Not Hispanic
11LakayaBrockF11/23/1982Black, Not Hispanic
22CharlesFontaineM11/11/1982White, Not Hispanic
33SuzannePosseltF08/20/1954White, Not Hispanic
44BalaHaeselerM11/13/1980White, Not Hispanic
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"]},"metadata":{},"execution_count":3}]},{"cell_type":"code","source":["df = df[['name_first','name_last']]\n","df.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"XDT9-JMfBl1Z","executionInfo":{"status":"ok","timestamp":1696872578508,"user_tz":420,"elapsed":226,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"6211faa0-12d3-4cd7-aa55-28b926716776"},"execution_count":4,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" name_first name_last\n","0 Kathryn Binkley\n","1 Lakaya Brock\n","2 Charles Fontaine\n","3 Suzanne Posselt\n","4 Bala Haeseler"],"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
name_firstname_last
0KathrynBinkley
1LakayaBrock
2CharlesFontaine
3SuzannePosselt
4BalaHaeseler
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"]},"metadata":{},"execution_count":4}]},{"cell_type":"code","source":["df.shape"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"iqJEM9jjBpCB","executionInfo":{"status":"ok","timestamp":1696872578509,"user_tz":420,"elapsed":10,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"2bcabc70-2ea9-49dd-a65c-11af86a4388e"},"execution_count":5,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(8953005, 2)"]},"metadata":{},"execution_count":5}]},{"cell_type":"code","source":["df.dropna(inplace=True)\n","df.drop_duplicates(inplace=True)\n","df.shape"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"h9G5vluRCMJz","executionInfo":{"status":"ok","timestamp":1696872586805,"user_tz":420,"elapsed":5668,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"8b2ea257-424e-484f-ad91-87cd35faafbb"},"execution_count":6,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(6124880, 2)"]},"metadata":{},"execution_count":6}]},{"cell_type":"code","source":["df.reset_index(drop=True, inplace=True)\n","df['name_first'] = df['name_first'].str.replace(\"[^a-zA-Z' -]\", '', regex=True)\n","df['name_last'] = df['name_last'].str.replace(\"[^a-zA-Z' -]\", '', regex=True)\n","\n","df['name_first'] = df.name_first.str.strip().str.title()\n","df['name_last'] = df.name_last.str.strip().str.title()"],"metadata":{"id":"0zxTsQJDCm42","executionInfo":{"status":"ok","timestamp":1696872606209,"user_tz":420,"elapsed":19119,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"execution_count":7,"outputs":[]},{"cell_type":"code","source":["import numpy as np\n","import pandas as pd\n","\n","np.random.seed(42)\n","mask = np.random.rand(len(df)) < 0.5\n","\n","df['name'] = np.where(mask, df['name_first'] + ' ' + df['name_last'], df['name_last'] + ' ' + df['name_first'])\n","df['type'] = np.where(mask, 'first_last', 'last_first')"],"metadata":{"id":"zTSrNhH7kdAT","executionInfo":{"status":"ok","timestamp":1696873989385,"user_tz":420,"elapsed":6011,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"execution_count":9,"outputs":[]},{"cell_type":"code","source":["df.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"4zZem9DNfDfu","executionInfo":{"status":"ok","timestamp":1696873992367,"user_tz":420,"elapsed":129,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"27a9249b-bffb-49ba-e53c-a051d3dba5e1"},"execution_count":10,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" name_first name_last name type\n","0 Kathryn Binkley Kathryn Binkley first_last\n","1 Lakaya Brock Brock Lakaya last_first\n","2 Charles Fontaine Fontaine Charles last_first\n","3 Suzanne Posselt Posselt Suzanne last_first\n","4 Bala Haeseler Bala Haeseler first_last"],"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
name_firstname_lastnametype
0KathrynBinkleyKathryn Binkleyfirst_last
1LakayaBrockBrock Lakayalast_first
2CharlesFontaineFontaine Charleslast_first
3SuzannePosseltPosselt Suzannelast_first
4BalaHaeselerBala Haeselerfirst_last
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"]},"metadata":{},"execution_count":10}]},{"cell_type":"code","source":["from sklearn.model_selection import train_test_split\n","\n","train_df, rest_df = train_test_split(df, test_size=0.2, random_state=42, stratify=df['type'])\n","val_df, test_df = train_test_split(df, test_size=0.5, random_state=42, stratify=df['type'])"],"metadata":{"id":"hmDSjFUTCWRv","executionInfo":{"status":"ok","timestamp":1696874187597,"user_tz":420,"elapsed":47810,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"execution_count":14,"outputs":[]},{"cell_type":"code","source":["print(train_df.shape)\n","print(val_df.shape)\n","print(test_df.shape)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"a8Y3kEnSDNW0","executionInfo":{"status":"ok","timestamp":1696874187598,"user_tz":420,"elapsed":22,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"bd562960-ce9d-46a1-86bc-0d27472c0ac6"},"execution_count":15,"outputs":[{"output_type":"stream","name":"stdout","text":["(4899904, 4)\n","(3062440, 4)\n","(3062440, 4)\n"]}]},{"cell_type":"code","source":["train_df.to_csv('/content/drive/MyDrive/Colab/parsernaam/data/pos_train.csv', index=False)\n","val_df.to_csv('/content/drive/MyDrive/Colab/parsernaam/data/pos_val.csv', index=False)\n","test_df.to_csv('/content/drive/MyDrive/Colab/parsernaam/data/pos_test.csv', index=False)"],"metadata":{"id":"A6X1MNOJDVqO","executionInfo":{"status":"ok","timestamp":1696874251700,"user_tz":420,"elapsed":64122,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"execution_count":16,"outputs":[]},{"cell_type":"code","source":[],"metadata":{"id":"mR_Cjt8gQMw8"},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git a/parsernaam/notebooks/04_pos_train.ipynb b/parsernaam/notebooks/04_pos_train.ipynb new file mode 100644 index 0000000..e9827aa --- /dev/null +++ b/parsernaam/notebooks/04_pos_train.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","metadata":{"id":"Du5qiFElYU6L"},"source":["# LSTM model to trian naamparser"]},{"cell_type":"code","execution_count":1,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":15819,"status":"ok","timestamp":1696875486827,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"d4_eoBacYSpd","outputId":"2590cea5-8744-4a40-9d47-a2c3e3affccd"},"outputs":[{"output_type":"stream","name":"stdout","text":["Requirement already satisfied: fastprogress in /usr/local/lib/python3.10/dist-packages (1.0.3)\n"]}],"source":["!pip install fastprogress"]},{"cell_type":"code","execution_count":2,"metadata":{"id":"Q76qchsoYtvw","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1696875507414,"user_tz":420,"elapsed":20592,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"5fd2dc6a-845c-47f0-8c32-a0ecf60e62e1"},"outputs":[{"output_type":"stream","name":"stdout","text":["Mounted at /content/drive\n"]}],"source":["from google.colab import drive\n","drive.mount('/content/drive')"]},{"cell_type":"code","execution_count":3,"metadata":{"id":"6wTqaxXwRGBE","executionInfo":{"status":"ok","timestamp":1696875511675,"user_tz":420,"elapsed":4266,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["import string\n","import os\n","\n","import torch\n","import torch.nn as nn\n","from torch.utils.data import Dataset, DataLoader\n","from torch.optim.adamw import AdamW\n","\n","from tqdm import tqdm\n","tqdm.pandas()\n","\n","import pandas as pd\n","import numpy as np\n","\n","from fastprogress import master_bar, progress_bar\n","\n","from sklearn.feature_extraction.text import CountVectorizer"]},{"cell_type":"markdown","metadata":{"id":"cSlSeNxpELos"},"source":["## Data preprocessing"]},{"cell_type":"code","execution_count":4,"metadata":{"id":"VVVfrmyYbL0-","executionInfo":{"status":"ok","timestamp":1696875526271,"user_tz":420,"elapsed":14375,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["train_df = pd.read_csv(\"/content/drive/MyDrive/Colab/parsernaam/data/pos_train.csv\")\n","val_df = pd.read_csv(\"/content/drive/MyDrive/Colab/parsernaam/data/pos_val.csv\")\n","test_df = pd.read_csv(\"/content/drive/MyDrive/Colab/parsernaam/data/pos_test.csv\")"]},{"cell_type":"code","execution_count":5,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"u0TJpyUQEAHz","executionInfo":{"status":"ok","timestamp":1696875526272,"user_tz":420,"elapsed":14,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"6208c621-16c8-4974-dc2e-bb6ec905e703"},"outputs":[{"output_type":"stream","name":"stdout","text":["(4899904, 4)\n","(3062440, 4)\n","(3062440, 4)\n"]}],"source":["print(train_df.shape)\n","print(val_df.shape)\n","print(test_df.shape)"]},{"cell_type":"code","execution_count":6,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"executionInfo":{"elapsed":11,"status":"ok","timestamp":1696875526273,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"iwdO0P4PbfHI","outputId":"ae5964ac-28ea-479c-ec30-6415451507ee"},"outputs":[{"output_type":"execute_result","data":{"text/plain":[" name_first name_last name type\n","0 Dominic Reep Reep Dominic last_first\n","1 Richard Nichols Nichols Richard last_first\n","2 Nicholas Turner Nicholas Turner first_last\n","3 Fatima Ismail Fatima Ismail first_last\n","4 Victoria Jammel Victoria Jammel first_last"],"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
name_firstname_lastnametype
0DominicReepReep Dominiclast_first
1RichardNicholsNichols Richardlast_first
2NicholasTurnerNicholas Turnerfirst_last
3FatimaIsmailFatima Ismailfirst_last
4VictoriaJammelVictoria Jammelfirst_last
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","\n","
\n","
\n"]},"metadata":{},"execution_count":6}],"source":["train_df.head()"]},{"cell_type":"markdown","metadata":{"id":"WitJjk39ZW3r"},"source":["## Creating Vocab"]},{"cell_type":"code","execution_count":7,"metadata":{"id":"mGdsr5-1ZWMc","executionInfo":{"status":"ok","timestamp":1696875526273,"user_tz":420,"elapsed":9,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["vectorizer = CountVectorizer(analyzer='char', lowercase=False)"]},{"cell_type":"code","execution_count":8,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":34113,"status":"ok","timestamp":1696875560378,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"JCGmPOeDbXUE","outputId":"91bc0575-11e2-4d45-fa12-af9116c7ed63"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["<4899904x55 sparse matrix of type ''\n","\twith 53704341 stored elements in Compressed Sparse Row format>"]},"metadata":{},"execution_count":8}],"source":["vectorizer.fit_transform(train_df['name'])"]},{"cell_type":"code","execution_count":9,"metadata":{"id":"renBhCNHbekD","executionInfo":{"status":"ok","timestamp":1696875560378,"user_tz":420,"elapsed":4,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["vocab = list(vectorizer.get_feature_names_out())"]},{"cell_type":"code","execution_count":10,"metadata":{"id":"1e0oppKIb2I7","executionInfo":{"status":"ok","timestamp":1696875560378,"user_tz":420,"elapsed":4,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["n_letters = len(vocab)"]},{"cell_type":"markdown","metadata":{"id":"GzHXp_2UE_H6"},"source":["## Creating Dataset"]},{"cell_type":"code","execution_count":11,"metadata":{"id":"a2UdQLOKYSpn","executionInfo":{"status":"ok","timestamp":1696875562178,"user_tz":420,"elapsed":1650,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["all_categories = ['last_first', 'first_last']\n","n_categories = len(all_categories)\n","seq_len = train_df['name'].str.len().max()\n","\n","cat_map = {'last_first': 0, 'first_last': 1}\n","\n","def getTarget(label):\n"," return cat_map[label]"]},{"cell_type":"code","execution_count":12,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":63,"status":"ok","timestamp":1696875562179,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"ft1gqGeqYSpp","outputId":"1b61086e-c813-4831-851d-6bd315c74ebc"},"outputs":[{"output_type":"stream","name":"stdout","text":["classes - ['last_first', 'first_last']\n","no of classes - 2\n","max seq len - 47\n"]}],"source":["print(f\"classes - {all_categories}\")\n","print(f\"no of classes - {n_categories}\")\n","print(f\"max seq len - {seq_len}\")"]},{"cell_type":"code","execution_count":13,"metadata":{"id":"RI-qV--Da6I_","executionInfo":{"status":"ok","timestamp":1696875562179,"user_tz":420,"elapsed":59,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["# helper methods used for transform in dataset\n","\n","all_letters = ''.join(vocab)\n","oob = n_letters + 1\n","\n","def letterToIndex(letter):\n"," return all_letters.find(letter)\n","\n","def lineToTensor(line):\n"," tensor = torch.ones(seq_len) * oob\n"," try:\n"," for li, letter in enumerate(line):\n"," tensor[li] = letterToIndex(letter)\n"," except:\n"," pass\n"," return tensor"]},{"cell_type":"code","execution_count":14,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58,"status":"ok","timestamp":1696875562179,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"uRYxmYbkcIVZ","outputId":"6093c1be-04cd-4c9d-89ea-c7b544d80d90"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["tensor([12., 29., 47., 43., 42., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56.])"]},"metadata":{},"execution_count":14}],"source":["lineToTensor('Jason')"]},{"cell_type":"code","execution_count":15,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":43,"status":"ok","timestamp":1696875562179,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"NPAYYcHAK59U","outputId":"dee1f02d-2b10-4d37-ef04-2b12d09e66ec"},"outputs":[{"output_type":"stream","name":"stdout","text":["torch.Size([47])\n"]}],"source":["print(lineToTensor('Jason').size())"]},{"cell_type":"code","execution_count":16,"metadata":{"id":"kKwuNTwjEzkV","executionInfo":{"status":"ok","timestamp":1696875562179,"user_tz":420,"elapsed":36,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["# A custom Dataset class must implement three functions: __init__, __len__, and __getitem__\n","\n","class EthniColorDataset(Dataset):\n"," def __init__(self, data_df, transform=None):\n"," self.df = data_df\n"," self.transform = transform\n","\n"," def __len__(self):\n"," return len(self.df)\n","\n"," def __getitem__(self, idx):\n"," if torch.is_tensor(idx):\n"," idx = idx.tolist()\n"," name = self.df.iloc[idx, train_df.columns.get_loc('name')]\n"," if self.transform:\n"," name = self.transform(name)\n"," label = self.df.iloc[idx, train_df.columns.get_loc('type')]\n"," label = getTarget(label)\n"," target = torch.tensor(label, dtype=torch.int64)\n"," return name, target"]},{"cell_type":"code","execution_count":17,"metadata":{"id":"Ue_MhX-7QN9I","executionInfo":{"status":"ok","timestamp":1696875562179,"user_tz":420,"elapsed":35,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["train_dataset = EthniColorDataset(train_df, lineToTensor)\n","val_dataset = EthniColorDataset(val_df, lineToTensor)\n","test_dataset = EthniColorDataset(test_df, lineToTensor)"]},{"cell_type":"code","execution_count":18,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":36,"status":"ok","timestamp":1696875562180,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"U9fp-gC9Mnft","outputId":"154f5801-096e-45ba-db83-b5f3adc42f9c"},"outputs":[{"output_type":"stream","name":"stdout","text":["0 tensor([20., 33., 33., 44., 0., 6., 43., 41., 37., 42., 37., 31., 56., 56.,\n"," 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56.]) tensor(0)\n","1 tensor([16., 37., 31., 36., 43., 40., 47., 0., 20., 37., 31., 36., 29., 46.,\n"," 32., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56.]) tensor(0)\n","2 tensor([16., 37., 31., 36., 43., 40., 29., 47., 0., 22., 49., 46., 42., 33.,\n"," 46., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56.]) tensor(1)\n"]}],"source":["for i in range(3):\n"," name, label = train_dataset[i]\n"," print(i, name, label)"]},{"cell_type":"code","execution_count":19,"metadata":{"id":"nbNgheP8e12B","executionInfo":{"status":"ok","timestamp":1696875562180,"user_tz":420,"elapsed":28,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["num_workers = !lscpu | grep \"^CPU(s):\" | awk '{print $2}'"]},{"cell_type":"code","execution_count":20,"metadata":{"id":"tGyzWNzgNzjc","executionInfo":{"status":"ok","timestamp":1696875567230,"user_tz":420,"elapsed":3,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["# The Dataset retrieves our dataset’s features and labels one sample at a time.\n","# While training a model, we typically want to pass samples in “minibatches”,\n","# reshuffle the data at every epoch to reduce model overfitting, and\n","# use Python’s multiprocessing to speed up data retrieval.\n","\n","batch_size=128\n","\n","train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, drop_last=True, num_workers=os.cpu_count())\n","val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=True, drop_last=True, num_workers=os.cpu_count())\n","test_dataloader = DataLoader(test_dataset, batch_size=batch_size, shuffle=True, drop_last=True, num_workers=os.cpu_count())"]},{"cell_type":"code","execution_count":21,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":1087,"status":"ok","timestamp":1696875569290,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"C7c7-RtYlE3G","outputId":"bfdff4ef-fa52-434b-a3aa-36ab436f5221"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["[tensor([[12., 43., 40., ..., 56., 56., 56.],\n"," [ 4., 46., 43., ..., 56., 56., 56.],\n"," [25., 37., 42., ..., 56., 56., 56.],\n"," ...,\n"," [17., 46., 29., ..., 56., 56., 56.],\n"," [ 9., 43., 40., ..., 56., 56., 56.],\n"," [14., 33., 50., ..., 56., 56., 56.]]),\n"," tensor([0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1,\n"," 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0,\n"," 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1,\n"," 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,\n"," 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1,\n"," 0, 1, 1, 0, 0, 0, 0, 0])]"]},"metadata":{},"execution_count":21}],"source":["next(iter(train_dataloader))"]},{"cell_type":"code","execution_count":22,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":1023,"status":"ok","timestamp":1696875570311,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"UAebM2_6kIr1","outputId":"5feb319e-bdb1-41b6-c2fb-831ed34a3de7"},"outputs":[{"output_type":"stream","name":"stdout","text":["0 torch.Size([128, 47]) torch.Size([128])\n","1 torch.Size([128, 47]) torch.Size([128])\n","2 torch.Size([128, 47]) torch.Size([128])\n"]}],"source":["for i_batch, sample_batched in enumerate(train_dataloader):\n"," print(i_batch, sample_batched[0].size(), sample_batched[1].size())\n"," if i_batch == 2:\n"," break"]},{"cell_type":"markdown","metadata":{"id":"-YDe9RIDgnVS"},"source":["## Define LSTM Model"]},{"cell_type":"code","execution_count":27,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":198,"status":"ok","timestamp":1696877034213,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"5zvwGXG2M-Gu","outputId":"bbd3c694-4896-413e-cab5-7b24a166052e"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["LSTM(\n"," (embedding): Embedding(57, 256)\n"," (lstm): LSTM(256, 256, num_layers=2, batch_first=True)\n"," (fc): Linear(in_features=256, out_features=2, bias=True)\n"," (softmax): LogSoftmax(dim=1)\n",")"]},"metadata":{},"execution_count":27}],"source":["# Set the random seed for reproducible results\n","torch.manual_seed(42)\n","device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n","\n","class LSTM(nn.Module):\n"," def __init__(self, input_size, hidden_size, output_size, num_layers=1):\n"," super(LSTM, self).__init__()\n"," self.hidden_size = hidden_size\n"," self.num_layers = num_layers\n","\n"," # The nn.Embedding layer returns a new tensor with dimension (sequence_length, 1, hidden_size)\n"," self.embedding = nn.Embedding(input_size, hidden_size)\n"," # LSTM layer expects a tensor of dimension (batch_size, sequence_length, hidden_size).\n"," self.lstm = nn.LSTM(hidden_size, hidden_size, num_layers, batch_first=True)\n"," self.fc = nn.Linear(hidden_size, output_size)\n"," self.softmax = nn.LogSoftmax(dim=1)\n","\n"," def forward(self, input):\n"," embedded = self.embedding(input.type(torch.IntTensor).to(input.device))\n"," # embedded = embedded.view(embedded.shape[0],-1,embedded.shape[3])\n"," h0 = torch.zeros(self.num_layers, embedded.size(0), self.hidden_size).to(input.device)\n"," c0 = torch.zeros(self.num_layers, embedded.size(0), self.hidden_size).to(input.device)\n"," out, _ = self.lstm(embedded, (h0, c0))\n"," out = out[:, -1, :] # get the output of the last time step\n"," out = self.fc(out)\n"," out = self.softmax(out)\n"," return out\n","\n","\n","n_hidden = 256\n","seq_len = seq_len\n","vocab_size = n_letters + 1 + 1 # vocab + oob + 1\n","\n","rnn = LSTM(vocab_size, n_hidden, n_categories, num_layers=2)\n","rnn.to(device)"]},{"cell_type":"markdown","metadata":{"id":"NIsVBTBmgr9N"},"source":["## Verify with sample data"]},{"cell_type":"code","execution_count":28,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":167,"status":"ok","timestamp":1696877039043,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"G2v1iG1PTDsO","outputId":"e22bef45-1c7f-49ca-8a8d-e8d591648a27"},"outputs":[{"output_type":"stream","name":"stdout","text":["tensor([20., 33., 33., 44., 0., 6., 43., 41., 37., 42., 37., 31., 56., 56.,\n"," 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56., 56.,\n"," 56., 56., 56., 56., 56.])\n","input shape : torch.Size([47])\n","input shape w batch : torch.Size([1, 47])\n","torch.Size([1, 2])\n","tensor([[-0.7407, -0.6477]], device='cuda:0', grad_fn=)\n","tensor(1, device='cuda:0')\n","model predicted w/o train - first_last\n"]}],"source":["input = lineToTensor('Reep Dominic')\n","\n","print(input)\n","print(\"input shape : \",input.shape)\n","print(\"input shape w batch : \", input.unsqueeze(0).shape)\n","#print(hidden.shape)\n","\n","# sending with batch 1\n","output = rnn(input.unsqueeze(0).to(device))\n","# print(output) - has 47x8 log values\n","print(output.shape)\n","print(output)\n","print(torch.argmax(output))\n","print(f\"model predicted w/o train - {all_categories[torch.argmax(output).item()]}\")"]},{"cell_type":"markdown","metadata":{"id":"_qsEnfPKgYgt"},"source":["## Training\n"]},{"cell_type":"code","execution_count":29,"metadata":{"id":"g6MYfcuxZm0_","executionInfo":{"status":"ok","timestamp":1696877042054,"user_tz":420,"elapsed":5,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["class EarlyStopper:\n"," def __init__(self, patience=1, min_delta=0):\n"," self.patience = patience\n"," self.min_delta = min_delta\n"," self.counter = 0\n"," self.min_validation_loss = np.inf\n","\n"," def early_stop(self, validation_loss):\n"," if validation_loss < self.min_validation_loss:\n"," self.min_validation_loss = validation_loss\n"," self.counter = 0\n"," elif validation_loss > (self.min_validation_loss + self.min_delta):\n"," self.counter += 1\n"," if self.counter >= self.patience:\n"," return True\n"," return False"]},{"cell_type":"code","execution_count":30,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"elapsed":34082457,"status":"ok","timestamp":1696911127306,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"RUkgRkq-TuWB","outputId":"8fecb8cb-3329-4b2b-c48d-c8dabdc910e7"},"outputs":[{"output_type":"display_data","data":{"text/plain":[""],"text/html":["\n","\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":[""],"text/html":["\n","
\n"," \n"," 71.00% [71/100 9:20:09<3:48:47]\n","
\n"," \n","\n","Epoch 0: Training loss 0.693330 validation loss 0.693267 with lr 0.005000

\n","Epoch 1: Training loss 0.693294 validation loss 0.693273 with lr 0.005000

\n","Epoch 2: Training loss 0.693294 validation loss 0.693160 with lr 0.005000

\n","Epoch 3: Training loss 0.693289 validation loss 0.693209 with lr 0.005000

\n","Epoch 4: Training loss 0.399313 validation loss 0.129412 with lr 0.005000

\n","Epoch 5: Training loss 0.115717 validation loss 0.106889 with lr 0.005000

\n","Epoch 6: Training loss 0.101744 validation loss 0.093710 with lr 0.005000

\n","Epoch 7: Training loss 0.091907 validation loss 0.088565 with lr 0.005000

\n","Epoch 8: Training loss 0.085338 validation loss 0.079691 with lr 0.005000

\n","Epoch 9: Training loss 0.081449 validation loss 0.079245 with lr 0.005000

\n","Epoch 10: Training loss 0.079082 validation loss 0.073803 with lr 0.005000

\n","Epoch 11: Training loss 0.077469 validation loss 0.073598 with lr 0.005000

\n","Epoch 12: Training loss 0.076562 validation loss 0.073887 with lr 0.005000

\n","Epoch 13: Training loss 0.075831 validation loss 0.073321 with lr 0.005000

\n","Epoch 14: Training loss 0.075141 validation loss 0.073443 with lr 0.005000

\n","Epoch 15: Training loss 0.074202 validation loss 0.070779 with lr 0.005000

\n","Epoch 16: Training loss 0.073150 validation loss 0.071073 with lr 0.005000

\n","Epoch 17: Training loss 0.072466 validation loss 0.069259 with lr 0.005000

\n","Epoch 18: Training loss 0.071581 validation loss 0.069029 with lr 0.005000

\n","Epoch 19: Training loss 0.070829 validation loss 0.068856 with lr 0.005000

\n","Epoch 20: Training loss 0.069747 validation loss 0.067442 with lr 0.005000

\n","Epoch 21: Training loss 0.069111 validation loss 0.065228 with lr 0.005000

\n","Epoch 22: Training loss 0.068123 validation loss 0.065574 with lr 0.005000

\n","Epoch 23: Training loss 0.067382 validation loss 0.064849 with lr 0.005000

\n","Epoch 24: Training loss 0.066483 validation loss 0.063646 with lr 0.005000

\n","Epoch 25: Training loss 0.065615 validation loss 0.062445 with lr 0.005000

\n","Epoch 26: Training loss 0.064674 validation loss 0.061183 with lr 0.005000

\n","Epoch 27: Training loss 0.063706 validation loss 0.061268 with lr 0.005000

\n","Epoch 28: Training loss 0.062966 validation loss 0.060549 with lr 0.005000

\n","Epoch 29: Training loss 0.062035 validation loss 0.059299 with lr 0.005000

\n","Epoch 30: Training loss 0.061105 validation loss 0.058976 with lr 0.005000

\n","Epoch 31: Training loss 0.060302 validation loss 0.057120 with lr 0.005000

\n","Epoch 32: Training loss 0.059499 validation loss 0.056281 with lr 0.005000

\n","Epoch 33: Training loss 0.058428 validation loss 0.055455 with lr 0.005000

\n","Epoch 34: Training loss 0.057516 validation loss 0.055453 with lr 0.005000

\n","Epoch 35: Training loss 0.056454 validation loss 0.053419 with lr 0.005000

\n","Epoch 36: Training loss 0.055501 validation loss 0.053024 with lr 0.005000

\n","Epoch 37: Training loss 0.054350 validation loss 0.051261 with lr 0.005000

\n","Epoch 38: Training loss 0.053340 validation loss 0.049601 with lr 0.005000

\n","Epoch 39: Training loss 0.052307 validation loss 0.048779 with lr 0.005000

\n","Epoch 40: Training loss 0.051125 validation loss 0.047701 with lr 0.005000

\n","Epoch 41: Training loss 0.050064 validation loss 0.046487 with lr 0.005000

\n","Epoch 42: Training loss 0.048756 validation loss 0.045038 with lr 0.005000

\n","Epoch 43: Training loss 0.047540 validation loss 0.043608 with lr 0.005000

\n","Epoch 44: Training loss 0.046161 validation loss 0.044051 with lr 0.005000

\n","Epoch 45: Training loss 0.044814 validation loss 0.041370 with lr 0.005000

\n","Epoch 46: Training loss 0.043372 validation loss 0.040085 with lr 0.005000

\n","Epoch 47: Training loss 0.041894 validation loss 0.038943 with lr 0.005000

\n","Epoch 48: Training loss 0.040322 validation loss 0.037260 with lr 0.005000

\n","Epoch 49: Training loss 0.038656 validation loss 0.035383 with lr 0.005000

\n","Epoch 50: Training loss 0.036956 validation loss 0.034194 with lr 0.005000

\n","Epoch 51: Training loss 0.035084 validation loss 0.032582 with lr 0.005000

\n","Epoch 52: Training loss 0.033156 validation loss 0.030633 with lr 0.005000

\n","Epoch 53: Training loss 0.031259 validation loss 0.028938 with lr 0.005000

\n","Epoch 54: Training loss 0.029277 validation loss 0.027021 with lr 0.005000

\n","Epoch 55: Training loss 0.027378 validation loss 0.025888 with lr 0.005000

\n","Epoch 56: Training loss 0.025658 validation loss 0.024333 with lr 0.005000

\n","Epoch 57: Training loss 0.024191 validation loss 0.023287 with lr 0.005000

\n","Epoch 58: Training loss 0.022927 validation loss 0.022499 with lr 0.005000

\n","Epoch 59: Training loss 0.022051 validation loss 0.021944 with lr 0.005000

\n","Epoch 60: Training loss 0.021551 validation loss 0.021669 with lr 0.005000

\n","Epoch 61: Training loss 0.021485 validation loss 0.021624 with lr 0.005000

\n","Epoch 62: Training loss 0.021823 validation loss 0.021939 with lr 0.005000

\n","Epoch 63: Training loss 0.022820 validation loss 0.022671 with lr 0.005000

\n","Epoch 64: Training loss 0.024374 validation loss 0.023730 with lr 0.005000

\n","Epoch 65: Training loss 0.026374 validation loss 0.025294 with lr 0.005000

\n","Epoch 66: Training loss 0.028887 validation loss 0.027556 with lr 0.005000

\n","Epoch 67: Training loss 0.031441 validation loss 0.029028 with lr 0.005000

\n","Epoch 68: Training loss 0.034015 validation loss 0.031451 with lr 0.005000

\n","Epoch 69: Training loss 0.036417 validation loss 0.033340 with lr 0.005000

\n","Epoch 70: Training loss 0.038537 validation loss 0.035116 with lr 0.005000

\n","\n","

\n"," \n"," 100.00% [23925/23925 02:33<00:00]\n","
\n"," "]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{}},{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.10/dist-packages/numpy/core/shape_base.py:65: FutureWarning: The input object of type 'Tensor' is an array-like implementing one of the corresponding protocols (`__array__`, `__array_interface__` or `__array_struct__`); but not a sequence (or 0-D). In the future, this object will be coerced as if it was first converted using `np.array(obj)`. To retain the old behaviour, you have to either modify the type 'Tensor', or assign to an empty array created with `np.empty(correct_shape, dtype=object)`.\n"," ary = asanyarray(ary)\n"]},{"output_type":"stream","name":"stdout","text":["Validation loss decreased (inf --> 0.693267). Saving model ...\n"]},{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.10/dist-packages/numpy/core/shape_base.py:65: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.\n"," ary = asanyarray(ary)\n"]},{"output_type":"stream","name":"stdout","text":["Validation loss decreased (0.693267 --> 0.693160). Saving model ...\n","Validation loss decreased (0.693160 --> 0.129412). Saving model ...\n","Validation loss decreased (0.129412 --> 0.106889). Saving model ...\n","Validation loss decreased (0.106889 --> 0.093710). Saving model ...\n","Validation loss decreased (0.093710 --> 0.088565). Saving model ...\n","Validation loss decreased (0.088565 --> 0.079691). Saving model ...\n","Validation loss decreased (0.079691 --> 0.079245). Saving model ...\n","Validation loss decreased (0.079245 --> 0.073803). Saving model ...\n","Validation loss decreased (0.073803 --> 0.073598). Saving model ...\n","Validation loss decreased (0.073598 --> 0.073321). Saving model ...\n","Validation loss decreased (0.073321 --> 0.070779). Saving model ...\n","Validation loss decreased (0.070779 --> 0.069259). Saving model ...\n","Validation loss decreased (0.069259 --> 0.069029). Saving model ...\n","Validation loss decreased (0.069029 --> 0.068856). Saving model ...\n","Validation loss decreased (0.068856 --> 0.067442). Saving model ...\n","Validation loss decreased (0.067442 --> 0.065228). Saving model ...\n","Validation loss decreased (0.065228 --> 0.064849). Saving model ...\n","Validation loss decreased (0.064849 --> 0.063646). Saving model ...\n","Validation loss decreased (0.063646 --> 0.062445). Saving model ...\n","Validation loss decreased (0.062445 --> 0.061183). Saving model ...\n","Validation loss decreased (0.061183 --> 0.060549). Saving model ...\n","Validation loss decreased (0.060549 --> 0.059299). Saving model ...\n","Validation loss decreased (0.059299 --> 0.058976). Saving model ...\n","Validation loss decreased (0.058976 --> 0.057120). Saving model ...\n","Validation loss decreased (0.057120 --> 0.056281). Saving model ...\n","Validation loss decreased (0.056281 --> 0.055455). Saving model ...\n","Validation loss decreased (0.055455 --> 0.055453). Saving model ...\n","Validation loss decreased (0.055453 --> 0.053419). Saving model ...\n","Validation loss decreased (0.053419 --> 0.053024). Saving model ...\n","Validation loss decreased (0.053024 --> 0.051261). Saving model ...\n","Validation loss decreased (0.051261 --> 0.049601). Saving model ...\n","Validation loss decreased (0.049601 --> 0.048779). Saving model ...\n","Validation loss decreased (0.048779 --> 0.047701). Saving model ...\n","Validation loss decreased (0.047701 --> 0.046487). Saving model ...\n","Validation loss decreased (0.046487 --> 0.045038). Saving model ...\n","Validation loss decreased (0.045038 --> 0.043608). Saving model ...\n","Validation loss decreased (0.043608 --> 0.041370). Saving model ...\n","Validation loss decreased (0.041370 --> 0.040085). Saving model ...\n","Validation loss decreased (0.040085 --> 0.038943). Saving model ...\n","Validation loss decreased (0.038943 --> 0.037260). Saving model ...\n","Validation loss decreased (0.037260 --> 0.035383). Saving model ...\n","Validation loss decreased (0.035383 --> 0.034194). Saving model ...\n","Validation loss decreased (0.034194 --> 0.032582). Saving model ...\n","Validation loss decreased (0.032582 --> 0.030633). Saving model ...\n","Validation loss decreased (0.030633 --> 0.028938). Saving model ...\n","Validation loss decreased (0.028938 --> 0.027021). Saving model ...\n","Validation loss decreased (0.027021 --> 0.025888). Saving model ...\n","Validation loss decreased (0.025888 --> 0.024333). Saving model ...\n","Validation loss decreased (0.024333 --> 0.023287). Saving model ...\n","Validation loss decreased (0.023287 --> 0.022499). Saving model ...\n","Validation loss decreased (0.022499 --> 0.021944). Saving model ...\n","Validation loss decreased (0.021944 --> 0.021669). Saving model ...\n","Validation loss decreased (0.021669 --> 0.021624). Saving model ...\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{}}],"source":["epochs = 100\n","lr = 0.005\n","\n","\n","# CrossEntropyLoss expects raw prediction values while NLLLoss expects log probabilities.\n","# criterion = nn.CrossEntropyLoss() # nn.NLLLoss()\n","# since we are using nn.LogSoftmax as final layer at model\n","criterion = nn.NLLLoss()\n","\n","optimizer = AdamW(rnn.parameters(), lr)\n","scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=60, eta_min=1e-5)\n","\n","\n","early_stopper = EarlyStopper(patience=10)\n","\n","\n","mb = master_bar(range(epochs))\n","mb.names = ['Training loss', 'Validation loss']\n","\n","x = []\n","training_losses = []\n","validation_losses = []\n","\n","valid_mean_min = np.Inf\n","\n","till_batch = 1000\n","\n","for epoch in mb:\n"," x.append(epoch)\n"," # Train\n"," i = 0\n"," rnn.train()\n"," total_loss = torch.Tensor([0.0]).to(device)\n"," for batch in progress_bar(train_dataloader, parent=mb):\n"," rnn.zero_grad()\n"," input = batch[0].to(device)\n"," label = batch[1].to(device)\n"," output = rnn(input)\n"," loss = criterion(output, label)\n"," # backward propagation\n"," loss.backward()\n"," # `clip_grad_norm` helps prevent the exploding gradient problem in RNNs / LSTMs.\n"," #torch.nn.utils.clip_grad_norm_(rnn.parameters(), clip)\n"," optimizer.step()\n"," with torch.no_grad():\n"," total_loss += loss.item()\n"," i += 1\n"," #if i == till_batch:\n"," # break\n","\n"," # decay lr\n"," scheduler.step()\n","\n"," mean = total_loss / len(train_dataloader)\n"," #mean = total_loss / till_batch\n"," training_losses.append(mean.cpu())\n","\n"," # Evaluate\n"," i = 0\n"," rnn.eval()\n"," validation_loss = torch.Tensor([0.0]).to(device)\n"," with torch.no_grad():\n"," for batch in progress_bar(val_dataloader, parent=mb):\n"," input = batch[0].to(device)\n"," label = batch[1].to(device)\n"," output = rnn(input)\n"," loss = criterion(output, label)\n"," validation_loss += loss.item()\n"," i += 1\n"," #if i == till_batch:\n"," # break\n","\n"," val_mean = validation_loss / len(val_dataloader)\n"," #val_mean = validation_loss / till_batch\n"," validation_losses.append(val_mean.cpu())\n"," # Update training chart\n"," mb.update_graph([[x, training_losses], [x, validation_losses]], [0,epochs])\n"," mb.write(f\"\\nEpoch {epoch}: Training loss {mean.item():.6f} validation loss {val_mean.item():.6f} with lr {lr:.6f}\")\n"," # save model if validation loss has decreased\n"," if val_mean.item() <= valid_mean_min:\n"," print('Validation loss decreased ({:.6f} --> {:.6f}). Saving model ...'.format(\n"," valid_mean_min,\n"," val_mean.item()))\n"," torch.save(rnn.state_dict(), '/content/drive/MyDrive/Colab/parsernaam/naamparser_pos.pt')\n"," valid_mean_min = val_mean.item()\n","\n"," if early_stopper.early_stop(val_mean.item()):\n"," break"]},{"cell_type":"markdown","metadata":{"id":"e6ylXlQwqfkj"},"source":["## Save Model"]},{"cell_type":"code","execution_count":31,"metadata":{"id":"1DoKR-M_qedg","executionInfo":{"status":"ok","timestamp":1696911129573,"user_tz":420,"elapsed":341,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["torch.save(rnn.state_dict(), '/content/drive/MyDrive/Colab/parsernaam/naamparser_pos_after_train.pt')"]},{"cell_type":"code","execution_count":32,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":559},"executionInfo":{"elapsed":6,"status":"ok","timestamp":1696911129573,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"nFk3kN8mYSp-","outputId":"d393cff1-a52b-47be-b5a8-88182e3e7749"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["Text(0, 0.5, 'loss')"]},"metadata":{},"execution_count":32},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAhgAAAINCAYAAAB8nwY4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABbKElEQVR4nO3deXhU9d3+8ffMJDOTPSEJ2QiEVRZZbFgaqFuNxaVWra1oaUFUfLTglmqRnxXcamxVymOh0lqR2trCo1Vri4KYCq2IsomCRDaRBCQJa0ISss2c3x+zkECIEELmnOR+Xde5MjlzZuZ7CJLbz3ezGYZhICIiItKG7KFugIiIiHQ8ChgiIiLS5hQwREREpM0pYIiIiEibU8AQERGRNqeAISIiIm1OAUNERETanAKGiIiItLmwUDegvXm9Xr766itiYmKw2Wyhbo6IiIhlGIbBkSNHSE9Px25vuUbR6QLGV199RWZmZqibISIiYlnFxcV069atxWs6XcCIiYkBfH84sbGxIW6NiIiIdVRUVJCZmRn8XdqSThcwAt0isbGxChgiIiKtcCpDDDTIU0RERNqcAoaIiIi0OQUMERERaXOdbgyGiEhHYBgGDQ0NeDyeUDdFOpjw8HAcDscZv48ChoiIxdTV1bF3716qq6tD3RTpgGw2G926dSM6OvqM3kcBQ0TEQrxeLzt37sThcJCeno7T6dSigdJmDMNg37597N69m759+55RJUMBQ0TEQurq6vB6vWRmZhIZGRnq5kgHlJyczJdffkl9ff0ZBQwN8hQRsaCvW6ZZpLXaqiKmv6EiIiLS5kwRMObOnUtWVhZut5tRo0axevXqk1570UUXYbPZTjiuvPLKdmyxiIiEWlZWFrNnzz7l65cvX47NZuPw4cNnrU1yTMgDxqJFi8jLy2PmzJmsX7+eoUOHMnbsWMrKypq9/rXXXmPv3r3BY9OmTTgcDn74wx+2c8tFRORUNPc/hY2Phx9+uFXvu2bNGm677bZTvn706NHs3buXuLi4Vn3eqVKQ8Qn5IM9Zs2YxefJkJk2aBMC8efNYvHgx8+fP54EHHjjh+i5dujT5fuHChURGRipgiIiY1N69e4OPFy1axIwZM9iyZUvwXOPpkIZh4PF4CAv7+l9PycnJp9UOp9NJamrqab1GWi+kFYy6ujrWrVtHbm5u8Jzdbic3N5dVq1ad0nu88MIL3HDDDURFRZ2tZoqIyBlITU0NHnFxcdhstuD3n3/+OTExMbz99ttkZ2fjcrl4//332bFjB1dffTUpKSlER0czYsQI3n333Sbve3wXic1m449//CPXXnstkZGR9O3blzfffDP4/PGVhQULFhAfH8/SpUsZMGAA0dHRXHbZZU0CUUNDA3fddRfx8fEkJiYybdo0Jk6cyDXXXNPqP49Dhw4xYcIEEhISiIyM5PLLL2fbtm3B53ft2sVVV11FQkICUVFRDBo0iLfeeiv42vHjx5OcnExERAR9+/blxRdfbHVbzqaQBoz9+/fj8XhISUlpcj4lJYWSkpKvff3q1avZtGkTt95660mvqa2tpaKioskhItJRGIZBdV1DSA7DMNrsPh544AGefPJJCgsLGTJkCJWVlVxxxRUUFBTw8ccfc9lll3HVVVdRVFTU4vs88sgjXH/99Xz66adcccUVjB8/noMHD570+urqap5++mn+/Oc/85///IeioiLuu+++4PO/+tWvePnll3nxxRdZuXIlFRUVvPHGG2d0rzfddBNr167lzTffZNWqVRiGwRVXXEF9fT0AU6ZMoba2lv/85z9s3LiRX/3qV8Eqz0MPPcTmzZt5++23KSws5LnnniMpKemM2nO2hLyL5Ey88MILDB48mJEjR570mvz8fB555JF2bJWISPs5Wu9h4IylIfnszY+OJdLZNr9GHn30US699NLg9126dGHo0KHB7x977DFef/113nzzTaZOnXrS97npppu48cYbAXjiiSd49tlnWb16NZdddlmz19fX1zNv3jx69+4NwNSpU3n00UeDz//2t79l+vTpXHvttQDMmTMnWE1ojW3btvHmm2+ycuVKRo8eDcDLL79MZmYmb7zxBj/84Q8pKiriuuuuY/DgwQD06tUr+PqioiLOO+88hg8fDviqOGYV0gpGUlISDoeD0tLSJudLS0u/tp+sqqqKhQsXcsstt7R43fTp0ykvLw8excXFZ9xuERFpW4FfmAGVlZXcd999DBgwgPj4eKKjoyksLPzaCsaQIUOCj6OiooiNjT3ppAGAyMjIYLgASEtLC15fXl5OaWlpk/+JdTgcZGdnn9a9NVZYWEhYWBijRo0KnktMTOScc86hsLAQgLvuuovHH3+cMWPGMHPmTD799NPgtXfccQcLFy5k2LBh/PznP+eDDz5o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P3485513Hs899xwOh4MNGzYEt4CfMmUKdXV1/Oc//yEqKorNmzcTHR192u04HQoYJuIIDPJUF4mInKr6angiPTSf/f++AmfUKV16880389RTT7FixQouuugiwNc9ct111xEXF0dcXBz33Xdf8Po777yTpUuX8n//93+nFDDeffddPv/8c5YuXUp6uu/P44knnjhh3MQvfvGL4OOsrCzuu+8+Fi5cyM9//nMiIiKIjo4mLCyM1NTUk37WX//6V2pqanjppZeIivLd/5w5c7jqqqv41a9+RUpKCgAJCQnMmTMHh8NB//79ufLKKykoKGhVwCgoKGDjxo3s3LmTzMxMAF566SUGDRrEmjVrGDFiBEVFRdx///30798fgL59+wZfX1RUxHXXXcfgwYMB6NWr12m34XSpi8REHP4uEru6SESkg+nfvz+jR49m/vz5AGzfvp3//ve/3HLLLQB4PB4ee+wxBg8eTJcuXYiOjmbp0qUUFRWd0vsXFhaSmZkZDBcAOTk5J1y3aNEixowZQ2pqKtHR0fziF7845c9o/FlDhw4NhguAMWPG4PV62bJlS/DcoEGDcDgcwe/T0tIoKys7rc9q/JmZmZnBcAEwcOBA4uPjKSwsBCAvL49bb72V3NxcnnzySXbs2BG89q677uLxxx9nzJgxzJw5s1WDak+XKhgmEqYKhoicrvBIXyUhVJ99Gm655RbuvPNO5s6dy4svvkjv3r258MILAXjqqaf43//9X2bPns3gwYOJiorinnvuoa6u7TZ/XLVqFePHj+eRRx5h7NixxMXFsXDhQp555pk2+4zGAt0TATabDa/Xe1Y+C3wzYH70ox+xePFi3n77bWbOnMnChQu59tprufXWWxk7diyLFy/mnXfeIT8/n2eeeYY777zzrLVHFQwTCQQMm9GAYRghbo2IWILN5uumCMVxCuMvGrv++uux2+389a9/5aWXXuLmm28OjsdYuXIlV199NT/+8Y8ZOnQovXr1YuvWraf83gMGDKC4uJi9e/cGz3344YdNrvnggw/o0aMHDz74IMOHD6dv377s2rWryTVOpxOPp+X/yRswYACffPIJVVVVwXMrV67EbrdzzjnnnHKbT0fg/oqLi4PnNm/ezOHDhxk4cGDwXL9+/bj33nt55513+P73v8+LL74YfC4zM5Pbb7+d1157jZ/97Gc8//zzZ6Wt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/OMfs2LFiuA1999/P8888wxr1qwhOTmZq666ivr6esAXDK6//npuuOEGNm7cyMMPP8xDDz3EggULgq+fMGECf/vb33j22WcpLCzk97//PdHR0U3a8eCDD/LMM8+wdu1awsLCuPnmm4PPjR8/nm7durFmzRrWrVvHAw88QHh4+Nn9gxERn5BtsyYillVTU2NERkYaH3zwQZPzt9xyi3HjjTcGd+JduHBh8LkDBw4YERERxqJFiwzDMIwf/ehHxqWXXtrk9ffff78xcOBAwzAMY8uWLQZgLFu2rNk2BD7j3XffDZ5bvHixAQS34o6JiTEWLFhw5jcsIqdNFQwROW3bt2+nurqaSy+9lOjo6ODx0ksvsWPHjuB1OTk5wcddunThnHPOobCwEIDCwkLGjBnT5H3HjBnDtm3b8Hg8bNiwAYfDwYUXXthiW4YMGRJ8nJaWBkBZWRkAeXl53HrrreTm5vLkk082aZuInF0KGCJy2iorKwFYvHgxGzZsCB6bN28OjsM4UxEREad0XeMuD5vNBvjGhwA8/PDDfPbZZ1x55ZX8+9//ZuDAgbz++utt0j4RaZkChoictoEDB+JyuSgqKqJPnz5NjszMzOB1H374YfDxoUOH2Lp1KwMGDABgwIABrFy5ssn7rly5kn79+uFwOBg8eDBer7fJmI7W6NevH/feey/vvPMO3//+93nxxRfP6P1E5NSEhboBImI9MTEx3Hfffdx77714vV6+9a1vUV5ezsqVK4mNjaVHjx4APProoyQmJpKSksKDDz5IUlIS11xzDQA/+9nPGDFiBI899hjjxo1j1apVzJkzh9/97ncAZGVlMXHiRG6++WaeffZZhg4dyq5duygrK+P666//2jYePXqU+++/nx/84Af07NmT3bt3s2bNGq677rqz9uciIo2EehCIiFiT1+s1Zs+ebZxzzjlGeHi4kZycbIwdO9ZYsWJFcADmP//5T2PQoEGG0+k0Ro4caXzyySdN3uPVV181Bg4caISHhxvdu3c3nnrqqSbPHz161Lj33nuNtLQ0w+l0Gn369DHmz59vGMaxQZ6HDh0KXv/xxx8bgLFz506jtrbWuOGGG4zMzEzD6XQa6enpxtSpU4MDQEXk7LIZhmGEOOOISAezfPlyLr74Yg4dOkR8fHyomyMiIaAxGCIiItLmFDBERESkzamLRERERNqcKhgiIiLS5hQwREREpM0pYIiIiEibU8AQERGRNqeAISIiIm1OAUNERETanAKGiIiItDkFDBEREWlzChgiIiLS5v4/WVqbn+eifuUAAAAASUVORK5CYII=\n"},"metadata":{}}],"source":["import matplotlib.pyplot as plt\n","\n","fig, ax = plt.subplots(figsize=(6, 6))\n","ax.plot(x, training_losses, validation_losses)\n","ax.legend(['Training Loss', 'Validation Loss'])\n","plt.xlabel(\"epochs\")\n","plt.ylabel(\"loss\")"]},{"cell_type":"code","execution_count":33,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":92,"status":"ok","timestamp":1696911129843,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"sPoPdvmJYSp-","outputId":"dbd13e11-1b62-4581-e208-6a19b52e7da3"},"outputs":[{"output_type":"stream","name":"stdout","text":["tensor([0.0403])\n","tensor([0.0374])\n"]}],"source":["# last epoch losses\n","print(training_losses[-1])\n","print(validation_losses[-1])"]},{"cell_type":"markdown","metadata":{"id":"YkVR5WaPBRin"},"source":["## Testing"]},{"cell_type":"code","execution_count":34,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":92,"status":"ok","timestamp":1696911129844,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"WClV6_m9yFsG","outputId":"bc7f6d5b-232c-4f53-e963-866281d60df2"},"outputs":[{"output_type":"stream","name":"stdout","text":["CUDA is available! Training on GPU ...\n"]}],"source":["# check if CUDA is available\n","train_on_gpu = torch.cuda.is_available()\n","\n","if not train_on_gpu:\n"," print('CUDA is not available. Training on CPU ...')\n","else:\n"," print('CUDA is available! Training on GPU ...')"]},{"cell_type":"code","execution_count":35,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":77,"status":"ok","timestamp":1696911129844,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"iDE3UttjPb6a","outputId":"7b6f4304-12cc-4eef-e7b2-629923c2936a"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["LSTM(\n"," (embedding): Embedding(57, 256)\n"," (lstm): LSTM(256, 256, num_layers=2, batch_first=True)\n"," (fc): Linear(in_features=256, out_features=2, bias=True)\n"," (softmax): LogSoftmax(dim=1)\n",")"]},"metadata":{},"execution_count":35}],"source":["criterion = nn.NLLLoss()\n","rnn = LSTM(vocab_size, n_hidden, n_categories, num_layers=2)\n","rnn.load_state_dict(torch.load('/content/drive/MyDrive/Colab/parsernaam/naamparser_pos.pt'))\n","rnn.to(device)"]},{"cell_type":"code","execution_count":36,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":492807,"status":"ok","timestamp":1696911622628,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"eDUpH4eNgb5O","outputId":"c3feddb3-52a9-498f-8eed-43f56280c897"},"outputs":[{"output_type":"stream","name":"stderr","text":["Testing: 100%|██████████| 23925/23925 [06:58<00:00, 57.10it/s]\n"]},{"output_type":"stream","name":"stdout","text":[" precision recall f1-score support\n","\n"," first_last 0.99 0.99 0.99 1531233\n"," last_first 0.99 0.99 0.99 1531167\n","\n"," accuracy 0.99 3062400\n"," macro avg 0.99 0.99 0.99 3062400\n","weighted avg 0.99 0.99 0.99 3062400\n","\n"]}],"source":["from sklearn.metrics import confusion_matrix, classification_report, ConfusionMatrixDisplay\n","\n","# track test loss\n","test_loss = 0.0\n","\n","\n","class_correct = list(0. for i in range(n_categories))\n","class_total = list(0. for i in range(n_categories))\n","\n","\n","actual = []\n","predictions = []\n","\n","rnn.eval()\n","# iterate over test data\n","pbar = tqdm(test_dataloader, total=len(test_dataloader), position=0, desc=\"Testing\", leave=True)\n","for batch in pbar:\n"," # move tensors to GPU if CUDA is available\n"," input = batch[0].to(device)\n"," label = batch[1].to(device)\n"," output = rnn(input)\n"," loss = criterion(output, label)\n"," test_loss += loss.item()\n"," pred = torch.argmax(output, dim=1)\n"," correct_tensor = pred.eq(label.data.view_as(pred))\n"," correct = np.squeeze(correct_tensor.numpy()) if not train_on_gpu else np.squeeze(correct_tensor.cpu().numpy())\n"," # calculate test accuracy for each object class\n"," for i in range(label.shape[0]):\n"," l = label.data[i]\n"," class_correct[l.long()] += correct[i].item()\n"," class_total[l.long()] += 1\n"," # for confusion matrix\n"," actual.append(all_categories[label.data[i].item()])\n"," predictions.append(all_categories[pred.data[i].item()])\n","\n","\n","# plot confusion matrix\n","cm = confusion_matrix(actual, predictions, labels=all_categories)\n","print(classification_report(actual, predictions))"]},{"cell_type":"code","execution_count":37,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":16,"status":"ok","timestamp":1696911622629,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"oKsIjrK_8KEJ","outputId":"5cda0c26-dc7b-41b8-fbb7-8e4b1e9a4a4e"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.046081881805116506"]},"metadata":{},"execution_count":37}],"source":["test_loss/len(test_dataloader)"]},{"cell_type":"code","execution_count":38,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":852},"executionInfo":{"elapsed":389,"status":"ok","timestamp":1696911623237,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"TrS2WIqxyJPL","outputId":"fd24e977-abe7-469d-a346-8c53c84189f9"},"outputs":[{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":38},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAA0UAAAMyCAYAAACioGrMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABfd0lEQVR4nO3deXQUddbG8acTkk7ICoRsGBLCvoMgvIgLKAg4E0VGcVwjCo4Csg06MMomCoqAiIOiCETccMcFRAFFXHBhU1REWROBsEMgQBK66/0j0k4PaUjahK5UfT/n1Dl0dXXVTc6YyZN761cOwzAMAQAAAIBNBQW6AAAAAAAIJEIRAAAAAFsjFAEAAACwNUIRAAAAAFsjFAEAAACwNUIRAAAAAFsjFAEAAACwNUIRAAAAAFsjFAEAAACwNUIRAAAAAFsjFAEAAAA2tWLFCmVkZCg5OVkOh0MLFiwo8zkMw9DkyZPVoEEDOZ1O1apVSw8//HD5F1uBqgS6AAAAAACBkZ+fr5YtW+r2229Xr169/DrH4MGD9dFHH2ny5Mlq3ry5Dhw4oAMHDpRzpRXLYRiGEegiAAAAAASWw+HQ22+/rZ49e3r2FRQU6P7779crr7yiQ4cOqVmzZnr00UfVqVMnSdKGDRvUokUL/fDDD2rYsGFgCi8HjM8BAAAAKNHAgQO1cuVKzZ8/X99//72uu+46de/eXb/++qsk6b333lN6erref/991alTR2lpaerbt2+l6xQRigAAAACcJjs7W3PnztXrr7+uiy++WHXr1tXw4cN10UUXae7cuZKkLVu2aPv27Xr99dc1b948ZWVlafXq1br22msDXH3ZcE8RAAAAgNOsX79eLpdLDRo08NpfUFCgGjVqSJLcbrcKCgo0b948z3GzZ89WmzZttHHjxkozUkcoAgAAAHCao0ePKjg4WKtXr1ZwcLDXe5GRkZKkpKQkValSxSs4NW7cWFJxp4lQBAAAAKDSat26tVwul/bs2aOLL764xGM6duyokydPavPmzapbt64k6ZdffpEkpaamnrNa/yxWnwMAAABs6ujRo9q0aZOk4hA0depUde7cWdWrV1ft2rV1880364svvtCUKVPUunVr7d27V8uWLVOLFi30l7/8RW63WxdccIEiIyM1bdo0ud1uDRgwQNHR0froo48C/NWVHqEIAAAAsKnly5erc+fOp+3PzMxUVlaWioqK9NBDD2nevHnasWOH4uLi9H//938aN26cmjdvLknauXOn7rnnHn300UeKiIhQjx49NGXKFFWvXv1cfzl+IxQBAAAAsDWW5AYAAABgayy0AAAAAFRyJ06cUGFhYaDLKFFoaKjCwsICXcYZEYoAAACASuzEiROqkxqp3D2uQJdSosTERG3dutXUwYhQBAAAAFRihYWFyt3j0vbVaYqOMtfdMXlH3Epts02FhYWEIgAAAAAVKzoqSNFRwWc/EKchFAEAAAAW4JYht9yBLsOLW5VjoWtz9dcAAAAA4BwjFAEAAACwNcbnAAAAAAtwGW65TDat5jLMNc7nC50iAAAAALZGKAIAAABga4zPAQAAABZQvPqcuebnzFaPL3SKAAAAANgaoQgAAACArTE+BwAAAFiA23SPbpUJKyoZnSIAAAAAtkYoAgAAAGBrjM8BAAAAFuAyDLkMc632ZrZ6fKFTBAAAAMDWCEUAAAAAbI3xOQAAAMACeHir/+gUAQAAALA1QhEAAAAAW2N8DgAAALAAtwy5TDauxvgcAAAAAFQChCIAAAAAtsb4HAAAAGABrD7nPzpFAAAAAGyNUAQAAADA1hifAwAAACzAZRhyGeYaVzNbPb7QKQIAAABga4QiAAAAALbG+BwAAABgAe7fNzMxWz2+0CkCAAAAYGuEIgAAAAC2xvgcAAAAYAEuGXKZ7GGpZqvHFzpFAAAAAGyNUAQAAADA1hifAwAAACzAZRRvZmK2enyhUwQAAADA1ghFAAAAAGyN8TkAAADAAnh4q//oFAEAAACwNUIRAAAAAFtjfA4AAACwALcccskR6DK8uE1Wjy90igAAAADYGqEIAAAAgK0xPgcAAABYgNso3szEbPX4QqcIAAAAgK0RigAAAADYGuNzAAAAgAW4TLj6nNnq8YVOEQAAAABbIxQBAAAAsDXG5wAAAAALYHzOf3SKAAAAANgaoQgAAACArRGKAAAAAAtwGw5TbmWxYsUKZWRkKDk5WQ6HQwsWLCj1Z7/44gtVqVJFrVq1Kts3ToQiAAAAACaRn5+vli1basaMGWX63KFDh3Trrbfq8ssv9+u6LLQAAAAAwBR69OihHj16lPlzd911l2688UYFBweXqbt0Cp0iAAAAwAJOrT5ntk2S8vLyvLaCgoJy+7rnzp2rLVu2aMyYMX6fg1AEAAAAoEKlpKQoJibGs02cOLFczvvrr79qxIgRevHFF1Wliv9DcIzPAQAAAKhQOTk5io6O9rx2Op1/+pwul0s33nijxo0bpwYNGvypcxGKAAAAAFSo6Ohor1BUHo4cOaJVq1Zp7dq1GjhwoCTJ7XbLMAxVqVJFH330kS677LJSnYtQBAAAAFiAS0FymezuGFcFnjs6Olrr16/32vfUU0/p448/1htvvKE6deqU+lyEIgAAAACmcPToUW3atMnzeuvWrVq3bp2qV6+u2rVra+TIkdqxY4fmzZunoKAgNWvWzOvz8fHxCgsLO23/2RCKAAAAAJjCqlWr1LlzZ8/rYcOGSZIyMzOVlZWlXbt2KTs7u9yv6zAMwyj3swIAAAA4J/Ly8hQTE6Nl62srIspc43P5R9y6vHm2Dh8+XO73FJUnc33XAAAAAOAcIxQBAAAAsDXuKQIAAAAswCWHXHIEugwvZqvHFzpFAAAAAGyNUAQAAADA1hifAwAAACzAZQTJZZir5+GqJOtcm+u7BgAAAADnGKEIAAAAgK0xPgcAAABYgFsOuU3W83CrcszPEYpMwu12a+fOnYqKipLDUTmWLgQAALATwzB05MgRJScnKyjIXOEDfw6hyCR27typlJSUQJcBAACAs8jJydF5550X6DJQjghFJhEVFSVJ2r4mTdGR/OUBgDVc06B5oEsAgHJzUkX6XIs8v7eZDQ9v9R+hyCROjcxFRwYpOopQBMAaqjhCAl0CAJSf32+P4VYH6+G3bwAAAAC2RqcIAAAAsABzPry1cqw+Z67vGgAAAACcY4QiAAAAALbG+BwAAABgAcUPbzXXIhBmq8cXOkUAAAAAbI1QBAAAAMDWGJ8DAAAALMCtILlM1vNwi9XnAAAAAMD0CEUAAAAAbI3xOQAAAMACeHir/8z1XQMAAACAc4xQBAAAAMDWGJ8DAAAALMCtILlN1vNg9TkAAAAAqAQIRQAAAABsjfE5AAAAwAJchkMuwxHoMryYrR5f6BQBAAAAsDVCEQAAAABbY3wOAAAAsACXguQyWc/DxepzAAAAAGB+hCIAAAAAtsb4HAAAAGABbiNIbsNcPQ+3wfgcAAAAAJgeoQgAAACArTE+BwAAAFgAq8/5z1zfNQAAAAA4xwhFAAAAAGyN8TkAAADAAtySXIYj0GV4cQe6gFKiUwQAAADA1ghFAAAAAGyN8TkAAADAAtwKkttkPQ+z1eNL5agSAAAAACoIoQgAAACArTE+BwAAAFiAywiSyzBXz8Ns9fhSOaoEAAAAgApCKAIAAABga4zPAQAAABbglkNume3hreaqxxc6RQAAAABsjVAEAAAAwNYYnwMAAAAsgNXn/Fc5qgQAAACACkIoAgAAAGBrjM8BAAAAFuBSkFwm63mYrR5fKkeVAAAAAFBBCEUAAAAAbI3xOQAAAMAC3IZDbsNcD0s1Wz2+0CkCAAAAYGuEIgAAAAC2xvgcAAAAYAFuE64+5zZZPb5UjioBAAAAoIIQigAAAADYGuNzAAAAgAW4jSC5DXP1PMxWjy+Vo0oAAAAAqCCEIgAAAAC2xvgcAAAAYAEuOeSSuR6WarZ6fKFTBAAAAMDWCEUAAAAAbI3xOQAAAMACWH3Of5WjSgAAAACoIIQiAAAAALbG+BwAAABgAS6Zb7U3V6ALKCU6RQAAAABsjVAEAAAAwNYYnwMAAAAsgNXn/Fc5qgQAAACACkIoAgAAAGBrjM8BAAAAFuAyguQy2bia2erxpXJUCQAAAAAVhFAEAAAAwNYYnwMAAAAswJBDbpM9vNUwWT2+0CkCAAAAYGuEIgAAAAC2xvgcAAAAYAGsPue/ylElAAAAAFQQQhEAAAAAW2N8DgAAALAAt+GQ2zDXam9mq8cXOkUAAAAAbI1QBAAAAMDWGJ8DAAAALMClILlM1vMwWz2+VI4qAQAAAFjeihUrlJGRoeTkZDkcDi1YsOCMx7/11lvq2rWratasqejoaHXo0EEffvhhma9LKAIAAABgCvn5+WrZsqVmzJhRquNXrFihrl27atGiRVq9erU6d+6sjIwMrV27tkzXZXwOAAAAsAAzrz6Xl5fntd/pdMrpdJ52fI8ePdSjR49Sn3/atGlerydMmKB33nlH7733nlq3bl3q89ApAgAAAFChUlJSFBMT49kmTpxYIddxu906cuSIqlevXqbP0SkCAAAAUKFycnIUHR3teV1Sl6g8TJ48WUePHlXv3r3L9DlCEQAAAGABbgXJbbJBsFP1REdHe4WiivDyyy9r3LhxeueddxQfH1+mzxKKAAAAAFRq8+fPV9++ffX666+rS5cuZf68uaIkAAAAAJTBK6+8oj59+uiVV17RX/7yF7/OQacIAAAAsACX4ZDLZKvPlbWeo0ePatOmTZ7XW7du1bp161S9enXVrl1bI0eO1I4dOzRv3jxJxSNzmZmZeuKJJ9S+fXvl5uZKksLDwxUTE1Pq69IpAgAAAGAKq1atUuvWrT3LaQ8bNkytW7fW6NGjJUm7du1Sdna25/hnn31WJ0+e1IABA5SUlOTZBg8eXKbr0ikCAAAAYAqdOnWSYRg+38/KyvJ6vXz58nK5LqEIAAAAsAAzP7zV7BifAwAAAGBrhCIAAAAAtsb4HAAAAGABhhEkt2Gunodhsnp8qRxVAgAAAEAFIRQBAAAAsDXG5wAAAAALcMkhl8y12pvZ6vGFThEAAAAAWyMUAQAAALA1xucAAAAAC3Ab5ntYqtsIdAWlQ6cIAAAAgK0RigAAAADYGuNzAAAAgAW4TfjwVrPV40vlqBIAAAAAKgihCAAAAICtMT4HAAAAWIBbDrlN9rBUs9XjC50iAAAAALZGKAIAAABga4zPAQAAABbgMhxymezhrWarxxc6RQAAAABsjVAEAAAAwNYYnwMAAAAsgIe3+q9yVAkAAAAAFYRQBAAAAMDWGJ8DAAAALMAth9wmW+2Nh7cCAAAAQCVAKAIAAABga4zPAQAAABZgyGG6cTXDZPX4QqcIAAAAgK0RigAAAADYGuNzAAAAgAW4DROuPmeyenyhUwQAAADA1ghFAAAAAGyN8TkAAADAAtxGkNyGuXoeZqvHl8pRJQAAAABUEEIRAAAAAFtjfA4AAACwAFaf8x+dIgAAAAC2RigCAAAAYGuMzwEAAAAW4JZDbplrXM1s9fhCpwgAAACArRGKAAAAANga43MAAACABbD6nP/oFAEAAACwNUIRAAAAAFtjfA4AAACwAMbn/EenCAAAAICtEYoAAAAA2BrjcwAAAIAFMD7nPzpFAAAAAGyNUAQAAADA1hifAwAAACyA8Tn/0SkCAAAAYGuEIgAAAAC2xvgcAAAAYAGGJLfMNa5mBLqAUqJTBAAAAMDW6BQBAbb+qwi9/lS8fl1fVQd2h2jM7K26sMdhn8d/92Wk7ru23mn7X1n3g6rHn6ywOle8F6PnJyVp92+hqlWnQHfcv1PtLj/idUz2r07NfihZ338VKddJKbVBgUbN2qr484oqrC4AlU+z9kd1Xf+9qt/8mGokntTY29O0cnGM5/3YuCLdcf8utbn0iCJiXPrhq0jNeKCWdm51SpKiYk/qluG5Ov/So4pPLtThA1X05eIYPT8pUceOBEuS0pscV++Be9SsXb6iq53U7t9CtXBeDS2YXbPEmppckK/Jb27Sto1h6t+1YcV/EwCYSkA7RZ06ddKQIUMCdv2xY8cqISFBDodDCxYs0G233aaePXsGrB7Y04ljQUpvelwDJ/xWps/N/myDXln3g2eLjfM/EH33ZaRubdfE5/s/fltVE/unqfsN+/XURxt1YffDGnd7HW37OcxzzM5toRrWs75S6p3QY29s0sxlG3XjkFyFhlWWxjmAcyWsqltbfgzTf/59XgnvGhozZ5uSUgs1tk8dDbiigXb/FqJHXt0sZ7hLklQ9oUg1Ek5q1oNJ+sdlDTV5SIradsrTsCk5nrPUa3FMh/ZV0aMDa+vOzg31yhMJ6vPvXbqqz77TrhgR7dK9T2Rr7eeRFfUlA+fEqdXnzLZVBpboFG3btk116tTR2rVr1apVq1J9ZsOGDRo3bpzefvtt/d///Z+qVaumzp07yzD+3C9waWlpGjJkSEDDHiqXCy47ogsuO3L2A/9HbNxJRca4SnzP7ZZemxGvRS/W0MG9IaqVXqCbhuTq4r/67kCdyYLnaqpt5zxd13+vJCnzvlytWRGld+bGafCjxWEu65EktbssT31H7fJ8Ljmt0K/rAbC2VZ9Ea9Un0SW+Vyu9UE3aHtOdnRpq+y/Ff3h5csR5mv/dT+p8zSEtfrmGtm8M1/h+aZ7P7NruVNajSbrvyWwFBRtyuxz6aH4Nr/PmZjvVuG2+OvY4rHfnxnm9N+jR3/TJ27Fyux26sLt/PycBVG62vado8+bNkqSrr75aiYmJcjqdiomJUWxsrM/PFBbyCx7Mo3/XhrqhVVONuL6ufvwmwuu9+U8maOnr1TXo0d/07Cc/q1e/vXr0nlR9vzLCx9nObMPqCLW++KjXvjaXHtGG1cXnc7ulb5ZFq1Z6gf59Q7p6N2+qQX+pry8/iCnpdADgU0ioW5JUWPDHX5cNw6GiQoeaXpDv83MR0S4dOxokt8v3X6Ujolw6cijYa98V1x9QUu0CvTg18U9WDqAyM00oeuGFF9S2bVtFRUUpMTFRN954o/bs2eN5/+DBg7rppptUs2ZNhYeHq379+po7d64kqU6dOpKk1q1by+FwqFOnTme81tixY5WRkSFJCgoKksNR/AP0f8fnOnXqpIEDB2rIkCGKi4tTt27dZBiGxo4dq9q1a8vpdCo5OVmDBg3yHL99+3YNHTpUDofDc96SFBQUKC8vz2sDSqN6fJEGPZqjUc9t1QOztqpmcqHuvbaefv0+XFLxLxLzp8dr2NRste10REmphbri+gO6vNdBLXwh7ixnL9nBvVVULc77vqBqNYt0cE9xs/nQvio6nh+sV/8Tr7adj2jiK1vUsfthPdg3ze8gBsCecjaFafdvIbp95C5FxpxUlRC3eg/Yo5rJRaqeUPL9idHVT+rGIbv1wYs1Snxfkpq0zdelVx3Sopf+OCa5ToFu//cuPXpP6hnDFFBZBHpMjvG5clBUVKTx48erYcOG2rNnj4YNG6bbbrtNixYtkiSNGjVKP/30kz744APFxcVp06ZNOn78uCTpm2++Ubt27bR06VI1bdpUoaGhZ7zW8OHDlZaWpj59+mjXrl1nPPb555/X3XffrS+++EKS9Oabb+rxxx/X/Pnz1bRpU+Xm5uq7776TJL311ltq2bKl7rzzTvXr1++M5504caLGjRtXqu8N8N9S6hUopV6B53XTC45p13an3p5VU/c9ma2d25wqOB6skX+v6/W5k0UO1W123PP66nrNPf92ux0qKnB47bvsbwc9o3FnYxT/YVcduuWp153FI3Z1mx3XT6sitHBenFp08P3XXQD4b66TDj14R5qGTc3Rmxt+lOuktPazKH2zLEol/a2xaqRL4+dtVfYvYXphSsndntSGxzVm7la9ODVRaz6NkiQFBRkaMWO7XpicoB1bnBX5JQGoBEwTim6//XbPv9PT0zV9+nRdcMEFOnr0qCIjI5Wdna3WrVurbdu2korv3TmlZs3ilWRq1KihxMSzt78jIyM9Y3JnO75+/fqaNGmS5/XChQuVmJioLl26KCQkRLVr11a7du0kSdWrV1dwcLCn23UmI0eO1LBhwzyv8/LylJKSctbagZI0bHVMP35b3JE5kV/cAB7/whbVSPT+q2pI6B/3zD21ZKPn3xvXRmj2w0ma9MYmz76IKLfn39VqntTBfSFe5zq4N0TVfl/tLrq6S8FVDKU2OOF1TEr9E6eN9gHA2WxaX1X9uzZU1SiXQkIMHT5QRU+8/6t++b0jfkp4hEsPv7xFx/ODNO6ONLlOnp6aatc/oUdf26IPXqyhV55I+OOzkW41bHVc9Zrt0ICHd0iSHEFSUJC0KPs7jbwhXd99EVWxXygA0zBNKFq9erXGjh2r7777TgcPHpTbXfwLWXZ2tpo0aaK7775bf/vb37RmzRpdccUV6tmzpy688MIKr6tNmzZer6+77jpNmzZN6enp6t69u6688kplZGSoSpWyfSudTqecTv4yhfKx+cdwVY8vDkC1G5xQiNOtPTtCz9ihqVXnj3vk9u0KVXCw977/1rhNvtZ9Fqle/fZ69q1ZEaXGbYrPHxJqqEHLY/pts/f/pndscbIcNwC/nVpeO7lOgeq3PKbnH/vjD45VI4sDUVGhQ2Nuq6OigtPvCEhtcEKPvr5ZS16vpqxHk/7n3EG6s3MDr30ZmfvV6qKjGt8vVbnZZ546AczIjONqZqvHF1PcU5Sfn69u3bopOjpaL730kr799lu9/fbbkv5Y3KBHjx6e+3V27typyy+/XMOHD6/w2iIivP/KnZKSoo0bN+qpp55SeHi4+vfvr0suuURFRfziB/8czw/S5h/CtfmH4r+A5uaEavMP4drzW3FnZs6EJE0aVNtz/FuzaurLxdHasTVU234O09Oja+m7LyKVcVvxMrNVI9269q49emZMLS15rZp2bgvVr9+H653ZcVryWjW/auzZd69WLY/WGzNrKvtXp16YnKhfvw/X1f+1tO11/ffo03djteil6tqxNVTvzInTV0tilJF5+vK3AOwtrKpL6U2PK71p8UhvYkqh0pseV81axf+ff/FfD6lFh6NKrF2gDt0Oa+L8zVq5OMYz+lY10qUJr2xRWFW3Hv9niqpGulStZpGq1SxSUFBxRzy14XFNemOzVn8apbeeqel5P6Z6cYfbMBzavjHcazu0v4oKC4r3FxwPLqFyAFZlik7Rzz//rP379+uRRx7xjJCtWrXqtONq1qypzMxMZWZm6uKLL9a9996ryZMne+4hcrlKXp64vIWHhysjI0MZGRkaMGCAGjVqpPXr1+v8889XaGjoOasD1vDLd1W9Hsb6zNhakqSuvQ9o+LRsHdgTor07/viL5clCh559sJb254bIGe5WncbHNfHVzWrV8Y/V4TLvy1VMjZOa/2SCcrNDFRHtUr3mx3XDoN1+1dj0gmMaMWObnn80SVmPJCm5ToHGzNmqtEZ/jMt17HFYgx75TfP/k6CnR52n89KLH9zarD33EwHw1qDlcT325mbP67vG7ZQkffRqNU0ZWlvVE4r0j7E7FRt3Ugf2VNHS16vp5Wl/jL7Va35cjdsckyRlrfzZ69y3tmus3b+F6uK/HlZs3El1ufagulx70PN+bk6IMtv7fi4bAHsyRSiqXbu2QkND9eSTT+quu+7SDz/8oPHjx3sdM3r0aLVp00ZNmzZVQUGB3n//fTVu3FiSFB8fr/DwcC1evFjnnXeewsLCFBNTMUsBZ2VlyeVyqX379qpatapefPFFhYeHKzU1VVLxvU4rVqzQ3//+dzmdTsXF+bfaF+yj5YVH9eHOdT7fHz4t2+t17wF71HvAHh9HF3M4pGv67tM1fUvXpWl54VHN++anMx5zScZhXZJx5ud3dLvhgLrdcKBU1wRgX9+vjFS35JY+339ndk29M7um35+XpBenJOpFHwsvlOdnADNhfM5/phifq1mzprKysvT666+rSZMmeuSRRzR58mSvY0JDQzVy5Ei1aNFCl1xyiYKDgzV//nxJUpUqVTR9+nQ988wzSk5O1tVXX11htcbGxmrWrFnq2LGjWrRooaVLl+q9995TjRrFS3w++OCD2rZtm+rWretZAAIAAACAeTkMwzDOfhgqWl5enmJiYnTwl3RFR5kiqwLAn9YtuVWgSwCAcnPSKNJyvaPDhw8rOjo60OV4nPo98qJ3B6hKhLkW8jqZX6DPr5phuu/Z/zLF+BwAAACAP8cwHDJMNq5mtnp8sWxLIjIy0uf22WefBbo8AAAAACZh2U7RunXrfL5Xq1atc1cIAAAAAFOzbCiqV6/e2Q8CAAAALMIth9wy17ia2erxxbLjcwAAAABQGoQiAAAAALZm2fE5AAAAwE54eKv/6BQBAAAAsDVCEQAAAABbY3wOAAAAsAAe3uo/OkUAAAAAbI1QBAAAAMDWGJ8DAAAALIDV5/xHpwgAAACArRGKAAAAANga43MAAACABbD6nP/oFAEAAACwNUIRAAAAAFtjfA4AAACwAMOEq88xPgcAAAAAlQChCAAAAICtMT4HAAAAWIAhyTACXYU3k5XjE50iAAAAALZGKAIAAABgCitWrFBGRoaSk5PlcDi0YMGCs35m+fLlOv/88+V0OlWvXj1lZWWV+bqEIgAAAMAC3HKYciuL/Px8tWzZUjNmzCjV8Vu3btVf/vIXde7cWevWrdOQIUPUt29fffjhh2W6LvcUAQAAAKhQeXl5Xq+dTqecTudpx/Xo0UM9evQo9XlnzpypOnXqaMqUKZKkxo0b6/PPP9fjjz+ubt26lfo8dIoAAAAAVKiUlBTFxMR4tokTJ5bLeVeuXKkuXbp47evWrZtWrlxZpvPQKQIAAAAswDAcpntY6ql6cnJyFB0d7dlfUpfIH7m5uUpISPDal5CQoLy8PB0/flzh4eGlOg+hCAAAAECFio6O9gpFZsP4HAAAAIBKKTExUbt37/bat3v3bkVHR5e6SyTRKQIAAAAswW045DDZ+Jy7guvp0KGDFi1a5LVvyZIl6tChQ5nOQ6cIAAAAgCkcPXpU69at07p16yQVL7m9bt06ZWdnS5JGjhypW2+91XP8XXfdpS1btui+++7Tzz//rKeeekqvvfaahg4dWqbrEooAAAAAmMKqVavUunVrtW7dWpI0bNgwtW7dWqNHj5Yk7dq1yxOQJKlOnTpauHChlixZopYtW2rKlCl67rnnyrQct8T4HAAAAGAJhlG8mUlZ6+nUqZOMM3woKyurxM+sXbu2jJV5o1MEAAAAwNYIRQAAAABsjfE5AAAAwALM/PBWs6NTBAAAAMDWCEUAAAAAbI3xOQAAAMACGJ/zH50iAAAAALZGKAIAAABga4zPAQAAABbgNhxymGxczW2yenyhUwQAAADA1ghFAAAAAGyN8TkAAADAAgyjeDMTs9XjC50iAAAAALZGKAIAAABga4zPAQAAABZQPD5nrtXeGJ8DAAAAgEqAUAQAAADA1hifAwAAACzAMBwmHJ8zVz2+0CkCAAAAYGuEIgAAAAC2xvgcAAAAYAHG75uZmK0eX+gUAQAAALA1QhEAAAAAW2N8DgAAALAAVp/zH50iAAAAALZGKAIAAABga4zPAQAAAFbA8nN+o1MEAAAAwNYIRQAAAABsjfE5AAAAwApMuPqczFaPD3SKAAAAANgaoQgAAACArTE+BwAAAFiAYRRvZmK2enyhUwQAAADA1ghFAAAAAGyN8TkAAADAAgwTrj5ntnp8oVMEAAAAwNYIRQAAAABsjfE5AAAAwAoMh/kelmq2enygUwQAAADA1ghFAAAAAGyN8TkAAADAAnh4q//oFAEAAACwNUIRAAAAAFtjfA4AAACwAuP3zUzMVo8PdIoAAAAA2BqhCAAAAICtMT4HAAAAWIBhOGSY7GGpZqvHFzpFAAAAAGyNUAQAAADA1hifAwAAAKyikqz2ZjZ0igAAAADYGqEIAAAAgK0xPgcAAABYAKvP+Y9OEQAAAABbIxQBAAAAsDXG5wAAAAArMGS+1efMVo8PdIoAAAAA2BqhCAAAAICtMT4HAAAAWILj981MzFZPyegUAQAAALA1QhEAAAAAW2N8DgAAALACVp/zG50iAAAAALZGKAIAAABga4zPAQAAAFbA+Jzf6BQBAAAAsDVCEQAAAABbY3wOAAAAsALDUbyZidnq8YFOEQAAAABbIxQBAAAAsDXG5wAAAAALMIzizUzMVo8vdIoAAAAA2BqhCAAAAICtMT4HAAAAWAEPb/UbnSIAAAAAtkYoAgAAAGBrjM8BAAAAVsDDW/1GpwgAAACArRGKAAAAANga43MAAACABTiM4s1MzFaPL3SKAAAAANhaqTpF7777bqlPeNVVV/ldDAAAAACca6UKRT179izVyRwOh1wu15+pBwAAAIA/eHir30oVitxud0XXAQAAAAAB8afuKTpx4kR51QEAAAAAAVHmUORyuTR+/HjVqlVLkZGR2rJliyRp1KhRmj17drkXCAAAAKAUTj281WxbJVDmUPTwww8rKytLkyZNUmhoqGd/s2bN9Nxzz5VrcQAAAABQ0cociubNm6dnn31WN910k4KDgz37W7ZsqZ9//rlciwMAAACAilbmh7fu2LFD9erVO22/2+1WUVFRuRQFAAAAoIxYfc5vZe4UNWnSRJ999tlp+9944w21bt26XIoCAAAAgHOlzJ2i0aNHKzMzUzt27JDb7dZbb72ljRs3at68eXr//fcrokYAAAAAqDBl7hRdffXVeu+997R06VJFRERo9OjR2rBhg9577z117dq1ImoEAAAAcDaGSTc/zJgxQ2lpaQoLC1P79u31zTffnPH4adOmqWHDhgoPD1dKSoqGDh1apscHlblTJEkXX3yxlixZ4s9HAQAAAMCnV199VcOGDdPMmTPVvn17TZs2Td26ddPGjRsVHx9/2vEvv/yyRowYoTlz5ujCCy/UL7/8ottuu00Oh0NTp04t1TX9CkWStGrVKm3YsEFS8X1Gbdq08fdUAAAAACBJmjp1qvr166c+ffpIkmbOnKmFCxdqzpw5GjFixGnHf/nll+rYsaNuvPFGSVJaWppuuOEGff3116W+ZplD0W+//aYbbrhBX3zxhWJjYyVJhw4d0oUXXqj58+frvPPOK+spAQAAAPxZJl59Li8vz2u30+mU0+k87fDCwkKtXr1aI0eO9OwLCgpSly5d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+PG69dZbFR0drTvvvFOFhYUaOHCgkpKSFBYWptTUVE2cONFzvCRdc801nnOW1bfffquuXbsqLi5OMTExuvTSS7VmzRrP+4ZhaOzYsapdu7acTqeSk5M1aNAgSVKnTp20fft2DR06VA6HQw6Hw+d1CgoKlJeX57UBvjgchu4at0M/fFNV2zcWd4Gatjuqhq2O6eE7U/Xr91W1c6tTsx5MVv7hYF30l7L/5fTU3P6hvd4N5EN7q6h6/KnZeUPDp+Vo4Qs19Ov3Vf/U1wQAp1SPL9KgR3M06rmtemDWVtVMLtS919bTr98X/7wrLHBo/vR4DZuarbadjigptVBXXH9Al/c6qIUvxPl1zYN7q6hanPd9QdVqFungnuKfgYf2VdHx/GC9+p94te18RBNf2aKO3Q/rwb5pfgcxoKKdWn3ObFtlELDxuSeeeEJ169bVs88+q2+//VbBwcG67rrrTjtu8uTJGj16tMaMGSNJmj59ut5991299tprql27tnJycpSTkyOpONDEx8dr7ty56t69u4KDg08739kcOXJEmZmZevLJJ2UYhqZMmaIrr7xSv/76q6KiovTmm2/q8ccf1/z589W0aVPl5ubqu+++kyS99dZbatmype68807169fvjNeZOHGixo0bV+b6YE8DJ+xQaqMT+mfPP25ETm9yQmERbr3+449ex4aGuZWcViBJatbuqB56aavnvSohhhwOw2vc5In7ztMnb1dTaVx9xz6FR7r06pPxf+bLAQAvKfUKlFKvwPO66QXHtGu7U2/Pqqn7nszWzm1OFRwP1si/1/X63Mkih+o2O+55fXW95p5/u90OFRU4vPZd9reDntG4szF+v5WyQ7c89bqzeMSubrPj+mlVhBbOi1OLDvll/joBmFfAQlFMTIyioqIUHBysxMREn8dddtll+uc//+l5nZ2drfr16+uiiy6Sw+FQamqq572aNWtKkmJjY894zjO57LLLvF4/++yzio2N1aeffqq//vWvys7OVmJiorp06aKQkBDVrl1b7dq1kyRVr15dwcHBioqKOuv1R44cqWHDhnle5+XlKSUlxa+aYW0DHv5N7bvm6Z/X1NW+XaGe/eERbh3YHaL7rq172meO5hX/QeCX76uqf9cGnv1X37FPcYlFmv1wkmffwd87Qwd+/+tobM2TOrDnjwUUYmue1ObfV5Zr1fGoGrc5pve3fe91vf988Is+fquaJg+p/We/XACQJDVsdUw/flvckTmRXzzYMv6FLaqR6N3dCQn948/QTy354x7HjWsjNPvhJE16Y5NnX0TUH4vGVKt5Ugf3eS8Wc3BviKr93jWPru5ScBVDqQ1OeB2TUv/EaaN9ACo/0y/J3bZtW6/Xt912m7p27aqGDRuqe/fu+utf/6orrrii3K63e/duPfDAA1q+fLn27Nkjl8ulY8eOKTu7eMWu6667TtOmTVN6erq6d++uK6+8UhkZGapSpWzfSqfTKafz9GWOgT8YGvDwDl3Y/bDuvbaedud4/+9l0/pwVY8vkuukQ7t/Cy3xDIUngrRz2x+fO3IoWFUjXV77TsnNDtX+3VXU+qIjnuW1q0a61Kj1Mb0/r4Yk6alRtZT16B+Bv0biSU18ZYsm3JWqn9cyTgeg/Gz+Mdwzulu7wQmFON3asyP0jB2aWnX+uPd4365QBQd77/tvjdvka91nkerVb69n35oVUWrcpvj8IaGGGrQ8pt82e/+83LHFyXLcMC8zrvZmtnp8MH0oiojw/mvM+eefr61bt+qDDz7Q0qVL1bt3b3Xp0kVvvPFGuVwvMzNT+/fv1xNPPKHU1FQ5nU516NDBs8hDSkqKNm7cqKVLl2rJkiXq37+/HnvsMX366acKCWF5YpSfgRN2qPM1BzW2Tx0dPxqkajWL/084/0iwCk8Eac2KSG1YHaExc7fquYeStWOzUzUSi9Tu8jx98UGMH/f8OLTguZq6YfAe7djqVG52qDLvy9X+3SH6cnHxjcV7d3iHrxP5xf9d7Nzu9OpiAbC34/lBXs83y80J1eYfwhUVe1Lx5xVpzoQk7csN0X3Ti//g+NasmkpMKVBqwxMqKgjSBy/X0HdfRGrCK5slSVUj3br2rj16ZkwtGW6pabt85ecF66dvI1Q1yqWuvQ+Wucaefffq3r/V1xsza6rd5Xn69J1q+vX7cA15LMdzzHX992jCXalq9n9H1fLCo1r1SbS+WhKjx/6r+wTAGkwfikoSHR2t66+/Xtdff72uvfZade/eXQcOHFD16tUVEhIil8v/57h88cUXeuqpp3TllVdKknJycrRv3z6vY8LDw5WRkaGMjAwNGDBAjRo10vr163X++ecrNDT0T10fOCXjtv2SpMlvbfbaP3lIipa8Vl2SQw/cXEe3jcjVP6dmK6aGSwf3VtH6ryJ0aJ9//2m/NqOmwqq6NXjSb4qMdunHbyN0/03pKipglTkApffLd1W9Hsb6zNhakqSuvQ9o+LRsHdgT4vVHlpOFDj37YC3tzw2RM9ytOo2Pa+Krm9Wq4x+rw2Xel6uYGic1/8kE5WaHKiLapXrNj+uGQbv9qrHpBcc0YsY2Pf9okrIeSVJynQKNmbNVaY3+GJfr2OOwBj3ym+b/J0FPjzpP56UXP7i1WXvuJwKsptKFoqlTpyopKUmtW7dWUFCQXn/9dSUmJio2NlZS8Qp0y5YtU8eOHeV0OlWtWuluID+lfv36euGFF9S2bVvl5eXp3nvv9Xp2UlZWllwul9q3b6+qVavqxRdfVHh4uOfeprS0NK1YsUJ///vf5XQ6FRfn36o4QLfklmc95nh+sJ4eVUtPj6pVqnO+OOVs99o5NO+xRM17rHT35O3+LbRUdQKwl5YXHtWHO9f5fH/4NO+HSPcesEe9B+w54zkdDumavvt0Td99Zzzuv2uY981PZzzmkozDuiTjzKt1drvhgLrdcKBU1wQCzYyrvZmtHl8q3Z9/o6KiNGnSJLVt21YXXHCBtm3bpkWLFikoqPhLmTJlipYsWaKUlBS1bt26zOefPXu2Dh48qPPPP1+33HKLBg0apPj4P1baio2N1axZs9SxY0e1aNFCS5cu1XvvvacaNYrvuXjwwQe1bds21a1b17PwAwAAAADzchiGUUnym7Xl5eUpJiZGnXS1qji4NwmANZypWwAAlU3eEbeqNdiiw4cPKzo6OtDleJz6PbLN9Q8rODQs0OV4cRWe0OpX7zfd9+x/VbrxOQAAAAAlYPU5v1W68bmyatq0qSIjI0vcXnrppUCXBwAAACDALN8pWrRokYqKSn6eQEJCwjmuBgAAAIDZWD4UnVoVDgAAALC6yrLam9lYfnwOAAAAAM6EUAQAAADA1iw/PgcAAADYgmEUb2Zitnp8oFMEAAAAwNYIRQAAAABsjfE5AAAAwAIchvlWnzNbPb7QKQIAAABga4QiAAAAALbG+BwAAABgBcbvm5mYrR4f6BQBAAAAsDVCEQAAAABbY3wOAAAAsACHu3gzE7PV4wudIgAAAAC2RigCAAAAYGuMzwEAAABWwOpzfqNTBAAAAMDWCEUAAAAAbI3xOQAAAMACHEbxZiZmq8cXOkUAAAAATGXGjBlKS0tTWFiY2rdvr2+++aZUn5s/f74cDod69uxZpusRigAAAACYxquvvqphw4ZpzJgxWrNmjVq2bKlu3bppz549Z/zctm3bNHz4cF188cVlviahCAAAALACwzDnVkZTp05Vv3791KdPHzVp0kQzZ85U1apVNWfOHJ+fcblcuummmzRu3Dilp6eX+ZqEIgAAAAAVKi8vz2srKCgo8bjCwkKtXr1aXbp08ewLCgpSly5dtHLlSp/nf/DBBxUfH6877rjDr/oIRQAAAAAqVEpKimJiYjzbxIkTSzxu3759crlcSkhI8NqfkJCg3NzcEj/z+eefa/bs2Zo1a5bf9bH6HAAAAGABZl59LicnR9HR0Z79TqezXM5/5MgR3XLLLZo1a5bi4uL8Pg+hCAAAAECFio6O9gpFvsTFxSk4OFi7d+/22r97924lJiaedvzmzZu1bds2ZWRkePa53W5JUpUqVbRx40bVrVv3rNdlfA4AAACAKYSGhqpNmzZatmyZZ5/b7dayZcvUoUOH045v1KiR1q9fr3Xr1nm2q666Sp07d9a6deuUkpJSquvSKQIAAACswPh9MxM/6hk2bJgyMzPVtm1btWvXTtOmTVN+fr769OkjSbr11ltVq1YtTZw4UWFhYWrWrJnX52NjYyXptP1nQigCAAAAYBrXX3+99u7dq9GjRys3N1etWrXS4sWLPYsvZGdnKyiofAfeCEUAAAAATGXgwIEaOHBgie8tX778jJ/Nysoq8/UIRQAAAIAFmHn1ObNjoQUAAAAAtkYoAgAAAGBrjM8BAAAAVmAYxZuZmK0eH+gUAQAAALA1QhEAAAAAW2N8DgAAALAAVp/zH50iAAAAALZGKAIAAABga4zPAQAAAFZg/L6Zidnq8YFOEQAAAABbIxQBAAAAsDXG5wAAAAALYPU5/9EpAgAAAGBrhCIAAAAAtsb4HAAAAGAFbqN4MxOz1eMDnSIAAAAAtkYoAgAAAGBrjM8BAAAAVsDDW/1GpwgAAACArRGKAAAAANga43MAAACABThkvoelOgJdQCnRKQIAAABga4QiAAAAALbG+BwAAABgBYZRvJmJ2erxgU4RAAAAAFsjFAEAAACwNcbnAAAAAAtwGCZcfc5k9fhCpwgAAACArRGKAAAAANga43MAAACAFRi/b2Zitnp8oFMEAAAAwNYIRQAAAABsjfE5AAAAwAIchiGHyR6WarZ6fKFTBAAAAMDWCEUAAAAAbI3xOQAAAMAK3L9vZmK2enygUwQAAADA1ghFAAAAAGyN8TkAAADAAlh9zn90igAAAADYGqEIAAAAgK0xPgcAAABYgfH7ZiZmq8cHOkUAAAAAbI1QBAAAAMDWGJ8DAAAArMAwijczMVs9PtApAgAAAGBrhCIAAAAAtsb4HAAAAGABDqN4MxOz1eMLnSIAAAAAtkYoAgAAAGBrjM8BAAAAVsDqc36jUwQAAADA1ghFAAAAAGyN8TkAAADAAhzu4s1MzFaPL3SKAAAAANgaoQgAAACArTE+BwAAAFgBq8/5jU4RAAAAAFsjFAEAAACwNcbnAAAAACswft/MxGz1+ECnCAAAAICtEYoAAAAA2BrjcwAAAIAFOAxDDpOt9ma2enyhUwQAAADA1ghFAAAAAGyN8TkAAADACnh4q9/oFAEAAACwNUIRAAAAAFtjfA4AAACwAkOSO9BF/I/KMT1HpwgAAACAvRGKAAAAANga43MAAACABfDwVv/RKQIAAABga4QiAAAAALbG+BwAAABgBYbM97BUk5XjC50iAAAAALZGKAIAAABga4zPAQAAAFZgGCYcnzNZPT7QKQIAAABga4QiAAAAALbG+BwAAABgBW5JjkAX8T/cgS6gdOgUAQAAALA1QhEAAAAAW2N8DgAAALAAh2HIYbLV3sxWjy90igAAAADYGqEIAAAAgK0xPgcAAABYAQ9v9RudIgAAAAC2RigCAAAAYGuMzwEAAABWwPic3+gUAQAAALA1QhEAAAAAU5kxY4bS0tIUFham9u3b65tvvvF57KxZs3TxxRerWrVqqlatmrp06XLG40tCKAIAAACs4NT4nNm2Mnr11Vc1bNgwjRkzRmvWrFHLli3VrVs37dmzp8Tjly9frhtuuEGffPKJVq5cqZSUFF1xxRXasWNHqa9JKAIAAABgGlOnTlW/fv3Up08fNWnSRDNnzlTVqlU1Z86cEo9/6aWX1L9/f7Vq1UqNGjXSc889J7fbrWXLlpX6moQiAAAAABUqLy/PaysoKCjxuMLCQq1evVpdunTx7AsKClKXLl20cuXKUl3r2LFjKioqUvXq1UtdH6EIAAAAsAK3STdJKSkpiomJ8WwTJ04s8UvYt2+fXC6XEhISvPYnJCQoNze3VN+Gf/3rX0pOTvYKVmfDktwAAAAAKlROTo6io6M9r51OZ4Vc55FHHtH8+fO1fPlyhYWFlfpzhCIAAAAAFSo6OtorFPkSFxen4OBg7d6922v/7t27lZiYeMbPTp48WY888oiWLl2qFi1alKk+xucAAAAAC3AYhim3sggNDVWbNm28Fkk4tWhChw4dfH5u0qRJGj9+vBYvXqy2bduW+XtHpwgAAACAaQwbNkyZmZlq27at2rVrp2nTpik/P199+vSRJN16662qVauW576kRx99VKNHj9bLL7+stLQ0z71HkZGRioyMLNU1CUUAAAAATOP666/X3r17NXr0aOXm5qpVq1ZavHixZ/GF7OxsBQX9MfD29NNPq7CwUNdee63XecaMGaOxY8eW6pqEIgAAAMAK/HxYaoXys56BAwdq4MCBJb63fPlyr9fbtm3z6xr/jXuKAAAAANgaoQgAAACArTE+BwAAAFiB25AcJhufc5usHh/oFAEAAACwNUIRAAAAAFtjfA4AAACwAgutPneu0SkCAAAAYGuEIgAAAAC2xvgcAAAAYAkmHJ+T2eopGZ0iAAAAALZGp8gkjN9T/UkVVZZADQBnlXfEHegSAKDc5B0t/plmmK4bgz+LUGQSR44ckSR9rkUBrgQAyk+1BoGuAADK35EjRxQTExPoMk7H6nN+IxSZRHJysnJychQVFSWHwxHocmBheXl5SklJUU5OjqKjowNdDgD8afxcw7liGIaOHDmi5OTkQJeCckYoMomgoCCdd955gS4DNhIdHc0vDwAshZ9rOBdM2SHCn0YoAgAAAKzAbch0N6e7TVaPD6w+BwAAAMDWCEWAzTidTo0ZM0ZOpzPQpQBAueDnGoA/y2GwpiAAAABQaeXl5SkmJkZdavdXlSBz/XHgpLtAS7Of0uHDh019zx+dIgAAAAC2RigCAAAAYGusPgcAAABYAQ9v9RudIgAAAAC2RigCAAAAYGuMzwEAAABWwMNb/UanCAAAVCrBwcHas2fPafv379+v4ODgAFQEoLIjFAE2wC8QAKzE1yMWCwoKFBoaeo6rAWAFjM8BNsAvEACsYPr06ZIkh8Oh5557TpGRkZ73XC6XVqxYoUaNGgWqPCDwWH3Ob4QiwML4BQKAlTz++OOSiv/QM3PmTK9Od2hoqNLS0jRz5sxAlQegEiMUARbGLxAArGTr1q2SpM6dO+utt95StWrVAlwRAKsgFAEWxi8QAKzok08+8Xrtcrm0fv16paam8nMO9mbIfONqJivHFxZaAGzgk08+8fpFweVyad26dTp48GAAqwIA/wwZMkSzZ8+WVPzz7JJLLtH555+vlJQULV++PLDFAaiUCEWADfALBAAref3119WyZUtJ0nvvvadt27bp559/1tChQ3X//fcHuDoAlRGhCLABfoEAYCX79+9XYmKiJGnRokW67rrr1KBBA91+++1av359gKsDAujU6nNm2yoBQhFgA/wCAcBKEhIS9NNPP8nlcmnx4sXq2rWrJOnYsWM8ew2AXwhFgA3wCwQAK+nTp4969+6tZs2ayeFwqEuXLpKkr7/+mscMAPALq88BNnDqF4ikpCR+gQBQ6Y0dO1bNmjVTTk6OrrvuOjmdTklScHCwRowYEeDqgAByuyW5A12FN7fJ6vGBUATYwNixY9W8eXNlZ2fzCwQAS7j22mtP25eZmRmASgBYAaEIsLiioiJ1795dM2fO1N/+9jev9/gFAkBllZ+fr08//VTZ2dkqLCz0em/QoEEBqgpAZUUoAiwuJCRE33//faDLAIBys3btWl155ZU6duyY8vPzVb16de3bt09Vq1ZVfHw8oQj2ZcbV3sxWjw8stADYwM033+x5ThEAVHZDhw5VRkaGDh48qPDwcH311Vfavn272rRpo8mTJwe6PACVEJ0iwAZOnjypOXPmaOnSpWrTpo0iIiK83p86dWqAKgOAslu3bp2eeeYZBQUFKTg4WAUFBUpPT9ekSZOUmZmpXr16BbpEAJUMoQiwgR9++EHnn3++JOmXX37xes/hcASiJADwW0hIiIKCiodd4uPjlZ2drcaNGysmJkY5OTkBrg4IIMbn/EYoAmzgk08+CXQJAFBuWrdurW+//Vb169fXpZdeqtGjR2vfvn164YUX1KxZs0CXB6AS4p4iAABQqUyYMEFJSUmSpIcffljVqlXT3Xffrb179+rZZ58NcHUAKiM6RYBF9erVS1lZWYqOjj7rfP1bb711jqoCgD+vbdu2nn/Hx8dr8eLFAawGMBG3Iclk42puk9XjA6EIsKiYmBjP/ULR0dHcOwQAAOADoQiwqGuuuUZhYWGSpKysrMAWAwB/UuvWrUv9x501a9ZUcDUArIZQBFjUNddco9zcXNWsWVPBwcHatWuX4uPjA10WAPilZ8+egS4BMD3DcMsw3IEuw4vZ6vGFUARYVM2aNfXVV18pIyNDhmEwPgegUhszZkyZP/PKK6/oqquuOu3ZbADwv1h9DrCou+66S1dffbWCg4PlcDiUmJio4ODgEjcAsKJ//OMf2r17d6DLAFAJ0CkCLGrs2LH6+9//rk2bNumqq67S3LlzFRsbG+iyAOCcMSrJQyOBcmMY5lvtrZL8d0goAiysUaNGatSokcaMGaPrrrtOVatWPePxX3zxhdq2bSun03mOKgQAAAg8xucAGxgzZsxZA5Ek9ejRQzt27DgHFQEAAJgHnSIAHoyaAABQiRkmfHhrJfndgk4RAAAAAFsjFAEAAEtKTU1VSEhIoMsAUAkQigAAQKWSnp6u/fv3n7b/0KFDSk9P97z+4YcflJKSci5LAwLL7TbnVgkQigB48IBXAJXBtm3b5HK5TttfUFDAYjEA/MJCCwA8WGgBgJm9++67nn9/+OGHiomJ8bx2uVxatmyZ0tLSAlAZgMqOUATYwGWXXaa33nrrtIe35uXlqWfPnvr4448lSUeOHAlAdQBQOj179pRU3NXOzMz0ei8kJERpaWmaMmVKACoDTILV5/xGKAJsYPny5SosLDxt/4kTJ/TZZ58FoCIAKDv37/cm1KlTR99++63i4uICXBEAqyAUARb2/fffe/79008/KTc31/Pa5XJp8eLFqlWrViBKAwC/bd269bR9hw4dOq0bDgClRSgCLKxVq1ZyOBxyOBy67LLLTns/PDxcTz75ZAAqAwD/Pfroo0pLS9P1118vSbruuuv05ptvKikpSYsWLVLLli0DXCEQGIbbLcNhrtXeDMNc9fhCKAIsbOvWrTIMQ+np6frmm29Us2ZNz3uhoaGKj49XcHBwACsEgLKbOXOmXnrpJUnSkiVLtHTpUi1evFivvfaa7r33Xn300UcBrhBAZUMoAiwsNTVV0h9z+ABgBbm5uZ7nD73//vvq3bu3rrjiCqWlpal9+/YBrg5AZcRzigAbeP7557Vw4ULP6/vuu0+xsbG68MILtX379gBWBgBlV61aNeXk5EiSFi9erC5dukgqfqxASc8vAmzDMMy5VQKEIsAGJkyYoPDwcEnSypUr9Z///EeTJk1SXFychg4dGuDqAKBsevXqpRtvvFFdu3bV/v371aNHD0nS2rVrVa9evQBXB6AyYnwOsIGcnBzPLwoLFizQtddeqzvvvFMdO3ZUp06dAlscAJTR448/rjp16ig7O1uTJk1SZGSkJGnXrl3q379/gKsDUBkRigAbiIyM1P79+1W7dm199NFHGjZsmCQpLCxMx48fD3B1AFB6RUVF+sc//qFRo0apTp06Xu/R+YbtuQ3JYbJxNcbnAJhF165d1bdvX/Xt21e//PKLrrzySknSjz/+qLS0tMAWBwBlEBISojfffDPQZQCwGEIRYAMzZsxQhw4dtHfvXr355puqUaOGJGn16tW64YYbAlwdAJRNz549tWDBgkCXAcBCGJ8DbCA2Nlb/+c9/Tts/bty4AFQDAH9O/fr19eCDD+qLL75QmzZtFBER4fX+oEGDAlQZEGCGIclkj+GoJONzDsOoJJUC+NOOHTum7OxsFRYWeu1v0aJFgCoCgLL733uJ/pvD4dCWLVvOYTVA4OXl5SkmJkaXhV6nKo6QQJfj5aRRpI8LX9fhw4cVHR0d6HJ8olME2MDevXt12223afHixSW+z3M9AFQmW7duDXQJACyGe4oAGxgyZIgOHz6sr7/+WuHh4Vq8eLGef/551a9fX++++26gywMAAOXAcBum3CoDOkWADXz88cd655131LZtWwUFBSk1NVVdu3ZVdHS0Jk6cqL/85S+BLhEAzmjYsGEaP368IiIiPI8V8GXq1KnnqCoAVkEoAmwgPz9f8fHxkqRq1app7969atCggZo3b641a9YEuDoAOLusrCz9+9//VkREhNauXevzOIfDcQ6rAmAVhCLABho2bKiNGzcqLS1NLVu21DPPPKO0tDTNnDlTSUlJgS4PAM7q0KFDcruLV9Xavn27vv32W8/jBQD8znDLfKvPmaweHwhFgA0MHjxYu3btkiSNGTNG3bt314svvqjQ0FA9//zzAa4OAM6uWrVq2rp1q+Lj47Vt2zZPQAKA8kAoAmzg5ptv9vy7TZs22r59u37++WfVrl1bcXFxAawMAErnb3/7my699FIlJSXJ4XCobdu2Cg4OLvFYluQGUFaEIsCiznYj8n/jpmQAZvfss8+qV69e2rRpkwYNGqR+/fopKioq0GUBpmK4DRkOc632VlkeiUooAizqTDci/zduSgZQWXTv3l2StHr1ag0ePJhQBKDcEIoAi/rkk08CXQIAVIi5c+cGugQAFkMoAgAAAKyA1ef8FhToAgAAAAAgkOgUAQAAABZwUkWSydY1OKmiQJdQKoQiAAAAoBILDQ1VYmKiPs9dFOhSSpSYmKjQ0NBAl3FGDqOyrJMHACh3t912mw4dOqQFCxZIkjp16qRWrVpp2rRp57SO5cuXq3Pnzjp48KBiY2NLPMbhcOjtt99Wz549S3XOsWPHasGCBVq3bp3fdW3btk116tTR2rVr1apVK7/PAwAV7cSJEyosLAx0GSUKDQ1VWFhYoMs4IzpFAGAyt912m55//nlJUkhIiGrXrq1bb71V//73v1WlSsX+2H7rrbcUEhJSqmNLE2QAAOdGWFiY6YOHmRGKAMCEunfvrrlz56qgoECLFi3SgAEDFBISopEjR552bGFhYbmNJVSvXr1czgMAQGXC6nMAYEJOp1OJiYlKTU3V3XffrS5duujdd9+VVNxJ6tmzpx5++GElJyerYcOGkqScnBz17t1bsbGxql69uq6++mpt27bNc06Xy6Vhw4YpNjZWNWrU0H333Xfak8Y7deqkIUOGeF4XFBToX//6l1JSUuR0OlWvXj3Nnj1b27ZtU+fOnSVJ1apVk8Ph0G233SZJcrvdmjhxourUqaPw8HC1bNlSb7zxhtd1Fi1apAYNGig8PFydO3f2qrO0/vWvf6lBgwaqWrWq0tPTNWrUKBUVnX5D7zPPPKOUlBRVrVpVvXv31uHDh73ef+6559S4cWOFhYWpUaNGeuqpp8pcCwCgciMUAUAlEB4e7jUrvmzZMm3cuFFLlizR+++/r6KiInXr1k1RUVH67LPP9MUXXygyMlLdu3f3fG7KlCnKysrSnDlz9Pnnn+vAgQN6++23z3jdW2+9Va+88oqmT5+uDRs26JlnnlFkZKRSUlL05ptvSpI2btyoXbt26YknnpAkTZw4UfPmzdPMmTP1448/aujQobr55pv16aefSioOb7169VJGRobWrVunvn37asSIEWX+nkRFRSkrK0s//fSTnnjiCc2aNUuPP/641zGbNm3Sa6+9pvfee0+LFy/W2rVr1b9/f8/7L730kkaPHq2HH35YGzZs0IQJEzRq1CjP+CIAwCYMAICpZGZmGldffbVhGIbhdruNJUuWGE6n0xg+fLjn/YSEBKOgoMDzmRdeeMFo2LCh4Xa7PfsKCgqM8PBw48MPPzQMwzCSkpKMSZMmed4vKioyzjvvPM+1DMMwLr30UmPw4MGGYRjGxo0bDUnGkiVLSqzzk08+MSQZBw8e9Ow7ceKEUbVqVePLL7/0OvaOO+4wbrjhBsMwDGPkyJFGkyZNvN7/17/+ddq5/pck4+233/b5/mOPPWa0adPG83rMmDFGcHCw8dtvv3n2ffDBB0ZQUJCxa9cuwzAMo27dusbLL7/sdZ7x48cbHTp0MAzDMLZu3WpIMtauXevzugCAyo97igDAhN5//31FRkaqqKhIbrdbN954o8aOHet5v3nz5l73EX333XfatGmToqKivM5z4sQJbd68WYcPH9auXbvUvn17z3tVqlRR27ZtTxuhO2XdunUKDg7WpZdeWuq6N23apGPHjqlr165e+wsLC9W6dWtJ0oYNG7zqkKQOHTqU+hqnvPrqq5o+fbo2b96so0eP6uTJk4qOjvY6pnbt2qpVq5bXddxutzZu3KioqCht3rxZd9xxh/r16+c55uTJk4qJiSlzPQCAyotQBAAm1LlzZz399NMKDQ1VcnLyaavORUREeL0+evSo2rRpo5deeum0c9WsWdOvGsLDw8v8maNHj0qSFi5c6BVGpOL7pMrLypUrddNNN2ncuHHq1q2bYmJiNH/+fE2ZMqXMtc6aNeu0kBYcHFxutQIAzI9QBAAmFBERoXr16pX6+PPPP1+vvvqq4uPjT+uWnJKUlKSvv/5al1xyiaTijsjq1at1/vnnl3h88+bN5Xa79emnn6pLly6nvX+qU+VyuTz7mjRpIqfTqezsbJ8dpsaNG3sWjTjlq6++OvsX+V++/PJLpaam6v777/fs2759+2nHZWdna+fOnUpOTvZcJygoSA0bNlRCQoKSk5O1ZcsW3XTTTWW6PgDAWlhoAQAs4KabblJcXJyuvvpqffbZZ9q6dauWL1+uQYMG6bfffpMkDR48WI888ogWLFign3/+Wf3799ehQ4d8njMtLU2ZmZm6/fbbtWDBAs85X3vtNUlSamqqHA6H3n//fe3du1dHjx5VVFSUhg8frqFDh+r555/X5s2btWbNGj355JOexQvuuusu/frrr7r33nu1ceNGvfzyy8rKyirT11u/fn1lZ2dr/vz52rx5s6ZPn17iohFhYWHKzMzUd999p88++0yDBg1S7969lZiYKEkaN26cJk6cqOnTp+uXX37R+vXrNXfuXE2dOrVM9QAAKjdCEQBYQNWqVbVixQrVrl1bvXr1UuPGjXXHHXfoxIkTns7RP//5T91yyy3KzMxUhw4dFBUVpWuuueaM53366ad17bXXqn///mrUqJH69eun/Px8SVKtWrU0btw4jRgxQgkJCRo4cKAkafz48Ro1apQmTpyoxo0bq3v37lq4cKHq1Kkjqfg+nzfffFMLFixQy5YtNXPmTE2YMKFMX+9VV12loUOHauDAgWrVqpW+/PJLjRo16rTj6tWrp169eunKK6/UFVdcoRYtWngtud23b18999xzmjt3rpo3b65LL71UWVlZnloBAPbgMHzdYQsAAAAANkCnCAAAAICtEYoAAAAA2BqhCAAAAICtEYoAAAAA2BqhCAAAAICtEYoAAAAA2BqhCAAAAICtEYoAAAAA2BqhCAAAAICtEYoAAAAA2BqhCAAAAICt/T8Pajp/Q98zCgAAAABJRU5ErkJggg==\n"},"metadata":{}}],"source":["import matplotlib.pyplot as plt\n","%matplotlib inline\n","\n","cmp = ConfusionMatrixDisplay(cm, display_labels=all_categories)\n","fig, ax = plt.subplots(figsize=(10,10))\n","cmp.plot(ax=ax, xticks_rotation='vertical')"]},{"cell_type":"code","execution_count":39,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":43,"status":"ok","timestamp":1696911623237,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"Kjz7DX4o9qlO","outputId":"173cb9d7-8b12-493d-ba7a-8056efce457e"},"outputs":[{"output_type":"stream","name":"stdout","text":["Test Loss: 0.046082\n","\n","Test Accuracy of last_first: 98% (1511943/1531167)\n","Test Accuracy of first_last: 98% (1510959/1531233)\n","\n","Test Accuracy (Overall): 98% (3022902/3062400)\n"]}],"source":["# average test loss\n","test_loss = test_loss/len(test_dataloader)\n","print('Test Loss: {:.6f}\\n'.format(test_loss))\n","\n","for i in range(len(all_categories)):\n"," if class_total[i] > 0:\n"," print('Test Accuracy of %5s: %2d%% (%2d/%2d)' % (\n"," all_categories[i], 100 * class_correct[i] / class_total[i],\n"," np.sum(class_correct[i]), np.sum(class_total[i])))\n"," else:\n"," print('Test Accuracy of %5s: N/A (no training examples)' % (all_categories[i]))\n","\n","print('\\nTest Accuracy (Overall): %2d%% (%2d/%2d)' % (\n"," 100. * np.sum(class_correct) / np.sum(class_total),\n"," np.sum(class_correct), np.sum(class_total)))"]},{"cell_type":"markdown","metadata":{"id":"m3j4uUHzpnKg"},"source":["## Inference"]},{"cell_type":"code","execution_count":40,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":32,"status":"ok","timestamp":1696911623237,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"Hy8oB6Kg-YM8","outputId":"56eba04e-9198-42e8-e063-49c6a2b79d66"},"outputs":[{"output_type":"stream","name":"stdout","text":["torch.Size([47])\n","torch.Size([1, 2])\n","tensor(0, device='cuda:0')\n","last_first\n"]}],"source":["name = \"Reep Dominic\"\n","name_tokens = lineToTensor(name)\n","inp = name_tokens\n","print(inp.shape)\n","out = rnn(inp.unsqueeze(0).to(device))\n","print(out.shape)\n","out = torch.argmax(out)\n","print(out)\n","print(all_categories[out.item()])"]},{"cell_type":"code","execution_count":43,"metadata":{"id":"c80Xzw5iYSqD","executionInfo":{"status":"ok","timestamp":1696917416764,"user_tz":420,"elapsed":288,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}}},"outputs":[],"source":["def name_parser(name):\n"," name_tokens = lineToTensor(name)\n"," out = rnn(name_tokens.unsqueeze(0).to(device))\n"," probs = torch.exp(out)\n"," out = torch.argmax(probs)\n"," print(out)\n"," name_type = all_categories[out.item()]\n"," return name_type"]},{"cell_type":"code","execution_count":44,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":53},"executionInfo":{"elapsed":190,"status":"ok","timestamp":1696917418996,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"},"user_tz":420},"id":"_-1IdBrbSkF5","outputId":"d2252f92-9300-49cc-96c6-fccdaaf146e1"},"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(1, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'first_last'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":44}],"source":["name_parser(\"David McKinley\")"]},{"cell_type":"code","execution_count":45,"metadata":{"id":"OxDVFcbqxFIl","colab":{"base_uri":"https://localhost:8080/","height":53},"executionInfo":{"status":"ok","timestamp":1696917465049,"user_tz":420,"elapsed":171,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"7995f9a1-e66a-4fc1-dfba-3ff481225b00"},"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(1, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'first_last'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":45}],"source":["name_parser(\"Nicholas Turner\")"]},{"cell_type":"code","source":["name_parser(\"Nichols Richard\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":53},"id":"S0OFCjOWKaG5","executionInfo":{"status":"ok","timestamp":1696917515338,"user_tz":420,"elapsed":202,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"60888136-97e6-42cb-aac9-f64145ebd6f8"},"execution_count":46,"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(0, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'last_first'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":46}]},{"cell_type":"code","source":["name_parser(\"Rodriguez Marleny\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":53},"id":"HNJGL4jENgnB","executionInfo":{"status":"ok","timestamp":1696918347338,"user_tz":420,"elapsed":264,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"bf4499bc-e8ae-4477-bfd9-bd2fa89d7881"},"execution_count":51,"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(0, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'last_first'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":51}]},{"cell_type":"code","source":["name_parser(\"Kim Yeon\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":53},"id":"C-IwM394NxRz","executionInfo":{"status":"ok","timestamp":1696918381861,"user_tz":420,"elapsed":273,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"96418e0f-cc94-4d62-8122-157b79fc774e"},"execution_count":53,"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(0, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'last_first'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":53}]},{"cell_type":"code","source":["name_parser(\"Nguyen Ellen\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":53},"id":"8fMquvPfN51I","executionInfo":{"status":"ok","timestamp":1696918461220,"user_tz":420,"elapsed":242,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"424f44dc-3926-4b79-8299-46773ac49c1b"},"execution_count":55,"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(0, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'last_first'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":55}]},{"cell_type":"code","source":["name_parser(\"John Smith\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":53},"id":"esJqZa9oONOs","executionInfo":{"status":"ok","timestamp":1696918573467,"user_tz":420,"elapsed":556,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"c068e386-14e3-47fd-d4f6-1fb226750619"},"execution_count":56,"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(1, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'first_last'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":56}]},{"cell_type":"code","source":["name_parser(\"Smith Greg\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":53},"id":"4PxkQ_zlOoic","executionInfo":{"status":"ok","timestamp":1696918623831,"user_tz":420,"elapsed":191,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"0407a0b1-4c8a-4717-8187-de5198c779a1"},"execution_count":57,"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(0, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'last_first'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":57}]},{"cell_type":"code","source":["name_parser(\"Alan Hernandez\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":53},"id":"FoEJbMTTO03p","executionInfo":{"status":"ok","timestamp":1696918658478,"user_tz":420,"elapsed":191,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"e0e9fe8d-f1df-4704-92cc-332ae21795d0"},"execution_count":58,"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(1, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'first_last'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":58}]},{"cell_type":"code","source":["name_parser(\"Linzer Drew\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":53},"id":"_7bpmpnmO9XC","executionInfo":{"status":"ok","timestamp":1696918697178,"user_tz":420,"elapsed":181,"user":{"displayName":"Rajashekar Chintalapati","userId":"03596288833202137831"}},"outputId":"0f2e50c8-5adc-441b-b0bc-530522fd3764"},"execution_count":59,"outputs":[{"output_type":"stream","name":"stdout","text":["tensor(0, device='cuda:0')\n"]},{"output_type":"execute_result","data":{"text/plain":["'last_first'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":59}]},{"cell_type":"code","source":[],"metadata":{"id":"E3Bs1lSePGzt"},"execution_count":null,"outputs":[]}],"metadata":{"colab":{"machine_shape":"hm","provenance":[],"gpuType":"A100"},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.8.10"},"accelerator":"GPU"},"nbformat":4,"nbformat_minor":0} \ No newline at end of file