Skip to content

Instantly share code, notes, and snippets.

@snakers4
Created April 10, 2023 05:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save snakers4/89eab250c404d71e82a913b0b751488c to your computer and use it in GitHub Desktop.
Save snakers4/89eab250c404d71e82a913b0b751488c to your computer and use it in GitHub Desktop.
test2.ipynb
{
"cells": [
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"id": "1XEMm5oo36Sm"
},
"outputs": [],
"source": [
"import os\n",
"import time\n",
"import glob\n",
"import numba\n",
"import random\n",
"import itertools\n",
"import torch\n",
"import torch.nn as nn\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"from tqdm import tqdm\n",
"from sklearn.model_selection import train_test_split\n",
"from torch.nn.utils.rnn import pad_sequence\n",
"from torch.utils.data import Dataset, DataLoader"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"id": "a6-yAg4536Sp"
},
"outputs": [],
"source": [
"RANDOM_SEED = 42"
]
},
{
"cell_type": "code",
"source": [
"data = pd.read_csv('/content/train.csv')"
],
"metadata": {
"id": "U6Vg9a-0KNqY"
},
"execution_count": 61,
"outputs": []
},
{
"cell_type": "code",
"source": [
"data"
],
"metadata": {
"id": "YAlwu5KAKUh4",
"outputId": "7c4d63f3-7130-4014-8baf-2e3dbdff67d1",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 423
}
},
"execution_count": 62,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" id word stress num_syllables lemma\n",
"0 0 румяной 2 3 румяный\n",
"1 1 цифрами 1 3 цифра\n",
"2 2 слугами 1 3 слуга\n",
"3 3 выбирает 3 4 выбирать\n",
"4 4 управдом 3 3 управдом\n",
"... ... ... ... ... ...\n",
"63433 63433 экзамена 2 4 экзамен\n",
"63434 63434 культурой 2 3 культура\n",
"63435 63435 объемной 2 3 объемный\n",
"63436 63436 участком 2 3 участок\n",
"63437 63437 ташкента 2 3 ташкент\n",
"\n",
"[63438 rows x 5 columns]"
],
"text/html": [
"\n",
" <div id=\"df-edc4ed79-b743-47a8-a595-ff6279343978\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>word</th>\n",
" <th>stress</th>\n",
" <th>num_syllables</th>\n",
" <th>lemma</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>румяной</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>румяный</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>цифрами</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>цифра</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>слугами</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>слуга</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>выбирает</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>выбирать</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>управдом</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>управдом</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63433</th>\n",
" <td>63433</td>\n",
" <td>экзамена</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>экзамен</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63434</th>\n",
" <td>63434</td>\n",
" <td>культурой</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>культура</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63435</th>\n",
" <td>63435</td>\n",
" <td>объемной</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>объемный</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63436</th>\n",
" <td>63436</td>\n",
" <td>участком</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>участок</td>\n",
" </tr>\n",
" <tr>\n",
" <th>63437</th>\n",
" <td>63437</td>\n",
" <td>ташкента</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>ташкент</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>63438 rows × 5 columns</p>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-edc4ed79-b743-47a8-a595-ff6279343978')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-edc4ed79-b743-47a8-a595-ff6279343978 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-edc4ed79-b743-47a8-a595-ff6279343978');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
]
},
"metadata": {},
"execution_count": 62
}
]
},
{
"cell_type": "markdown",
"source": [
"### Preprocessing"
],
"metadata": {
"id": "bKe_fTixbfIO"
}
},
{
"cell_type": "code",
"source": [
"def stress_pos(word, stress):\n",
" res = np.zeros(len(word))\n",
" for i in range(len(word)):\n",
" if word[i] in ['а', 'о', 'у', 'ы', 'э', 'е', 'ё', 'и', 'ю', 'я']:\n",
" if stress == 1:\n",
" res[i] = 1\n",
" break\n",
" else: \n",
" stress -= 1 \n",
" return res"
],
"metadata": {
"id": "LUaoofm8KaUS"
},
"execution_count": 63,
"outputs": []
},
{
"cell_type": "code",
"source": [
"%%time\n",
"\n",
"data['word_stress_pos'] = data.apply(lambda x: stress_pos(x.word, x.stress), axis=1)"
],
"metadata": {
"id": "MCL0OC5AQ10d",
"outputId": "3ea44f1a-50ef-448c-edad-2a97877665c3",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 64,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 1.19 s, sys: 10.7 ms, total: 1.2 s\n",
"Wall time: 1.2 s\n"
]
}
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"id": "QMJeYC9636St",
"outputId": "6c803ce0-0227-4003-87fa-e93738697237",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 37.9 ms, sys: 26.2 ms, total: 64.2 ms\n",
"Wall time: 65.6 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"data['word_list'] = data.word.map(list)"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"id": "FV6qIcC336Su",
"outputId": "00d1f8c4-41a2-4c90-ab61-d599dd8fcdf5",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" id word stress num_syllables lemma \\\n",
"49671 49671 священником 2 4 священник \n",
"50707 50707 игрушечный 2 4 игрушечный \n",
"29760 29760 полмиллиарда 4 5 полмиллиард \n",
"61955 61955 байгора 1 3 байгора \n",
"28681 28681 цепочки 2 3 цепочка \n",
"\n",
" word_stress_pos \\\n",
"49671 [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, ... \n",
"50707 [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, ... \n",
"29760 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, ... \n",
"61955 [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] \n",
"28681 [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0] \n",
"\n",
" word_list \n",
"49671 [с, в, я, щ, е, н, н, и, к, о, м] \n",
"50707 [и, г, р, у, ш, е, ч, н, ы, й] \n",
"29760 [п, о, л, м, и, л, л, и, а, р, д, а] \n",
"61955 [б, а, й, г, о, р, а] \n",
"28681 [ц, е, п, о, ч, к, и] "
],
"text/html": [
"\n",
" <div id=\"df-cf066de4-3646-4f64-afb8-4077910571cf\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>word</th>\n",
" <th>stress</th>\n",
" <th>num_syllables</th>\n",
" <th>lemma</th>\n",
" <th>word_stress_pos</th>\n",
" <th>word_list</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>49671</th>\n",
" <td>49671</td>\n",
" <td>священником</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>священник</td>\n",
" <td>[0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, ...</td>\n",
" <td>[с, в, я, щ, е, н, н, и, к, о, м]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50707</th>\n",
" <td>50707</td>\n",
" <td>игрушечный</td>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>игрушечный</td>\n",
" <td>[0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...</td>\n",
" <td>[и, г, р, у, ш, е, ч, н, ы, й]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29760</th>\n",
" <td>29760</td>\n",
" <td>полмиллиарда</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>полмиллиард</td>\n",
" <td>[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, ...</td>\n",
" <td>[п, о, л, м, и, л, л, и, а, р, д, а]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>61955</th>\n",
" <td>61955</td>\n",
" <td>байгора</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>байгора</td>\n",
" <td>[0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]</td>\n",
" <td>[б, а, й, г, о, р, а]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28681</th>\n",
" <td>28681</td>\n",
" <td>цепочки</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>цепочка</td>\n",
" <td>[0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]</td>\n",
" <td>[ц, е, п, о, ч, к, и]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-cf066de4-3646-4f64-afb8-4077910571cf')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-cf066de4-3646-4f64-afb8-4077910571cf button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-cf066de4-3646-4f64-afb8-4077910571cf');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
]
},
"metadata": {},
"execution_count": 66
}
],
"source": [
"data.sample(5)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"id": "q5LCEprm36Su",
"outputId": "6f278542-1266-4a19-e0a6-412a62953379",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"20"
]
},
"metadata": {},
"execution_count": 67
}
],
"source": [
"max_sequence_len = np.max(data.word.str.len())\n",
"max_sequence_len"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"id": "T1ln0-f436Su"
},
"outputs": [],
"source": [
"def flatten(array):\n",
" for item in array:\n",
" if isinstance(item, list):\n",
" yield from flatten(item)\n",
" else:\n",
" yield item\n",
"\n",
"\n",
"class SequenceTokenizer:\n",
" \n",
" def __init__(self):\n",
" self.word2index = {}\n",
" self.index2word = {}\n",
" self.oov_token ='<UNK>'\n",
" self.oov_token_index = 0\n",
" \n",
" def fit(self, sequence):\n",
" self.index2word = dict(enumerate([self.oov_token] + sorted(set(flatten(sequence))), 1))\n",
" self.word2index = {v:k for k,v in self.index2word.items()}\n",
" self.oov_token_index = self.word2index.get(self.oov_token)\n",
" return self\n",
" \n",
" def transform(self, X):\n",
" res = []\n",
" for line in X:\n",
" res.append([self.word2index.get(item, self.oov_token_index) for item in line])\n",
" return res"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"id": "h4Rl1qJd36Sv"
},
"outputs": [],
"source": [
"tokenizer = SequenceTokenizer()\n",
"tokenizer.fit(data.word_list);"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"id": "xj1bSdhr36Sv",
"outputId": "08ef9c2b-69dc-4c1e-b0a2-311f2709fb0b",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'<UNK>': 1,\n",
" 'а': 2,\n",
" 'б': 3,\n",
" 'в': 4,\n",
" 'г': 5,\n",
" 'д': 6,\n",
" 'е': 7,\n",
" 'ж': 8,\n",
" 'з': 9,\n",
" 'и': 10,\n",
" 'й': 11,\n",
" 'к': 12,\n",
" 'л': 13,\n",
" 'м': 14,\n",
" 'н': 15,\n",
" 'о': 16,\n",
" 'п': 17,\n",
" 'р': 18,\n",
" 'с': 19,\n",
" 'т': 20,\n",
" 'у': 21,\n",
" 'ф': 22,\n",
" 'х': 23,\n",
" 'ц': 24,\n",
" 'ч': 25,\n",
" 'ш': 26,\n",
" 'щ': 27,\n",
" 'ъ': 28,\n",
" 'ы': 29,\n",
" 'ь': 30,\n",
" 'э': 31,\n",
" 'ю': 32,\n",
" 'я': 33,\n",
" 'ё': 34}"
]
},
"metadata": {},
"execution_count": 70
}
],
"source": [
"tokenizer.word2index"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"id": "46RLP83Z36Sv"
},
"outputs": [],
"source": [
"X = tokenizer.transform(data.word_list)"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {
"id": "yInv9QA636Sv"
},
"outputs": [],
"source": [
"def pad_sequence(lst, max_seq=max_sequence_len):\n",
" if isinstance(lst[0], list):\n",
" return np.array([i + [0]*(max_seq-len(i)) for i in lst])\n",
" else:\n",
" lst + [0]*(max_seq-len(lst))"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"id": "YmDQ0jGP36Sw",
"outputId": "b191b59e-76bd-48b1-a2a9-e693a8379adc",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 129 ms, sys: 5.91 ms, total: 134 ms\n",
"Wall time: 136 ms\n"
]
}
],
"source": [
"%%time\n",
"\n",
"input_seq = pad_sequence(X)"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"id": "vdMK4Yrd36Sw",
"outputId": "18424cdb-f387-4380-a769-978e91d25b30",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(63438, 20)\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[18, 21, 14, ..., 0, 0, 0],\n",
" [24, 10, 22, ..., 0, 0, 0],\n",
" [19, 13, 21, ..., 0, 0, 0],\n",
" ...,\n",
" [16, 3, 28, ..., 0, 0, 0],\n",
" [21, 25, 2, ..., 0, 0, 0],\n",
" [20, 2, 26, ..., 0, 0, 0]])"
]
},
"metadata": {},
"execution_count": 74
}
],
"source": [
"print(input_seq.shape)\n",
"input_seq"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"id": "x5ATpkXb36Sx"
},
"outputs": [],
"source": [
"y = data.word_stress_pos.values"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"id": "izwtrpIy36Sx"
},
"outputs": [],
"source": [
"output_seq = zip(*itertools.zip_longest(*y, fillvalue=0))\n",
"output_seq = list(map(list, output_seq))\n",
"output_seq = np.array(output_seq).astype(int)"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"id": "bqjHJ85O36Sx",
"outputId": "283c2a17-e121-4fd5-955c-bf17e1c04906",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(63438, 20)\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[0, 0, 0, ..., 0, 0, 0],\n",
" [0, 1, 0, ..., 0, 0, 0],\n",
" [0, 0, 1, ..., 0, 0, 0],\n",
" ...,\n",
" [0, 0, 0, ..., 0, 0, 0],\n",
" [0, 0, 1, ..., 0, 0, 0],\n",
" [0, 0, 0, ..., 0, 0, 0]])"
]
},
"metadata": {},
"execution_count": 77
}
],
"source": [
"print(output_seq.shape)\n",
"output_seq"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"id": "xJaSZ-mf36Sx"
},
"outputs": [],
"source": [
"(input_seq_train, input_seq_val, \n",
" output_seq_train, output_seq_val) = train_test_split(input_seq, \n",
" output_seq, \n",
" test_size=0.5, \n",
" random_state=RANDOM_SEED)"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"id": "ezujxONV36Sy"
},
"outputs": [],
"source": [
"input_seq_train = torch.tensor(input_seq_train, dtype=torch.long).cuda()\n",
"input_seq_val = torch.tensor(input_seq_val, dtype=torch.long).cuda()\n",
"output_seq_train = torch.tensor(output_seq_train, dtype=torch.float).cuda()\n",
"output_seq_val = torch.tensor(output_seq_val, dtype=torch.float).cuda()"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {
"id": "gRsPsPpj36Sy"
},
"outputs": [],
"source": [
"class MyDataset(Dataset):\n",
" def __init__(self, dataset):\n",
" self.dataset = dataset\n",
" \n",
" def __getitem__(self, index):\n",
" data,target = self.dataset[index]\n",
" return data, target, index\n",
" \n",
" def __len__(self):\n",
" return len(self.dataset)"
]
},
{
"cell_type": "markdown",
"source": [
"### Model"
],
"metadata": {
"id": "92jorRHXcGmz"
}
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"id": "UZ5BFgo736Sy"
},
"outputs": [],
"source": [
"class LSTM_model(nn.Module):\n",
"\n",
" def __init__(self, embedding_dim, hidden_dim, vocab_size, target_size):\n",
" super(LSTM_model, self).__init__()\n",
" self.hidden_dim = hidden_dim\n",
"\n",
" self.embeddings = nn.Embedding(vocab_size, embedding_dim)\n",
"\n",
" self.lstm = nn.LSTM(input_size=self.embeddings.embedding_dim,\n",
" hidden_size=hidden_dim,\n",
" num_layers=3,\n",
" batch_first=True,\n",
" bidirectional=True,\n",
" dropout = 0.05)\n",
" self.linear = nn.Linear(self.hidden_dim * 8 , 64)\n",
" self.batch_norm = nn.BatchNorm1d(self.hidden_dim * 8, affine=False)\n",
" self.relu = nn.ReLU()\n",
" self.dropout = nn.Dropout(0.1)\n",
" self.out = nn.Linear(64, target_size)\n",
"\n",
" def forward(self, x):\n",
" h_embeddings = self.embeddings(x)\n",
" \n",
" h_lstm, _ = self.lstm(h_embeddings)\n",
" d_1 = h_lstm[:,0,:]\n",
" d_2 = h_lstm[:,h_lstm.shape[1]//4,:]\n",
" d_3 = h_lstm[:,h_lstm.shape[1]*3//4,:]\n",
" d_4 = h_lstm[:,-1,:]\n",
" x = torch.cat((d_1, d_2, d_3, d_4), 1)\n",
" x = self.batch_norm(x)\n",
" x = self.linear(x)\n",
" x = self.relu(x)\n",
" x = self.dropout(x)\n",
" x = self.out(x)\n",
" y = nn.functional.softmax(x, dim=1)\n",
" return y"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"id": "uA2SJd7736Sy",
"outputId": "bae9801c-448d-4d31-b0d2-48be63acf28b",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"LSTM_model(\n",
" (embeddings): Embedding(35, 64)\n",
" (lstm): LSTM(64, 64, num_layers=3, batch_first=True, dropout=0.05, bidirectional=True)\n",
" (linear): Linear(in_features=512, out_features=64, bias=True)\n",
" (batch_norm): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
" (relu): ReLU()\n",
" (dropout): Dropout(p=0.1, inplace=False)\n",
" (out): Linear(in_features=64, out_features=20, bias=True)\n",
")"
]
},
"metadata": {},
"execution_count": 82
}
],
"source": [
"model = LSTM_model(embedding_dim=64, \n",
" hidden_dim=64, \n",
" vocab_size=len(tokenizer.word2index) + 1, \n",
" target_size=max_sequence_len)\n",
"model.cuda()"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"id": "y6hRGxF836Sz"
},
"outputs": [],
"source": [
"loss_function = nn.BCEWithLogitsLoss()\n",
"optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"id": "NZD-Vfjh36Sz"
},
"outputs": [],
"source": [
"BATCH_SIZE = 256 * 2\n",
"\n",
"train = MyDataset(torch.utils.data.TensorDataset(input_seq_train, output_seq_train))\n",
"valid = MyDataset(torch.utils.data.TensorDataset(input_seq_val, output_seq_val))\n",
"\n",
"train_loader = torch.utils.data.DataLoader(train, batch_size=BATCH_SIZE, shuffle=True)\n",
"valid_loader = torch.utils.data.DataLoader(valid, batch_size=BATCH_SIZE, shuffle=False)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jDEMfycQ36Sz"
},
"source": [
"### K-Fold training"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"id": "xIltVQnU36S0"
},
"outputs": [],
"source": [
"from sklearn.model_selection import KFold"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"id": "fN3FS28a36S1"
},
"outputs": [],
"source": [
"n_folds = 5"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"id": "p3-X0BHZ36S1"
},
"outputs": [],
"source": [
"kf = KFold(n_splits=n_folds, shuffle=True, random_state=RANDOM_SEED)"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"id": "m2x5XeCL36S1",
"outputId": "818fb1f8-c1c5-4293-8065-a42249b8bbd4",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"(50750,) (12688,)\n",
"(50750,) (12688,)\n",
"(50750,) (12688,)\n",
"(50751,) (12687,)\n",
"(50751,) (12687,)\n"
]
}
],
"source": [
"for train_index, test_index in kf.split(X=input_seq, y=output_seq):\n",
" print(train_index.shape, test_index.shape)"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"id": "zonYLRzp36S1",
"outputId": "f0aed232-79a7-4cc7-93cc-a40c0402421a",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[18, 21, 14, ..., 0, 0, 0],\n",
" [24, 10, 22, ..., 0, 0, 0],\n",
" [19, 13, 21, ..., 0, 0, 0],\n",
" ...,\n",
" [16, 3, 28, ..., 0, 0, 0],\n",
" [21, 25, 2, ..., 0, 0, 0],\n",
" [20, 2, 26, ..., 0, 0, 0]])"
]
},
"metadata": {},
"execution_count": 89
}
],
"source": [
"input_seq"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "m-qOODva36S2"
},
"source": [
"### Training loop"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {
"id": "G41070T636S2",
"outputId": "88019e40-3214-4b5e-8db5-5285d059ef0a",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch [1/50] progress = 98% \t loss=0.7073 \t acc=32.47% \n",
"Epoch [1/50] results:\t\t loss=0.7073\t acc=32.47%\t val_loss=0.7030\t val_acc=44.64%\t time=1.42s\n",
"------------------------------------------------------------------------------\n",
"Epoch [2/50] progress = 98% \t loss=0.6954 \t acc=57.92% \n",
"Epoch [2/50] results:\t\t loss=0.6954\t acc=57.92%\t val_loss=0.6914\t val_acc=65.59%\t time=1.47s\n",
"------------------------------------------------------------------------------\n",
"Epoch [3/50] progress = 98% \t loss=0.6900 \t acc=68.33% \n",
"Epoch [3/50] results:\t\t loss=0.6900\t acc=68.33%\t val_loss=0.6890\t val_acc=70.17%\t time=1.35s\n",
"------------------------------------------------------------------------------\n",
"Epoch [4/50] progress = 98% \t loss=0.6882 \t acc=71.96% \n",
"Epoch [4/50] results:\t\t loss=0.6882\t acc=71.96%\t val_loss=0.6883\t val_acc=71.45%\t time=1.68s\n",
"------------------------------------------------------------------------------\n",
"Epoch [5/50] progress = 98% \t loss=0.6875 \t acc=73.19% \n",
"Epoch [5/50] results:\t\t loss=0.6875\t acc=73.19%\t val_loss=0.6876\t val_acc=72.75%\t time=1.56s\n",
"------------------------------------------------------------------------------\n",
"Epoch [6/50] progress = 98% \t loss=0.6866 \t acc=75.19% \n",
"Epoch [6/50] results:\t\t loss=0.6866\t acc=75.19%\t val_loss=0.6870\t val_acc=74.08%\t time=1.32s\n",
"------------------------------------------------------------------------------\n",
"Epoch [7/50] progress = 98% \t loss=0.6860 \t acc=76.11% \n",
"Epoch [7/50] results:\t\t loss=0.6860\t acc=76.11%\t val_loss=0.6864\t val_acc=75.45%\t time=1.31s\n",
"------------------------------------------------------------------------------\n",
"Epoch [8/50] progress = 98% \t loss=0.6855 \t acc=77.21% \n",
"Epoch [8/50] results:\t\t loss=0.6855\t acc=77.21%\t val_loss=0.6861\t val_acc=75.99%\t time=1.47s\n",
"------------------------------------------------------------------------------\n",
"Epoch [9/50] progress = 98% \t loss=0.6852 \t acc=77.76% \n",
"Epoch [9/50] results:\t\t loss=0.6852\t acc=77.76%\t val_loss=0.6857\t val_acc=76.71%\t time=1.31s\n",
"------------------------------------------------------------------------------\n",
"Epoch [10/50] progress = 98% \t loss=0.6848 \t acc=78.58% \n",
"Epoch [10/50] results:\t\t loss=0.6848\t acc=78.58%\t val_loss=0.6857\t val_acc=76.74%\t time=1.35s\n",
"------------------------------------------------------------------------------\n",
"Epoch [11/50] progress = 98% \t loss=0.6842 \t acc=79.83% \n",
"Epoch [11/50] results:\t\t loss=0.6842\t acc=79.83%\t val_loss=0.6849\t val_acc=78.53%\t time=1.32s\n",
"------------------------------------------------------------------------------\n",
"Epoch [12/50] progress = 98% \t loss=0.6838 \t acc=80.68% \n",
"Epoch [12/50] results:\t\t loss=0.6838\t acc=80.68%\t val_loss=0.6848\t val_acc=78.61%\t time=1.48s\n",
"------------------------------------------------------------------------------\n",
"Epoch [13/50] progress = 98% \t loss=0.6838 \t acc=80.61% \n",
"Epoch [13/50] results:\t\t loss=0.6838\t acc=80.61%\t val_loss=0.6847\t val_acc=78.81%\t time=1.66s\n",
"------------------------------------------------------------------------------\n",
"Epoch [14/50] progress = 98% \t loss=0.6833 \t acc=81.56% \n",
"Epoch [14/50] results:\t\t loss=0.6833\t acc=81.56%\t val_loss=0.6844\t val_acc=79.43%\t time=1.51s\n",
"------------------------------------------------------------------------------\n",
"Epoch [15/50] progress = 98% \t loss=0.6832 \t acc=81.91% \n",
"Epoch [15/50] results:\t\t loss=0.6832\t acc=81.91%\t val_loss=0.6844\t val_acc=79.35%\t time=1.34s\n",
"------------------------------------------------------------------------------\n",
"Epoch [16/50] progress = 98% \t loss=0.6829 \t acc=82.49% \n",
"Epoch [16/50] results:\t\t loss=0.6829\t acc=82.49%\t val_loss=0.6841\t val_acc=79.96%\t time=1.35s\n",
"------------------------------------------------------------------------------\n",
"Epoch [17/50] progress = 98% \t loss=0.6827 \t acc=82.89% \n",
"Epoch [17/50] results:\t\t loss=0.6827\t acc=82.89%\t val_loss=0.6843\t val_acc=79.54%\t time=1.33s\n",
"------------------------------------------------------------------------------\n",
"Epoch [18/50] progress = 98% \t loss=0.6825 \t acc=83.25% \n",
"Epoch [18/50] results:\t\t loss=0.6825\t acc=83.25%\t val_loss=0.6840\t val_acc=80.11%\t time=1.34s\n",
"------------------------------------------------------------------------------\n",
"Epoch [19/50] progress = 98% \t loss=0.6823 \t acc=83.72% \n",
"Epoch [19/50] results:\t\t loss=0.6823\t acc=83.72%\t val_loss=0.6839\t val_acc=80.42%\t time=1.37s\n",
"------------------------------------------------------------------------------\n",
"Epoch [20/50] progress = 98% \t loss=0.6822 \t acc=83.85% \n",
"Epoch [20/50] results:\t\t loss=0.6822\t acc=83.85%\t val_loss=0.6838\t val_acc=80.65%\t time=1.50s\n",
"------------------------------------------------------------------------------\n",
"Epoch [21/50] progress = 98% \t loss=0.6820 \t acc=84.19% \n",
"Epoch [21/50] results:\t\t loss=0.6820\t acc=84.19%\t val_loss=0.6840\t val_acc=80.10%\t time=1.61s\n",
"------------------------------------------------------------------------------\n",
"Epoch [22/50] progress = 98% \t loss=0.6819 \t acc=84.51% \n",
"Epoch [22/50] results:\t\t loss=0.6819\t acc=84.51%\t val_loss=0.6836\t val_acc=80.95%\t time=1.51s\n",
"------------------------------------------------------------------------------\n",
"Epoch [23/50] progress = 98% \t loss=0.6817 \t acc=84.92% \n",
"Epoch [23/50] results:\t\t loss=0.6817\t acc=84.92%\t val_loss=0.6835\t val_acc=81.17%\t time=1.71s\n",
"------------------------------------------------------------------------------\n",
"Epoch [24/50] progress = 98% \t loss=0.6815 \t acc=85.27% \n",
"Epoch [24/50] results:\t\t loss=0.6815\t acc=85.27%\t val_loss=0.6836\t val_acc=80.90%\t time=2.25s\n",
"------------------------------------------------------------------------------\n",
"Epoch [25/50] progress = 98% \t loss=0.6815 \t acc=85.42% \n",
"Epoch [25/50] results:\t\t loss=0.6815\t acc=85.42%\t val_loss=0.6834\t val_acc=81.36%\t time=1.41s\n",
"------------------------------------------------------------------------------\n",
"Epoch [26/50] progress = 98% \t loss=0.6814 \t acc=85.62% \n",
"Epoch [26/50] results:\t\t loss=0.6814\t acc=85.62%\t val_loss=0.6834\t val_acc=81.44%\t time=1.49s\n",
"------------------------------------------------------------------------------\n",
"Epoch [27/50] progress = 98% \t loss=0.6812 \t acc=85.88% \n",
"Epoch [27/50] results:\t\t loss=0.6812\t acc=85.88%\t val_loss=0.6835\t val_acc=81.20%\t time=1.33s\n",
"------------------------------------------------------------------------------\n",
"Epoch [28/50] progress = 98% \t loss=0.6811 \t acc=86.17% \n",
"Epoch [28/50] results:\t\t loss=0.6811\t acc=86.17%\t val_loss=0.6832\t val_acc=81.71%\t time=1.33s\n",
"------------------------------------------------------------------------------\n",
"Epoch [29/50] progress = 98% \t loss=0.6809 \t acc=86.44% \n",
"Epoch [29/50] results:\t\t loss=0.6809\t acc=86.44%\t val_loss=0.6832\t val_acc=81.77%\t time=3.03s\n",
"------------------------------------------------------------------------------\n",
"Epoch [30/50] progress = 98% \t loss=0.6807 \t acc=86.77% \n",
"Epoch [30/50] results:\t\t loss=0.6807\t acc=86.77%\t val_loss=0.6832\t val_acc=81.76%\t time=1.34s\n",
"------------------------------------------------------------------------------\n",
"Epoch [31/50] progress = 98% \t loss=0.6806 \t acc=87.00% \n",
"Epoch [31/50] results:\t\t loss=0.6806\t acc=87.00%\t val_loss=0.6831\t val_acc=82.11%\t time=1.51s\n",
"------------------------------------------------------------------------------\n",
"Epoch [32/50] progress = 98% \t loss=0.6805 \t acc=87.17% \n",
"Epoch [32/50] results:\t\t loss=0.6805\t acc=87.17%\t val_loss=0.6829\t val_acc=82.33%\t time=1.33s\n",
"------------------------------------------------------------------------------\n",
"Epoch [33/50] progress = 98% \t loss=0.6805 \t acc=87.32% \n",
"Epoch [33/50] results:\t\t loss=0.6805\t acc=87.32%\t val_loss=0.6829\t val_acc=82.48%\t time=1.32s\n",
"------------------------------------------------------------------------------\n",
"Epoch [34/50] progress = 98% \t loss=0.6803 \t acc=87.62% \n",
"Epoch [34/50] results:\t\t loss=0.6803\t acc=87.62%\t val_loss=0.6829\t val_acc=82.31%\t time=1.31s\n",
"------------------------------------------------------------------------------\n",
"Epoch [35/50] progress = 98% \t loss=0.6802 \t acc=87.90% \n",
"Epoch [35/50] results:\t\t loss=0.6802\t acc=87.90%\t val_loss=0.6828\t val_acc=82.62%\t time=1.49s\n",
"------------------------------------------------------------------------------\n",
"Epoch [36/50] progress = 98% \t loss=0.6800 \t acc=88.25% \n",
"Epoch [36/50] results:\t\t loss=0.6800\t acc=88.25%\t val_loss=0.6827\t val_acc=82.84%\t time=1.33s\n",
"------------------------------------------------------------------------------\n",
"Epoch [37/50] progress = 98% \t loss=0.6799 \t acc=88.48% \n",
"Epoch [37/50] results:\t\t loss=0.6799\t acc=88.48%\t val_loss=0.6828\t val_acc=82.47%\t time=1.63s\n",
"------------------------------------------------------------------------------\n",
"Epoch [38/50] progress = 98% \t loss=0.6798 \t acc=88.66% \n",
"Epoch [38/50] results:\t\t loss=0.6798\t acc=88.66%\t val_loss=0.6828\t val_acc=82.68%\t time=2.02s\n",
"------------------------------------------------------------------------------\n",
"Epoch [39/50] progress = 98% \t loss=0.6797 \t acc=88.83% \n",
"Epoch [39/50] results:\t\t loss=0.6797\t acc=88.83%\t val_loss=0.6826\t val_acc=83.10%\t time=1.33s\n",
"------------------------------------------------------------------------------\n",
"Epoch [40/50] progress = 98% \t loss=0.6797 \t acc=89.00% \n",
"Epoch [40/50] results:\t\t loss=0.6797\t acc=89.00%\t val_loss=0.6826\t val_acc=82.97%\t time=1.48s\n",
"------------------------------------------------------------------------------\n",
"Epoch [41/50] progress = 98% \t loss=0.6797 \t acc=88.96% \n",
"Epoch [41/50] results:\t\t loss=0.6797\t acc=88.96%\t val_loss=0.6825\t val_acc=83.18%\t time=1.31s\n",
"------------------------------------------------------------------------------\n",
"Epoch [42/50] progress = 98% \t loss=0.6795 \t acc=89.27% \n",
"Epoch [42/50] results:\t\t loss=0.6795\t acc=89.27%\t val_loss=0.6825\t val_acc=83.26%\t time=1.31s\n",
"------------------------------------------------------------------------------\n",
"Epoch [43/50] progress = 98% \t loss=0.6795 \t acc=89.32% \n",
"Epoch [43/50] results:\t\t loss=0.6795\t acc=89.32%\t val_loss=0.6825\t val_acc=83.19%\t time=1.32s\n",
"------------------------------------------------------------------------------\n",
"Epoch [44/50] progress = 98% \t loss=0.6794 \t acc=89.50% \n",
"Epoch [44/50] results:\t\t loss=0.6794\t acc=89.50%\t val_loss=0.6824\t val_acc=83.39%\t time=1.49s\n",
"------------------------------------------------------------------------------\n",
"Epoch [45/50] progress = 98% \t loss=0.6794 \t acc=89.50% \n",
"Epoch [45/50] results:\t\t loss=0.6794\t acc=89.50%\t val_loss=0.6824\t val_acc=83.42%\t time=1.49s\n",
"------------------------------------------------------------------------------\n",
"Epoch [46/50] progress = 98% \t loss=0.6793 \t acc=89.73% \n",
"Epoch [46/50] results:\t\t loss=0.6793\t acc=89.73%\t val_loss=0.6824\t val_acc=83.43%\t time=1.65s\n",
"------------------------------------------------------------------------------\n",
"Epoch [47/50] progress = 98% \t loss=0.6792 \t acc=89.94% \n",
"Epoch [47/50] results:\t\t loss=0.6792\t acc=89.94%\t val_loss=0.6824\t val_acc=83.47%\t time=1.48s\n",
"------------------------------------------------------------------------------\n",
"Epoch [48/50] progress = 98% \t loss=0.6792 \t acc=89.92% \n",
"Epoch [48/50] results:\t\t loss=0.6792\t acc=89.92%\t val_loss=0.6823\t val_acc=83.59%\t time=1.32s\n",
"------------------------------------------------------------------------------\n",
"Epoch [49/50] progress = 98% \t loss=0.6791 \t acc=90.01% \n",
"Epoch [49/50] results:\t\t loss=0.6791\t acc=90.01%\t val_loss=0.6825\t val_acc=83.20%\t time=1.31s\n",
"------------------------------------------------------------------------------\n",
"Epoch [50/50] progress = 98% \t loss=0.6791 \t acc=90.14% \n",
"Epoch [50/50] results:\t\t loss=0.6791\t acc=90.14%\t val_loss=0.6823\t val_acc=83.66%\t time=1.52s\n",
"------------------------------------------------------------------------------\n"
]
}
],
"source": [
"n_epochs = 50\n",
"history = {'train': {}, 'val': {}}\n",
"teacher_forcing_ratio = 0.5\n",
"\n",
"for epoch in range(1, n_epochs + 1):\n",
" start_time = time.time()\n",
" \n",
" model.train()\n",
"\n",
" avg_loss, total_loss, avg_acc, total_acc = 0., 0., 0., 0.\n",
" for i, (x_batch, y_batch, index) in enumerate(train_loader):\n",
" y_pred = model(x_batch)\n",
" loss = loss_function(y_pred, y_batch)\n",
" \n",
" optimizer.zero_grad()\n",
" loss.backward()\n",
" optimizer.step()\n",
" \n",
" equal = torch.eq(torch.argmax(y_pred, axis=1), torch.argmax(y_batch, axis=1))\n",
" batch_acc = int(equal.sum(-1)) / y_batch.shape[0]\n",
" batch_loss = loss.item()\n",
" \n",
" total_acc += batch_acc\n",
" total_loss += batch_loss\n",
" print(f\"\\rEpoch [{epoch}/{n_epochs}] \"\n",
" f\" progress = {round(i/len(train_loader)*100)}% \"\n",
" f\"\\t loss={total_loss / (i + 1):.4f} \"\n",
" f\"\\t acc={total_acc / (i + 1) * 100:.2f}% \", end='')\n",
" avg_loss = total_loss / len(train_loader)\n",
" avg_acc = total_acc / len(train_loader)\n",
" history['train']['loss'] = history.get('train', {}).get('loss', []) + [avg_loss]\n",
" history['train']['accuracy'] = history.get('train', {}).get('accuracy', []) + [avg_acc]\n",
" \n",
" model.eval()\n",
"\n",
" \n",
" avg_val_loss, total_val_loss, avg_val_acc, total_val_acc = 0., 0., 0., 0.\n",
" for i, (x_batch, y_batch, index) in enumerate(valid_loader):\n",
" y_pred = model(x_batch).detach()\n",
" val_loss = loss_function(y_pred, y_batch)\n",
" \n",
" equal = torch.eq(torch.argmax(y_pred, axis=1), torch.argmax(y_batch, axis=1))\n",
" batch_val_acc = int(equal.sum(-1)) / y_batch.shape[0]\n",
" batch_val_loss = val_loss.item()\n",
" \n",
" total_val_acc += batch_val_acc\n",
" total_val_loss += batch_val_loss\n",
" avg_val_loss = total_val_loss / len(valid_loader)\n",
" avg_val_acc = total_val_acc / len(valid_loader)\n",
" history['val']['loss'] = history.get('val', {}).get('loss', []) + [avg_val_loss]\n",
" history['val']['accuracy'] = history.get('val', {}).get('accuracy', []) + [avg_val_acc]\n",
" \n",
" elapsed_time = time.time() - start_time \n",
" print(f\"\\nEpoch [{epoch}/{n_epochs}] results:\"\n",
" f\"\\t\\t loss={avg_loss:.4f}\"\n",
" f\"\\t acc={avg_acc * 100:.2f}%\"\n",
" f\"\\t val_loss={avg_val_loss:.4f}\"\n",
" f\"\\t val_acc={avg_val_acc * 100:.2f}%\"\n",
" f\"\\t time={elapsed_time:.2f}s\")\n",
" print(\"-\"*78)"
]
},
{
"cell_type": "code",
"source": [
"torch.save(model.state_dict(),\"accentor.pt\")"
],
"metadata": {
"id": "t_KzF99MbYZ2"
},
"execution_count": 93,
"outputs": []
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {
"id": "gLj87-3T36S2",
"outputId": "7d666ca6-0865-4342-b10b-9320d92331b4",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 718
}
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1200x800 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA/oAAAK9CAYAAACUzBfBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAClAklEQVR4nOzdd3hb5f3+8VuSLVvykO14O8529oIQQggtUAJhE0optPAjoYyWhtWUtqQte6RASymFEmhZZXzLLIQVSMMqEBJGE0gge8crcbyXbOn8/jiSbMV24iSWZUnv13XpOkdHR9Ijl7bc5/M8n2MxDMMQAAAAAACICtZwDwAAAAAAAPQcgj4AAAAAAFGEoA8AAAAAQBQh6AMAAAAAEEUI+gAAAAAARBGCPgAAAAAAUYSgDwAAAABAFCHoAwAAAAAQRQj6AAAAAABEEYI+AAA4ZFu2bJHFYtETTzxxwO99//33ZbFY9P777+/zvCeeeEIWi0Vbtmw5qDECABArCPoAAAAAAEQRgj4AAAAAAFGEoA8AAAAAQBQh6AMAEAVuvvlmWSwWrVu3ThdeeKFcLpeysrJ0ww03yDAMbd++XWeddZZSU1OVm5urP/3pTx0+o7y8XJdccolycnKUmJioCRMm6Mknn+xwXlVVlWbPni2Xy6W0tDTNmjVLVVVVnY5rzZo1+sEPfqCMjAwlJibqiCOO0MKFC3v0t//tb3/TmDFjlJCQoPz8fM2ZM6fDeNavX69zzjlHubm5SkxMVP/+/XX++eeruro6cM7ixYt1zDHHKC0tTcnJyRoxYoR++9vf9uhYAQDoDXHhHgAAAOg55513nkaNGqU//OEPeuONN3T77bcrIyNDDz/8sL73ve/prrvu0jPPPKPrrrtOkydP1ne/+11JUmNjo4477jht2LBBV155pQYPHqwXXnhBs2fPVlVVla655hpJkmEYOuuss/TRRx/pZz/7mUaNGqV///vfmjVrVoexrF69WtOmTVNBQYGuv/56JSUl6fnnn9fMmTP10ksv6eyzzz7k33vzzTfrlltu0fTp03XFFVdo7dq1euihh/TZZ5/p448/Vnx8vNxut2bMmKHm5mZdddVVys3N1c6dO/X666+rqqpKLpdLq1ev1umnn67x48fr1ltvVUJCgjZs2KCPP/74kMcIAECvMwAAQMS76aabDEnG5ZdfHjjW2tpq9O/f37BYLMYf/vCHwPHKykrD4XAYs2bNChy77777DEnG008/HTjmdruNqVOnGsnJyUZNTY1hGIbxyiuvGJKMu+++O+h7vvOd7xiSjMcffzxw/IQTTjDGjRtnNDU1BY55vV7j6KOPNoqKigLH3nvvPUOS8d577+3zNz7++OOGJGPz5s2GYRhGeXm5YbfbjZNOOsnweDyB8x544AFDkvHYY48ZhmEY//vf/wxJxgsvvNDlZ//5z382JBm7du3a5xgAAIgETN0HACCKXHrppYF9m82mI444QoZh6JJLLgkcT0tL04gRI7Rp06bAsTfffFO5ubn60Y9+FDgWHx+vq6++WnV1dfrggw8C58XFxemKK64I+p6rrroqaBx79uzRu+++qx/+8Ieqra3V7t27tXv3blVUVGjGjBlav369du7ceUi/9T//+Y/cbreuvfZaWa1t/0pz2WWXKTU1VW+88YYkyeVySZLefvttNTQ0dPpZaWlpkqRXX31VXq/3kMYFAEC4EfQBAIgiAwYMCHrucrmUmJiozMzMDscrKysDz7du3aqioqKgwCxJo0aNCrzu3+bl5Sk5OTnovBEjRgQ937BhgwzD0A033KCsrKygx0033STJ7AlwKPxj2vu77Xa7hgwZEnh98ODBmjt3rv7xj38oMzNTM2bM0IMPPhi0Pv+8887TtGnTdOmllyonJ0fnn3++nn/+eUI/ACAisUYfAIAoYrPZunVMMtfbh4o/IF933XWaMWNGp+cMGzYsZN+/tz/96U+aPXu2Xn31Vb3zzju6+uqrNX/+fH366afq37+/HA6HPvzwQ7333nt64403tGjRIj333HP63ve+p3feeafLvyEAAH0RFX0AAKCBAwdq/fr1HSrYa9asCbzu35aUlKiuri7ovLVr1wY9HzJkiCRz+v/06dM7faSkpBzymDv7brfbrc2bNwde9xs3bpx+//vf68MPP9R///tf7dy5UwsWLAi8brVadcIJJ+jee+/VN998ozvuuEPvvvuu3nvvvUMaJwAAvY2gDwAAdOqpp6q0tFTPPfdc4Fhra6v++te/Kjk5Wccee2zgvNbWVj300EOB8zwej/76178GfV52draOO+44PfzwwyopKenwfbt27TrkMU+fPl12u133339/0OyERx99VNXV1TrttNMkSTU1NWptbQ1677hx42S1WtXc3CzJ7Cmw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M5yyx1nV3OrVzsrGMAwMAAAAANBdceH88ueee05z587VggULNGXKFN13332aMWOG1q5dq+zs7A7nu91unXjiicrOztaLL76ogoICbd26VWlpaYFzLr30Uq1atUpPPfWU8vPz9fTTT2v69On65ptvVFBQEDjv5JNP1uOPPx54npCQENLfGhGc7bruG4ZksUiSbFaLhmQmaU1prTbsqtWAfs4wDhIAAAAAsC9hrejfe++9uuyyy3TxxRdr9OjRWrBggZxOpx577LFOz3/ssce0Z88evfLKK5o2bZoGDRqkY489VhMmTJAkNTY26qWXXtLdd9+t7373uxo2bJhuvvlmDRs2TA899FDQZyUkJCg3NzfwSE9PD/nv7fP8FX1vq9RcG/SSf/r++jLW6QMAAABAXxa2oO92u/XFF19o+vTpbYOxWjV9+nQtXbq00/csXLhQU6dO1Zw5c5STk6OxY8fqzjvvlMfjkSS1trbK4/EoMTEx6H0Oh0MfffRR0LH3339f2dnZGjFihK644gpVVATfO35vzc3NqqmpCXpEHbtTivP97faavl+UnSKJhnwAAAAA0NeFLejv3r1bHo9HOTk5QcdzcnJUWlra6Xs2bdqkF198UR6PR2+++aZuuOEG/elPf9Ltt98uSUpJSdHUqVN12223qbi4WB6PR08//bSWLl2qkpKSwOecfPLJ+uc//6klS5borrvu0gcffKBTTjklcMGgM/Pnz5fL5Qo8CgsLe+Cv0Af5q/pdNORbT9AHAAAAgD4t7M34DoTX61V2drYeeeQRTZo0Seedd55+97vfacGCBYFznnrqKRmGoYKCAiUkJOj+++/Xj370I1mtbT/1/PPP15lnnqlx48Zp5syZev311/XZZ5/p/fff7/K7582bp+rq6sBj+/btofyp4ePvvN/YRef98joZBp33AQAAAKCvClvQz8zMlM1mU1lZWdDxsrIy5ebmdvqevLw8DR8+XDabLXBs1KhRKi0tldvtliQNHTpUH3zwgerq6rR9+3YtX75cLS0tGjJkSJdjGTJkiDIzM7Vhw4Yuz0lISFBqamrQIyo5fb0KGiqDDg/KdMpmtai2uVXltc1hGBgAAAAAoDvCFvTtdrsmTZqkJUuWBI55vV4tWbJEU6dO7fQ906ZN04YNG+T1egPH1q1bp7y8PNnt9qBzk5KSlJeXp8rKSr399ts666yzuhzLjh07VFFRoby8vEP8VVHA0a7zfjsJcTYNzDC77dOQDwAAAAD6rrBO3Z87d67+/ve/68knn9S3336rK664QvX19br44oslSRdddJHmzZsXOP+KK67Qnj17dM0112jdunV64403dOedd2rOnDmBc95++20tWrRImzdv1uLFi3X88cdr5MiRgc+sq6vTr371K3366afasmWLlixZorPOOkvDhg3TjBkzevcP0Bf5b7G319R9SRrqm76/oby2w2sAAAAAgL4hLpxfft5552nXrl268cYbVVpaqokTJ2rRokWBBn3btm0LWltfWFiot99+W7/4xS80fvx4FRQU6JprrtFvfvObwDnV1dWaN2+eduzYoYyMDJ1zzjm64447FB8fL0my2Wz66quv9OSTT6qqqkr5+fk66aSTdNtttykhIaF3/wB9URfN+CSpKDtZi78p04ZdVPQBAAAAoK+yGHRWOyg1NTVyuVyqrq6OrvX6Sx+U3v6tNPYc6QePBb308pc7NPf5lZoyOEPP/bTz5RUAAAAAgNDobg6NqK776AX+rvudVPQDnfep6AMAAABAn0XQRzDHPtboZ5lBf3edW5X17t4cFQAAAACgmwj6CObseo1+UkKcCtIcksQ6fQAAAADoowj6COZIN7edBH2pbfr+hnKCPgAAAAD0RQR9BPNX9FvqpdbmDi/7g/76MoI+AAAAAPRFBH0ES3BJFt8/FvtoyMfUfQAAAADomwj6CGa17rMhX5G/8z5T9wEAAACgTyLoo6N9NOTzV/R3VjWqvrm1N0cFAAAAAOgGgj468lf0Gyo6vJTmtCsz2S5J2sj0fQAAAADocwj66MjZ9dR9ic77AAAAANCXEfTRkaPrqftSu877BH0AAAAA6HMI+ujImW5uGys7fXlYFhV9AAAAAOirCProyNnP3HZR0S/KSZFE530AAAAA6IsI+uhoH7fXk9qm7m+pqFdzq6e3RgUAAAAA6AaCPjpydt11X5KyUxKUkhgnryFt2d3QiwMDAAAAAOwPQR8d7acZn8ViadeQr7a3RgUAAAAA6AaCPjraz+31JBryAQAAAEBfRdBHR4E1+lWSt/M1+EU5BH0AAAAA6IsI+ujIX9GXITVVd3qKf+o+QR8AAAAA+haCPjqyxUsJqeZ+F+v0h2WZt9jbtLteHq/RWyMDAAAAAOwHQR+dc6Sb2y46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IiIiohDChT4RERERERFRCOFCn4iIiIiIiCiEcKFPREREREREFEK40CciIiIiIiIKIVzoExEREREREYUQLvSJiIiIiIiIQggX+kREREREREQhhAt9IiIiIiIiohDChT4RERERERFRCOFCn4iIiIiIiCiEcKFPREREREREFEK40CciIiIiIiIKIVzoExEREREREYUQLvSJiIiIiIiIQggX+kREREREREQhhAt9IiIiIiIiohDChT4RERERERFRCOFCn4iIiIiIiCiEhJ3vAS5UIgIAqKysPM+TEBERERER0Y9B2/qzbT3qCxf6AaqqqgIApKamnudJiIiIiIiI6MekqqoKsbGxPn+uid6hAPLK6XSiuLgYMTEx0DTtfI/jU2VlJVJTU/Htt9/Cbreft4xgmiVYMoJplmDJCKZZgiUjmGYJloxgmoX7c24ygmmWYMkIplmCJSOYZgmWjGCaJVgygmmWYMkIplmCJeNs5pxrIoKqqiokJyfDZPL9THzeox8gk8mElJSU8z2GMrvdfsaFPRsZwTRLsGQE0yzBkhFMswRLRjDNEiwZwTQL9+fcZATTLMGSEUyzBEtGMM0SLBnBNEuwZATTLMGSEUyzBEvG2cw5l/zdk9+GL8ZHREREREREFEK40CciIiIiIiIKIVzohzir1YoHH3wQVqv1vGYE0yzBkhFMswRLRjDNEiwZwTRLsGQE0yzcn3OTEUyzBEtGMM0SLBnBNEuwZATTLMGSEUyzBEtGMM0SLBlnMydY8MX4iIiIiIiIiEII79EnIiIiIiIiCiFc6BMRERERERGFEC70iYiIiIiIiEIIF/pEREREREREIYQL/RD16aefIisrC8nJydA0De+9957hjGXLlmHYsGGIiYlBYmIirr32Whw6dMhQxvPPP4/BgwfDbrfDbrcjIyMDH374oeFZ2lu+fDk0TcP8+fMNbffQQw9B0zS3jwEDBhj+/UVFRbjpppvQpUsXREREYNCgQcjNzVXevkePHh3m0DQNc+bMMTSHw+HAkiVL0LNnT0RERKB3795YunQpjL6+ZlVVFebPn4/09HRERERgxIgR2LVrl8/z63VLRPDAAw+gW7duiIiIwLhx41BQUGAo491330VmZia6dOkCTdOwe/duw7M0NTVhwYIFGDRoEKKiopCcnIzp06ejuLjY0CwPPfQQBgwYgKioKHTu3Bnjxo3Dzp07DWW0N2vWLGiahr/85S+GMm655ZYOnZkwYYKhv0mbgwcPYtKkSYiNjUVUVBSGDRuGY8eOKWd466+maXj88ceVM6qrqzF37lykpKQgIiICF198MV544QVD+1JaWopbbrkFycnJiIyMxIQJEzp0TeVyrL6+HnPmzEGXLl0QHR2NX/7ylygtLTWU8eKLL+LKK6+E3W6HpmkoLy/v8HfXyzl16hTuuusu9O/fHxEREUhLS8Nvf/tbVFRUGJrljjvuQO/evREREYGEhARMnjwZ//73vw1ltBERXHPNNV7//io5V155ZYeezJo1y/AsOTk5uOqqqxAVFQW73Y7Ro0ejrq5OKePrr7/22dl33nlHeY7jx49j2rRp6Nq1K6KiojB06FD84x//MLQvhw8fxnXXXYeEhATY7XZkZ2e7dQ3Qv97U66tKhkpf/WWodFV1Fr2+qmS08ddXvQy9rqrO4a+rKjkqfVWZRa+vKhkqffXk7TaaSmf1MlQ6q5djpLf+ZlHprF5GG3+d1ctQ6azKHCqd9Zej2lm9WVQ6q5eh0lm99YDRvgYzLvRDVE1NDYYMGYJnn3024Izt27djzpw5+Pzzz7F582Y0NTUhMzMTNTU1yhkpKSlYvnw5vvzyS+Tm5uKqq67C5MmTceDAgYBm2rVrF1atWoXBgwcHtP3AgQNRUlLi+vjss88MbX/69GmMHDkSFosFH374If7v//4PK1asQOfOnZUzdu3a5TbD5s2bAQDXX3+9oVkeffRRPP/881i5ciUOHjyIRx99FI899hieeeYZQzm33347Nm/ejNdeew379u1DZmYmxo0bh6KiIq/n1+vWY489hqeffhovvPACdu7ciaioKIwfPx719fXKGTU1NRg1ahQeffRRv7P7y6mtrcVXX32FJUuW4KuvvsK7776LQ4cOYdKkSYb2p1+/fli5ciX27duHzz77DD169EBmZiZOnDihnNFm3bp1+Pzzz5GcnGxoX9pMmDDBrTtr1641nHP48GGMGjUKAwYMwLZt27B3714sWbIENptNOaP9DCUlJXjllVegaRp++ctfKmf87ne/w8aNG/H666/j4MGDmD9/PubOnYv169crZYgIrr32Whw5cgTvv/8+8vLykJ6ejnHjxrldRqlcjt1999344IMP8M4772D79u0oLi7GlClTDGXU1tZiwoQJWLx4sdf9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LFiwAKmpqbBarejTpw9efvllt/N8+eWXuPzyyxEZGYkRI0bg0KFD53bHiYiILjBc6BMREZGSZcuWYc2aNXjhhRdw4MAB3H333bjpppuwfft213nuuecerFixArt27UJCQgKysrLQ1NQEoGWBnp2djV/96lfYt28fHnroISxZsgSvvvqqa/vp06dj7dq1ePrpp3Hw4EGsWrUK0dHRbnPcd999WLFiBXJzcxEWFoYZM2b8R/afiIjoQqGJiJzvIYiIiCi4NTQ0IC4uDlu2bEFGRobr9Ntvvx21tbWYOXMmfvazn+HNN9/E1KlTAQCnTp1CSkoKXn31VWRnZ+PGG2/EiRMn8NFHH7m2v/fee7FhwwYcOHAA+fn56N+/PzZv3oxx48Z1mGHbtm342c9+hi1btmDs2LEAgH/961+YOHEi6urqYLPZzvFfgYiI6MLAe/SJiIhIV2FhIWpra3H11VcjOjra9bFmzRocPnzYdb72BwHi4uLQv39/HDx4EABw8OBBjBw50i135MiRKCgogMPhwO7du2E2mzFmzBi/swwePNj1dbdu3QAAZWVlZ7yPREREoSLsfA9AREREwa+6uhoAsGHDBnTv3t3tZ1ar1W2xH6iIiAil81ksFtfXmqYBaHn9ACIiImrBe/SJiIhI18UXXwyr1Ypjx46hT58+bh+pqamu833++eeur0+fPo38/HxcdNFFAICLLroIO3bscMvdsWMH+vXrB7PZjEGDBsHpdLo955+IiIiM4z36REREpCsmJgZ/+MMfcPfdd8PpdGLUqFGoqKjAjh07YLfbkZ6eDgB4+OGH0aVLFyQlJeG+++5DfHw8rr32WgDA73//ewwbNgxLly7F1KlTkZOTg5UrV+K5554DAPTo0QM333wzZsyYgaeffhpDhgzBN998g7KyMmRnZ5+vXSciIrrgcKFPRERESpYuXYqEhAQsW7YMR44cQadOnTB06FAsXrzY9dD55cuXY968eSgoKMCll16KDz74AOHh4QCAoUOH4u2338YDDzyApUuXolu3bnj44Ydxyy23uH7H888/j8WLF+POO+/EyZMnkZaWhsWLF5+P3SUiIrpg8VX3iYiI6Iy1vSL+6dOn0alTp/M9DhER0Y8an6NPREREREREFEK40CciIiIiIiIKIXzoPhEREREREVEI4T36RERERERERCGEC30iIiIiIiKiEMKFPhEREREREVEI4UKfiIiIiIiIKIRwoU9EREREREQUQrjQJyIiIiIiIgohXOgTERERERERhRAu9ImIiIiIiIhCyP8DgD8prLo841sAAAAASUVORK5CYII=\n"
},
"metadata": {}
}
],
"source": [
"plt.figure(figsize=(12, 8))\n",
"\n",
"plt.plot(history['train']['loss'])\n",
"plt.plot(history['val']['loss'])\n",
"plt.title('model loss')\n",
"plt.ylabel('val')\n",
"plt.xlabel('epoch')\n",
"plt.xticks(np.arange(len(history['train']['loss'])), np.arange(1, len(history['train']['loss']) + 1))\n",
"plt.legend(['train', 'val'], loc='upper right')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"id": "149EM4q-36S2",
"outputId": "b11e27f9-7cb1-4690-8468-f41a9dbfe8f4",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 718
}
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1200x800 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAK9CAYAAABYVS0qAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACf+UlEQVR4nOzdd3hb5f3+8VuSLXnL204cx9mLhITMhl1GU0YYZbbQDFoopYyS8m2hrJaOdFCaFmih/ZEWCrQpYZSW0ULYNCVAIJPs4cSJVxwvecnS+f1xJNmOR2zHtnTk9+u6zqWjoyPpsaE0d57n+XxshmEYAgAAAAAAYWcP9wAAAAAAAICJkA4AAAAAQIQgpAMAAAAAECEI6QAAAAAARAhCOgAAAAAAEYKQDgAAAABAhCCkAwAAAAAQIQjpAAAAAABECEI6AAAAAAARgpAOAIBF7NmzRzabTX/+8597/N633npLNptNb731Vp+PCwAA9B1COgAAAAAAEYKQDgAAAABAhCCkAwAAy/J4POEeAgAAfYqQDgBAN/3gBz+QzWbTtm3bdPXVV8vtdisrK0t33323DMPQvn37dOGFFyolJUW5ubn61a9+1e4zSktL9bWvfU05OTmKi4vT1KlT9fjjj7e7r7KyUosWLZLb7VZqaqoWLlyoysrKDse1ZcsWXXrppUpPT1dcXJxmzpypF198sVc/4969e3XDDTdo/Pjxio+PV0ZGhi677DLt2bOnwzHeeuutGjFihFwul4YNG6YFCxaovLw8dE9DQ4N+8IMfaNy4cYqLi9OQIUP0pS99STt37pTU+V75jvbfL1q0SElJSdq5c6fOPfdcJScn66qrrpIkvfvuu7rssss0fPhwuVwu5efn69Zbb1V9fX2Hv6/LL79cWVlZio+P1/jx43XnnXdKkt58803ZbDY9//zz7d739NNPy2azafXq1T39tQIA0G0x4R4AAABWc8UVV2jixIn62c9+ppdeekk//vGPlZ6erkcffVRnnHGGfv7zn+upp57SbbfdplmzZunUU0+VJNXX1+v000/Xjh07dOONN2rkyJF65plntGjRIlVWVuqWW26RJBmGoQsvvFDvvfeerr/+ek2cOFHPP/+8Fi5c2G4smzZt0kknnaS8vDzdfvvtSkxM1N///ndddNFFevbZZ3XxxRf36Gf78MMP9d///ldXXnmlhg0bpj179uj3v/+9Tj/9dG3evFkJCQmSpNraWp1yyin67LPPdM0112j69OkqLy/Xiy++qP379yszM1M+n0/nn3++Vq1apSuvvFK33HKLampq9Nprr2njxo0aPXp0j3/3zc3Nmjdvnk4++WTdf//9ofE888wzqqur0ze/+U1lZGRozZo1evDBB7V//34988wzofevX79ep5xyimJjY3XddddpxIgR2rlzp/75z3/qJz/5iU4//XTl5+frqaeeave7e+qppzR69GjNnTu3x+MGAKDbDAAA0C333nuvIcm47rrrQteam5uNYcOGGTabzfjZz34Wun748GEjPj7eWLhwYejasmXLDEnGk08+GbrW1NRkzJ0710hKSjKqq6sNwzCMF154wZBk/OIXv2jzPaeccoohyfjTn/4Uun7mmWcaU6ZMMRoaGkLX/H6/ceKJJxpjx44NXXvzzTcNScabb77Z5c9YV1fX7trq1asNScYTTzwRunbPPfcYkoznnnuu3f1+v98wDMNYvny5Icl44IEHOr2ns3Ht3r273c+6cOFCQ5Jx++23d2vcS5cuNWw2m7F3797QtVNPPdVITk5uc631eAzDMO644w7D5XIZlZWVoWulpaVGTEyMce+997b7HgAA+hLL3QEA6KGvf/3roXOHw6GZM2fKMAx97WtfC11PTU3V+PHjtWvXrtC1l19+Wbm5ufryl78cuhYbG6ubb75ZtbW1evvtt0P3xcTE6Jvf/Gab77npppvajKOiokJvvPGGLr/8ctXU1Ki8vFzl5eU6dOiQ5s2bp+3bt6uoqKhHP1t8fHzo3Ov16tChQxozZoxSU1O1du3a0GvPPvuspk6d2uFMvc1mC92TmZnZbtyt7+mN1r+Xjsbt8XhUXl6uE088UYZh6JNPPpEklZWV6Z133tE111yj4cOHdzqeBQsWqLGxUStXrgxdW7FihZqbm3X11Vf3etwAAHQHIR0AgB46MuC53W7FxcUpMzOz3fXDhw+Hnu/du1djx46V3d72/34nTpwYej34OGTIECUlJbW5b/z48W2e79ixQ4Zh6O6771ZWVlab495775Vk7oHvifr6et1zzz3Kz8+Xy+VSZmamsrKyVFlZqaqqqtB9O3fu1OTJk7v8rJ07d2r8+PGKiem73XUxMTEaNmxYu+uFhYVatGiR0tPTlZSUpKysLJ122mmSFBp38C9MjjbuCRMmaNasWXrqqadC15566il97nOf05gxY/rqRwEAoEPsSQcAoIccDke3rknm/vL+4vf7JUm33Xab5s2b1+E9PQ2VN910k/70pz/p29/+tubOnSu32y2bzaYrr7wy9H19qbMZdZ/P1+F1l8vV7i85fD6fzj77bFVUVOh73/ueJkyYoMTERBUVFWnRokW9GveCBQt0yy23aP/+/WpsbNT//vc/PfTQQz3+HAAAeoqQDgDAACkoKND69evl9/vbBM0tW7aEXg8+rlq1SrW1tW1m07du3drm80aNGiXJXDJ/1lln9ckYV65cqYULF7apTN/Q0NCusvzo0aO1cePGLj9r9OjR+uCDD+T1ehUbG9vhPWlpaZLU7vODqwq6Y8OGDdq2bZsef/xxLViwIHT9tddea3Nf8Pd1tHFL0pVXXqklS5bor3/9q+rr6xUbG6srrrii22MCAKC3WO4OAMAAOffcc1VcXKwVK1aErjU3N+vBBx9UUlJSaHn2ueeeq+bmZv3+978P3efz+fTggw+2+bzs7GydfvrpevTRR3Xw4MF231dWVtbjMTocjnaz/w8++GC7me1LLrlE69at67BVWfD9l1xyicrLyzucgQ7eU1BQIIfDoXfeeafN67/73e96NObWnxk8/81vftPmvqysLJ166qlavny5CgsLOxxPUGZmps455xw9+eSTeuqpp/TFL36x3XYGAAD6AzPpAAAMkOuuu06PPvqoFi1apI8//lgjRozQypUr9f7772vZsmVKTk6WJM2fP18nnXSSbr/9du3Zs0eTJk3Sc88912ZPeNDDDz+sk08+WVOmTNG1116rUaNGqaSkRKtXr9b+/fu1bt26Ho3x/PPP11/+8he53W5NmjRJq1ev1uuvv66MjIw29/3f//2fVq5cqcsuu0zXXHONZsyYoYqKCr344ot65JFHNHXqVC1YsEBPPPGElixZojVr1uiUU06Rx+PR66+/rhtuuEEXXnih3G63LrvsMj344IOy2WwaPXq0/vWvf/VoL/2ECRM0evRo3XbbbSoqKlJKSoqeffbZNvUAgn7729/q5JNP1vTp03Xddddp5MiR2rNnj1566SV9+umnbe5dsGCBLr30UknSj370ox79HgEA6C1COgAAAyQ+Pl5vvfWWbr/9dj3++OOqrq7W+PHj9ac//UmLFi0K3We32/Xiiy/q29/+tp588knZbDZdcMEF+tWvfqUTTjihzWdOmjRJH330kX74wx/qz3/+sw4dOqTs7GydcMIJuueee3o8xt/85jdyOBx66qmn1NDQoJNOOkmvv/56uz3vSUlJevfdd3Xvvffq+eef1+OPP67s7GydeeaZocJuDodDL7/8sn7yk5/o6aef1rPPPquMjIzQXyoEPfjgg/J6vXrkkUfkcrl0+eWX65e//OVRC7wFxcbG6p///KduvvlmLV26VHFxcbr44ot14403aurUqW3unTp1qv73v//p7rvv1u9//3s1NDSooKBAl19+ebvPnT9/vtLS0uT3+3XBBRf09FcJAECv2Iz+rGgDAABgUc3NzRo6dKjmz5+vxx57LNzDAQAMEuxJBwAA6MALL7ygsrKyNsXoAADob8ykAwAAtPLBBx9o/fr1+tGPfqTMzEytXbs23EMCAAwizKQDAAC08vvf/17f/OY3lZ2drSeeeCLcwwEADDLMpAMAAAAAECGYSQcAAAAAIEIQ0gEAAAAAiBCDrk+63+/XgQMHlJycLJvNFu7hAAAAAACinGEYqqmp0dChQ2W3dz1XPuhC+oEDB5Sfnx/uYQAAAAAABpl9+/Zp2LBhXd4z6EJ6cnKyJPOXk5KSEubRAAAAAACiXXV1tfLz80N5tCuDLqQHl7inpKQQ0gEAAAAAA6Y7W64pHAcAAAAAQIQgpAMAAAAAECEI6QAAAAAARAhCOgAAAAAAEYKQDgAAAABAhCCkAwAAAAAQIQjpAAAAAABECEI6AAAAAAARgpAOAAAAAECEIKQDAAAAABAhCOkAAAAAAEQIQjoAAAAAABGCkA4AAAAAQIQgpAMAAAAAECEI6QAAAAAARAhCOgAAAAAAEYKQDgAAAABAhCCkAwAAAAAQIQjpAAAAAABECEI6AAAAAAARgpAOAAAAAECEIKQDAAAAABAhwh7SH374YY0YMUJxcXGaM2eO1qxZ0+m9Xq9X9913n0aPHq24uDhNnTpVr7766gCOFgAAAACA/hPWkL5ixQotWbJE9957r9auXaupU6dq3rx5Ki0t7fD+u+66S48++qgefPBBbd68Wddff70uvvhiffLJJwM8cgAAAADAQPP7DVXVebWn3KNPCg/rzS2leuGTonAPq0/ZDMMwwvXlc+bM0axZs/TQQw9Jkvx+v/Lz83XTTTfp9ttvb3f/0KFDdeedd+pb3/pW6Noll1yi+Ph4Pfnkk936zurqarndblVVVSklJaVvfhAAAAAAQLcZhqHGZr+q6r06XNekwx6vKuuadLjOfB48b3vNfO7vIMFu+dEXFRfrGPgfpJt6kkNjBmhM7TQ1Nenjjz/WHXfcEbpmt9t11llnafXq1R2+p7GxUXFxcW2uxcfH67333uv0exobG9XY2Bh6Xl1dfYwjBwAAAABrafD6dLCqQQcq61VZ55XdJtntNjlsNjnsttC53a521xx2m+yBR4ddsttsstls8jQ2y9PYrNrA4Wn0qbbRq9pGn2ob2r5WG7i3pqFZnqZm1TY0q7mjtN1NCU6H0hKcSk2IVVqCU41ef0SH9J4IW0gvLy+Xz+dTTk5Om+s5OTnasmVLh++ZN2+eHnjgAZ166qkaPXq0Vq1apeeee04+n6/T71m6dKl++MMf9unYAQAAACBSGIahw3VeFR2uV1FlvQ4EjqLQY4PKaxuP/kFh4LDblBofGwrbqQlOpSXEKi2xJYCnJcQGrpvXUhNi5YqJjkDekbCF9N74zW9+o2uvvVYTJkyQzWbT6NGjtXjxYi1fvrzT99xxxx1asmRJ6Hl1dbXy8/MHYrgAAAAAcMyafX4drGrQ/g5CePB5g9d/1M+Jj3VoaGqcMpJcMgxDPr8hn2Hu8/b5DflD1wzzmmHI71e7az6/IRlSvNOhpLgYJbnMI9EVo+TA45HXg+fmdYeSXLFKdDmU6IyR3W4bgN+idYQtpGdmZsrhcKikpKTN9ZKSEuXm5nb4nqysLL3wwgtqaGjQoUOHNHToUN1+++0aNWpUp9/jcrnkcrn6dOwAAAAA0Fd8fkOlNWYI31dR1/bxcJ0OVjWYwfgospNdGpoar7zUeA1NjWt1bj6mJsTKZiMQR7qwhXSn06kZM2Zo1apVuuiiiySZheNWrVqlG2+8scv3xsXFKS8vT16vV88++6wuv/zyARgxAAAAgMHGMAx5mnyh2WNDRuC6ZAReN0LPAxelNtcMQ/IbhkqqG7X/sBm+9x+u074K87Gosl5eX9ch3OmwKy/NDNuh4J1mhvG81HjluuOiegn4YBLW5e5LlizRwoULNXPmTM2ePVvLli2Tx+PR4sWLJUkLFixQXl6eli5dKkn64IMPVFRUpGnTpqmoqEg/+MEP5Pf79d3vfjecPwYAAAAAC/I0NqukukEl1Y0qrWkInZdUN6i0ulHF1ea1xuajLyU/Vg67TUNT45SflqBhafHmY3rgMS1B2ckuloUPEmEN6VdccYXKysp0zz33qLi4WNOmTdOrr74aKiZXWFgou72llXtDQ4Puuusu7dq1S0lJSTr33HP1l7/8RampqWH6CQAAAAAMNL/fUJPPbx7NrY7A88ZWz2sbAkG8xgzeJYHgXVrdqJrG5j4fm80m2aTQsnJb6JpNmUlODQuE72FpCcpPi1d+uhnKc1PiFOOwd/nZGBzC2ic9HOiTDgAAAESe6gavthXXaEtxjbYW12hrSY0O1TZ2GMSPtjS8J5JcMcpOcSknOU45KS7lpMQpO6XlPCc5TpnJTsXY7aEALpkhPBTA2eeNo7BEn3QAAAAAg09js0+7yjzaGgrk1dpaXKMDVQ29/kynwy5nTOA44jzR5TBDd5sQHgjgKXFKchGJEFn4NxIAAAAY5AzDUFW9V6U1jarwNCnGbpMzxq5YR0vYdQWCb/BajN3W5Qyy32+oqLI+FMSDM+S7yz1q7qRS+RB3nMbnJmt8TrLG5yZriDtezpiW7w4G8NDzwDVmshFNCOkAAABAlPL7DVXUNak0UBgt9FjTGDovqW5UWW2jmnpYHM1mC8xgt565DoT4GLtN+yrq5Gnydfje5LgYTchN1ricZE3ITdb43BSNz0mWOyG2L35swNII6QAAAIDFNHh9Kq9tVFlN4AicB8N3WSCIl9U0djpr3RF3fKwyEp3yGYa8gf3frYuwta5mZRhSY6BImxo7/jynw67R2UlHBPJkDXHHMfsNdIKQDgAAAEQAn9/QIU+r4N0qfAePYDCvbuhZVfKMRKeykgP7sZNdyk5xKTu57XlWsktxsV332W5uXVHdd0Qxt2ZDTT6fGpvNwm5D3XEakZmoWCqWAz1CSAcAAAD6kWEYqmlsVklVg4qrG1RcZbYAM88bQ+eHahvVg0lvOR12ZSW7lJnsUlaSS1nJ5pEdOIIF0jKTXH0WlGMcdsU47Epw9snHAegAIR0AAADoJb/fUFltow5WtQ3frQN5cXWD6jrZm30km03KSGwJ3K3Dd5vnSS6lxMewZByIQoR0AAAAoBPBquf7Kuq173Cd9lXUBR7N5/sP13e74FpKXIxy3Wbbr9yUuHbn2ckupSc6FcPycGBQI6QDAABgUKtratb+w/VmAK+o077g+eF67a+oU01j1/u/HXZbaHl5MHDnus3znFAYdynByR+9ARwd/6UAAADAoOD3G9p9yKONRVXafKBamw6YvbvLazspTd5KVrJL+Wnxyk9PUH5agvLT4wOPCRrijmP2G0CfIaQDAAAg6jQ1+7WtpCYQxqu08UC1PjtY3ene8JS4mLYBvNX5sLSEo1Y9B4C+QkgHAACApdU1Neuzg+bM+MaiKm06UK1tJTXy+tqXSo+LtWvSkBQdN9St44amaNLQFBVkJModHxuGkQNAe4R0AAAAWILX59feQ3XaUVqrnWW12lpco00HqrSr3COjg9Zl7vhYHTc0RccNTdHkPDOUj8xMksNORXQAkYuQDgAAgIhS29isnYEgvqPV495DdWrupJF4ToorNDsefByWFk+LMgCWQ0gHAADAgDMMQ2U1jW1C+M4yj3aU1qq4uqHT9yU4HRqdlaQx2eYRDOVZya4BHD0A9B9COgAAAPqNYRgqq23UtuJabS2p0faSGm0tqdGO0lrVNHTe2iwr2aXRWYkak50UCuWjs5I0xB3H7DiAqEZIBwAAQJ847GnStpKawGGG8m0lNaqs83Z4v90mDU9PCAXw0YHZ8dGZSXInUMgNwOBESAcAAECP1DR4tb20VtuKzTC+LTA7XlbTcb9xu00akZGosTlJGp+TrHG5yRqbnawRmQlyxdDaDABaI6QDAABADV6fymsbVeFp0qHappZzT1Ob62U1jV3uGc9Ljdf43GSNy0nW+Nwkjc1O1pjsJPqMA0A3EdIBAACikGEYqqzzqqy2UeU1jSqrbVRZTaMOeZpUUdukQ55GlQceK2qb5Gny9ejzs5NdoTA+LidJ43KSNTYnWUku/ngJAMeC/4oCAABYhGEYqmlsVlmNGbjLa9s+mudNgTDeKK+v43ZlnYl12JSR6FJGklPpiU5lJrmUkehUepJTma2uj8xMVGqCs59+SgAY3AjpAAAAEcLvNyuhF1bUqfBQnfYdrlNhRZ32VdTpQGWDymob1dTs79FnuuNjlZXsUmaSGbqDwTsjyQzdrc+TXTFUTgeAMCOkAwAADKDaxmbtq2gJ320eD9d3K4QnuWJCwTsr2aWsQPg2r5mPWclm8KYwGwBYCyEdAACgj/n9hvYdrtPmA9X67GC1dpV7tO9wvfZV1KnC09Tle+02aWhqvIanJyg/LUHDMxKUn56gvNQ4ZSfHKTPJpXgnwRsAohUhHQAA4Bg0eH3aWlyjzw5Wa/PBam0+UK0txTWqbWzu9D1pCbEanp6gYekJLWE8cD4kNU6xDvsA/gQAgEhCSAcAAOimsprGNmH8s4PV2llWK38H9dmcMXaNz0nWxCFmC7Lh6YlmIE+PV3Jc7MAPHgBgCYR0AACAI9Q1NWtXmUc7y2r12cGWWfKymsYO709PdOq4oSmaOCRFk4akaNLQFI3KTFQMM+IAgB4ipAMAgEHJ7zdUVFmvXeUe7Sqr1a4yj3aVm48Hqxo6fI/NJo3MTGwTxicNSVF2souq6ACAPkFIBwAAUa26wWsG8COC+O5yjxq7qKSenujUqMxEjc9N1qTALPmE3GQlOPnjEwCg//D/MgAAwPIMw1BJdaN2lNZqe2mNdpTWakdprXaWeVRe2/ESdUlyOuwqyEjQqKxEjcpK0qhM83F0VqJSE5wD+BMAAGAipAMAAMsILlEPBvHtJbXaUVarHSW1qumimnp2sqtNEB+dlaRRWYkalpYgh51l6gCAyEFIBwAAEafZ59feijptL6nVzrJabS+p0fZS87zB2/ESdYfdpoKMBI3NTtLYbLOi+qisRI3MTKSaOgDAMgjpAAAgLIJL1HeV12pPeZ32HPJoV5lHew55tPeQR15fB33NZC5RH5WVqDGtwvjYnCSNyEiUM4Zq6gAAayOkAwCAfmMYhg55mrSn3CzUtrvcEwrjew/Vqd7r6/S9CU6HRmclaWx2ksbkJGlMVpLG5iQrPy2e1mYAgKhFSAcAAMekqdmv4qoGHaiq14HKeu09VBcK47vLPapp6HyvuMNuU35avEZmJmpEprk0PXgMdcfLzn5xAMAgQ0gHAACd8vsNlXsadaCyQQcr61VUWa+DVQ06UFmvA4HH8tpGGR2vTJdk9hYf6g4G8QSNzEzSyMwEjchIVH56gmKZFQcAIISQDgDAIOT3G6qs96rC06hDtU2q8DSp3NOk4qp6HaxsCIXxg1X1ne4Nb80ZY1dearyGuOOUn5agkVmJGpGRqFFZiRqenqC4WMcA/FQAAFgfIR0AgCjQ7PPrcJ1XFZ4mHfI0qsJjBu9gAK/wNKm8tuX64bom+Y+evSVJdpuUkxKnIe44DU2NNw93nIakxoeCeXqiUzYbS9MBADhWhHQAACympsGrTQeqtbGoShuLqrShqEq7yz3dDt2tpcTFKCPJpYxEp9ITncoNBPEh7jgzgKfGKyfZRaE2AAAGCCEdAIAIVlXv1aaiKm08UKUNRdXaVFSlXeWeTu9PS4hVeqJTGYkupSc6lZ7kDAXw1mE8I9GptEQn+8EBAIgwhHQAACJEZV2TNhZVa0NghnzjgSrtPVTX4b1D3XGanOfW5Dy3puS5NXFIijKTnMx4AwBgcYR0AADCoLHZpw37q/TR3sNat69SG4qqtP9wfYf3DkuL15RAIJ+c59bkoSnKSHIN8IgBAMBAIKQDADAADnua9PHew/po72F9tKdC64uq1NTsb3dfQUZCIIibM+THDU1RWqIzDCMGAADhQEgHAKCPGYahvYfqQoH8o72HtaO0tt19mUlOzShI0/ThaZoyzK3jhrrljo8Nw4gBAECkIKQDAHCMvD6/Nh2oNgP5HnO2vLy2sd19o7MSNbMgXTNHpGnmiHSNyEigbRkAAGiDkA4AQA94fX7tKvNoS3G1PjtYo08KD2vd/ko1eNsuXXc67JoyzG0G8oJ0zShIUzrL1gEAwFEQ0gEA6IBhGCqubtCW4hptOVijrcXV2lJco51ltfL62jckT02I1cyCNM0oSNesEWmanOdWXKwjDCMHAABWRkgHAAx6tY3N2lpco63FNdoSCONbi2tUVe/t8P4kV4zG5yZrfG6ypuS5NWtEmkZlJsluZ+k6AAA4NoR0AMCgYRiG9lXUa9OBKm0+aC5X31pSrX0VHbc+c9htGpWZqPG5yZqQm6wJuSkan5usYWnx7CUHAAD9gpAOAIhKzT6/dpZ5tOlAlTYdqDaD+YFqVTc0d3h/TopL43NTNDEwQz4+N1ljspPkimHJOgAAGDiEdACA5dU3+bSluDoQxqu1+UCVthTXqLGDPuROh13jcpN03BC3Jg5J1vjcFE3ITaYXOQAAiAiEdACAJfj8hqrqvTpc16SSqobQ7PimA9XaWVYrf/tabkpyxWjSkBRNGpqi44am6Lihbo3JTpIzxj7wPwAAAEA3ENIBAAPKMAzVNjarss6ryjozdB+ua2rzvLKuSYfrvKqs95rnnqZOl6kHZSY5NWmoOxDGzUBekJ5AMTcAAGAphHQAQL+qbWzWmt2H9P6OQ3p/R7l2lNaquaNp725KdsUoI8mpCbmBMJ5nBvLsZBfF3AAAGEwaa6XC1dKhHdLnvhnu0fQZQjoAoE95fX59uq9S7+8o1/s7yvVJYWWHodwVY1daglOpCbGhx9QEp9ISYludB183n7vjYxXrYKk6AAD9wjAkb51Uf1iqrww8HpYaKttea6iUmuqk7AnSsNnSsFlSck7/j8/bIO1fI+1+xzyKPpb8zZLNIU27SopL6f8xDABCOgDgmBiGoW0ltXovEMo/2HVIniZfm3uGpyfopDGZOmlMhqblpyozyaW4WKqmAwAGAb/PDJI+r2T4Wx2GJOOIa0e83uYxcPibJb/X/Dyft+25rynwXU1HvN4k+QLX/V4z7HYUvusPm6931/Z/t5y7h0vDZkr5gdCeO0WKcR3b787nlYrWBkL529K+NZKvse09aSOkEadITR5COgBg8CqqrA/NlL+/45DKa9v+H2Z6olNzR2fo5DGZOml0poZnJIRppAAAdJNhSA1VUtV+86gOPFYVSTUHWwKvv9kMvMGw3O55q1Dub5bU+y1eYWOPleLTpPjUwGOaFNfqPD5VssdIxeulfR9KpZulqkLz2PSc+RkOpzRkamCmfaYZ3N3DpK62pvl9UvGGlpnyvf+VvJ629yQPkUaeah4jTpHSCvrplxA+hHQAQJcMw9D+w/Vav79K/9tl7ivfVd72/zDjYu2aPTJDJ4/J0EljMjUxN4WCbQCA9gzDnM1t8piHt05qqjWXTnd0LpvkTJRiEyRngvkYm3DEtUTzMSZesnexJcrbIFUXmUcwfFftCwTywLWm2gH7VbSwSTb7EYet43PZJLvDDMCOWDNMO5ySI8Z8tMcecR48nGaoDp7HuDoO3sFrzsSuw/SRGmvMGe/9H7YcdYdazoOScqX8WWZgHzbLDPGVhdLud82Z8j3vmbP7rcWnSyNPCQTz06SMMT0bmwXZDMOw4F/t9F51dbXcbreqqqqUkhIdyyEAoK8YhqHi6gat31+lDfurtL6oShv2V+pwXdulb3abNDU/VSeNztRJYzI1vSBVrhiWrwPAoOP3SbUlUuU+M/BWFgaCb5E5K+31mKE7FMg9kuE7+uf2VijEtwrvfp8Zwj1l3fuMhAxzxjdlmPnozpOSh0qxcWbQbX04Ynv23O5oG7httugMnIYhHd4t7f/IXKK+/0OpZGNgZcFRuFKkghNbZsuzj+v6L18soic5lJl0ABjESmsazDC+v0obiszHI5euS1KM3aYJQ5I1fXiaTh6TqTmjMuSOjw3DiAEAbdQUm0uCC1ebj1X7zdnQhHQzbManB87TA+cZ7c+72jfc3BiYdd7XKoi3CuTVB3q2h7k1hzMwIx4I0x2dywgE/PqWkO+tC8y2B/4CoLm+5TO9gVn4uk6+MzZBSslrCd/u/EAgD5ynDDW/H8fGZpPSR5nH8Zeb15rqpIPrzMJv+z80l8nXFpsrIIZ/rmWmfMhUczXAIDa4f3oAGEQO1TZqQ1HrGfIqFVc3tLvPYbdpbHaSjh/m1pRhqTo+z63xuckUegOAcDMM6fCeQCB/3wzlFbva39dQac5idpczqW2Yj00ww3/VPnOW/GhsDjPkpuabQTc1EHzj0wKhO7HVzHar874KYn6/GdRbB/fWgV5qCebxadE5c20FzgSpYK55SOa/z54yKc597AXmogwhHQCiUFOzX58drNbawsP6eO9hfVJYqaLK+nb32WzS2OwkTclL1fHD3Jqc59akISmKdxLIAUSxhipzFriy0Nw3mzXRrEQdGxfukbXl90tlW6TC/5qBfO9qqebAETfZpNzJ0vATzfCTOV5qrDZ/rroK87G+InBeETg/1HJu+AP7wGvNol8diYk/IoAfcZ48JLwzn3Z7IPwnSsoK3zjQMzablJQd7lFEJEI6AESB0poGrd1bqU8KD2tt4WGt31+lxmZ/u/tGZSXq+LzADPkwM5Anuvi/AgBRprGmJYRXFkqH90qVe1ueH1mYSjL3C+dMlvJmtByZY809xAPF1ywVr2sJ5IX/NVtitRlnrDT0BHPPbsFJZrur+NTefZ/fLzVWtQ/wjbVmz2t3vpQ63FwWz+wzMGAoHAcAFuP1+bXlYI3WBgL52sLD2lfRfpY8NSFW04enafrwVE0fnqbJw9xKiWMfOYAo4Peby7kP7QgE772twnihGTaPJiHDDKBxqWbLp7ry9vc4k6Wh09oG95ShxxZYG6pbWnwFK4sHzw+ub99uKjbBrIJdcJI5U543kz3TgAVROA4Aosih2katLaw0A/lec5a83tu2Mq7NJo3PSdYJwVBekKZRmYmyMfMBwMoMw9wbXbpZKv0s8LhZKt3StlhYR+LTzBCeWtD2Ma3AnCF2JbX9nqp9UtHHgWOtdOATqalG2vOueQQl5QYC+3TzcegJLTPZvmazEFYweFcWtgrhgaOxqutxx7lblq4XnBQoosVfsAKDCTPpABCB9pR79MrGYr2y8aDW72//B7qUuJhAIE/TjII0Tc13K5lZcgDHoskjecrNGWXPIfOx7lD7a/WHzUJjSTnmftKknCPOA4+tQ3B31Fea+69LNrUN5Ecu9w6KiZMyxpqhOxTEW4XwuGP8c56vWSrf2iq4fyyVbO64fVj6KMnnNSudd6e9WHxaoLp4oMBa8MiaYO6Pj4J2UwDaYiYdACxoZ1mtXtlwUC9vKNbmg9VtXhubnaQZBWYon16QqlGZSbLbmSUHcBR+vzmzW1nY0jbLEwjfdeUt557yo89M91RsYvvgHjrPNou3tQ7k1UUdf47NLmWMkbInmv2SsydK2ZOk9JH9u1/cESPlHGce0xeY15rqpOL1bYP74T1tK6zbY9u29mpz5JtVxnv6FxgABhVCOgCE0baSGr284aBe2VCsrSU1oesOu00njs7QuVOG6OxJOcpMojUJgA74fVLNwZYQ3np/dnC/s6+p+5/ncEoJmVJiRuAxs+3zYF/txlqzNVdtaeDxiHNvoBXW4d09awWWMkzKmdQ2kGeOi5yq684Es5/z8M+1XPMckko2mKsL3MOkxGxmwgEcE0I6AAwgwzC0pbjGnDHfWKwdpbWh12IdNp00JlPnTjaDeVqiM4wjBRAxvA1S6SapbFtLdfKqwpb9zv7mrt9vc5gzu6kFgRCZeUQAD4TvxEwzaPZFLYt2IT7w6Ck1z2uKze9qE8gnmPuxrSYxQxp1erhHASCKENIBoJ8ZhqFNB6rNGfONxdpd3lK51+mw69RxmTpn8hCdNTFH7gT2lQODmrfeXAJ+4BPp4Drp4KfmcvCugrg9xgzfqcMl9/CWvdmpw80+1slDB76HtSvJPDJGD+z3AkAUIKQDQD+oqvNq04Eqvb2tTC9vPNimRZozxq7Tx2Xp3ClDdMbEbNqiAYNVU51UstEM4wc+bQnkHRUei0+XcicHCqQVtATw1OFS8pCB7eUNAOhXhHQAOEZlNY3adKBKmw5Ua2NRlTYeqGrXtzwu1q4zJmTrnMlD9PkJ2Upy8Z9fwBL8gcBssx/bMvAmj1S80QziwUBetrXjQJ6QafbmHjKt5dE9rG+WoQMAIh5/SgSAbjIMQweqGrSpqEobD1QHHqtUUt3Y4f356fE6IT9NX5ycq9PHZynByX9ygQFhGFLxBrPydpPHrFrubZCaGwIFzRpaXevsscFceu73tv1sm12SLRDaOzpsgaPVNdnMvdiGv/1YE7PbB/KUoQRyABjE+BMjAHTA7ze0t6JOG4vMGfJNB6q0sahKh+u87e612aRRmYmanOfW5KFuHZeXouOGuNlfDgyk+kpp15vS9telHa+bbcf6QzBod6cX9pGSco8I5FPNpeoEcgBAK4R0AGjF6/Prbx/u04Ortqu0pv0MeYzdprE5yZo8NEWT89w6bmiKJg5JUSLL14GBFZwt3/GaGcz3fdA2OMcmSMPnmlXLY+PM5zFxUmx8zx5j4swQbRhmQA8eOuK54W91TwevJWVLyblh+3UBAKyDP1UCgMyl7C9vKNYv/71Few7VSTILvE0ckqLJQ1N03FC3JuelaFxOsuJiKdCEKNXcJDXVBo5An+smj3neVGsuFW/ytBzeupZ7Wz93JUtpI6W0EVL6yJbz+NRjG9/RZsszx0tjz5bGnCUVnCjFuI7t+wAACANCOoBB7787y/XzV7Zo3f4qSVJGolM3nzlWV87OlyuGQI4o1two7Vsj7X5b2vW2uYe7N8u4O7L7nfbX4tPMsJ42MhDeW50nD5Xs9rb3d2e2fORp0tizpDFnS2kFfTN2AADCiJAOYNDafKBaP391i97eViZJSnA6dN2po/T1U0ZRfR0Dw1svVe2XfE1S+ihziXV/8vvMquK73jaDeeH/zAJpR3K4JGeC5Ewyg7AzseXo8HlS4P7A8/pK6fBu6fAeqWK3ee4pk+oPm8eBTzr4TqfZWiw4+95U18ls+Thp7BeYLQcARC3+FApg0NlXUacHXtumFz4tkmGY+8yvmjNcN54xVlnJ/IEffaipTqraJ1UWdnx4SlvdbDP7XmeOCxxjW84Ts3pXXMwwzDZfwZnyPe9JjVVt70nMlkaeKo06TRpxiuTOlxz98MeDxloztB/eY4b2it0t55WF5l9UHNpuHq0xWw4AGGQI6QAGjQpPkx56Y4ee/N9eNfnMCs3zpw7Vd84epxGZiWEeHSzJ22AGzcpCqXKv+dg6lHvKjv4ZziTJ7pAaqlret+P1tvfEuc2wnjG2bXhPHyk5jugiUFnYMlO++x2ptqTt664UacTJZvAddZqUNWFgqou7kqTcyeZxJF+zVF3UdvZdhjTqdKngJGbLAQCDCiEdQNSra2rW8vd265G3d6m2sVmSdPKYTH3vixM0ZZg7zKODJdWWSf97WFrz/6Smmq7vdSabs7+pw81Z6tThbY/4NPM+T7k5i1y+TSoPPm6TDu81A/z+D82jNXuMuac7c5xZlG3vf82g21pMnDT8c+Zs+cjTzbZf/TFTfiwcMebviFlyAAAI6QCil9fn198/2qdlr29XWaCd2nFDU3T7ORN0ytisMI8OllRVJP33t9LHj0vN9eY1V4q5l7pN+G4VxuNSuzdTnZRlHgUntr3ubZAqdrUP7+XbzerrRy4RtzmkvBktS9iHzTZbkAEAAEsgpAOIGAcq6/XB7kOKddgVH+tQfKxDcU5H6DzB2fI81mHv9HMMw9ArG4t1/7+3ale5R5I0PD1Bt80br/OnDJHdPgBLe9F/6g9LDdVmAB6IZdqSdGin9P4y6dO/Sn6veS1vhnTKbdK4L7avSt6XYuOknEnm0ZphSNUHArPv26XaUnNMBSdKcSn9Nx4AANCvCOkAwm5nWa0eeWunnv+kSM1+o1vvibHb2oT4BKdDcYEwf7iuSVuKzSXIwXZqX549XM6YfgxS6DvNjVLlvsBe7z2B4mJ7A88DS78lyT1cmnCeeQyf2z9LuEs2S+89IG18VjLMOgYacYp0ynfM/dID9ZcEHbHZJHeeeYw6PXzjAAAAfcpmGEb3/kQcJaqrq+V2u1VVVaWUFGYagHDaWFSl3721Q69sLFbwv0THD3MrPtahBq9P9cGjKXB4fepmhleC06FrTxmla0+lnVrE8fvNYmbB0H1kCK8+IOko/6DtMZK/ueV5fJo07hwzsI8+w2wHdiyK1krv/kra8q+Wa2O/YM6cD59zbJ8NAAAGnZ7kUP7kCmBAGYahNbsr9PBbO/XOtpbK12dNzNENnx+t6cPTunxvk8+vhiZ/2wDf+tHrk8/v18ljsminFm7B5dilm6WSjeasdMkm6dAOydfY9XtjE81+2WmBvtnB/tnBAmyySbvelLa8JG19RaqvkNY9bR4xcWZQn3CeuRQ9MbP7Y97zvvTu/dLONwIXbNKkC8yZ8yFTe/VrAAAA6Imwz6Q//PDD+uUvf6ni4mJNnTpVDz74oGbPnt3p/cuWLdPvf/97FRYWKjMzU5deeqmWLl2quLjuFcVhJh0ID8Mw9ObWUv3uzZ36aO9hSZLdZrZA++bpozUhl/89WlpjjVT6mRnCSzYFgvkmqaGy4/ttDsk9rIMQHjgSMrq/lNzXLO37nxnYt/zLbEEW+h67uRR+wnnS+HPNlmVHMgyz5dm7v5IKV7eM7/jLpZNvlbLGd/vXAAAA0JGe5NCwhvQVK1ZowYIFeuSRRzRnzhwtW7ZMzzzzjLZu3ars7Ox29z/99NO65pprtHz5cp144onatm2bFi1apCuvvFIPPPBAt76TkA4MLJ/f0EsbDur3b+3UZwerJUlOh12Xzhymb5w6SgUZ9Ce3FF+zWWm8ZGMgiAdmySv3dny/zWH29c45TsqeJOVMlrLGma3Ijuzv3RcMw/zLgWBgL17f9vWcyS372HMmm/e8+yvp4DrzdYdTOuFq6aRbzL8sAAAA6AOWCelz5szRrFmz9NBDD0mS/H6/8vPzddNNN+n2229vd/+NN96ozz77TKtWrQpd+853vqMPPvhA7733Xre+k5AODIzGZp+eX1ukR97eqT2H6iRJiU6Hrvpcgb528kjlpNASyjLKd0ifvWguKz+4rvOl6slDAkH8uJZQnjVeignjtoPKQmnLy9LWl8yl7Iav5bXYRLOFmSTFJkgzr5Hm3iilDAnPWAEAQNSyxJ70pqYmffzxx7rjjjtC1+x2u8466yytXr26w/eceOKJevLJJ7VmzRrNnj1bu3bt0ssvv6yvfvWrnX5PY2OjGhtb/kBZXV3ddz8EgHY8jc3665pC/fHdXSqpNv+3l5oQq8UnjtTCEwuUmuAM8wgtxDDMUFyyUcqdYs782h0D873F66XP/iV99k+p7LO2r8cmSNkTA0H8uJZQnpDe/2PrqdTh0ueuN4+6Cmn7f8zZ8x2rzIDucktzrpPmfFNKzAj3aAEAAMIX0svLy+Xz+ZSTk9Pmek5OjrZs2dLhe77yla+ovLxcJ598sgzDUHNzs66//np9//vf7/R7li5dqh/+8Id9OnYA7VXVefXn/+7Rn/67W5V1Zh/pnBSXrj1llL48e7gSqbDefWVbpQ0rzbZfFTtbrjuTpfzZUsFcafiJUt50KTa+b77T75f2rzFD+Wcvtt3XbY+RRp4qTZwvjTxNShvZv33B+0tCujT1SvPw1pvL4jPHSnHucI8MAAAgxFJ/an7rrbf005/+VL/73e80Z84c7dixQ7fccot+9KMf6e677+7wPXfccYeWLFkSel5dXa38/PyBGjIwKKz6rETfXblehzxNkqSCjAR987TRunh6nlwxAzDzGw0O75E2PmcG85KNLddj4qQh08z9343V0s5V5iGZ+6eHnmAWRhs+12wNFt95dfx2mpukPe+awXzLS5KntNX3xktjzjSD+bh5PftcK4iNl4bNDPcoAAAA2glbSM/MzJTD4VBJSUmb6yUlJcrNze3wPXfffbe++tWv6utf/7okacqUKfJ4PLruuut05513yt7BzI7L5ZLLRRsmoD/UN/n045c266kPzFnXMdlJuvnMsTp3cq5iHBacaR1oNcXSpufNYL7/w5br9hhp9JnSlEul8edIrmTJ7zNnfgtXS3v/az7Wlkj7PjCP95dJspn7wId/Tio40Qzu7ry239lUZ4b8z/4pbX1Vaqxqec3llsZ/UZpwvhnQnRT1AwAAGGhhC+lOp1MzZszQqlWrdNFFF0kyC8etWrVKN954Y4fvqauraxfEHQ5zli7MneSAQWfD/irdsuIT7SozC299/eSRum3eeMXFMnPepboKczn5hpXSnvckBf/bZZNGniJNvkSaeEH7/d12hzTkePOY8w1z3/jh3dLe1WZgL1xt9h8v3WQeHz1mvs893FwenzvFDPPbX5ea61s+NzHLrHQ+cb404lQphpoBAAAA4RTW5e5LlizRwoULNXPmTM2ePVvLli2Tx+PR4sWLJUkLFixQXl6eli5dKkmaP3++HnjgAZ1wwgmh5e5333235s+fHwrrAPqXz2/o0Xd26oH/bFOz31BOiku/umyaTh6bGe6h9R2/Xzr4qbm83Jlkzig7EwPnST0Pso01ZoXxjc+as9j+5pbXhs02g/lxF0nJHa8i6pDNJqWPMo8TrjKv1ZZKhf9rmW0vXi9VFUrrC6X1K1re6x5uhvKJ88097gNRjA4AAADdEtaQfsUVV6isrEz33HOPiouLNW3aNL366quhYnKFhYVtZs7vuusu2Ww23XXXXSoqKlJWVpbmz5+vn/zkJ+H6EYBBZf/hOi35+zqt2V0hSTpncq5+evEUpSVGweyrYZh7wYMF26r2dX6vPbZVaE+UXEltn7cO9GWfSdv+LTU3tLw/Z4o05RLpuC9JaQV99zMkZUuTLjAPyfzLgf0fmrPtJRvNCuwT50u5x5shHwAAABEnrH3Sw4E+6UDv/OPTIt31wkbVNDQr0enQDy44TpfOGCab1cNexS5pw7PSxpVSWavOEs4kyZ0vNXmkplrzsbP+4N2RPtrcYz75ErN3OAAAAAYNS/RJB2ANVfVe3fOPjfrHpwckSScMT9WyK6apIMPCRcVqigOV1FdKRR+3XHe4pLFnS1MuMyuaH9nezOcNhPZgcK9t9bxVmG9s9VqcW5p0oTRkKrPXAAAAOCpCOoBOfbDrkJb8fZ2KKuvlsNt00xljdOPnx1izcnv9YWnzi2Yw3/2uQgXbbHaz9/eUy6SJ53fdM9sRK8WnmgcAAADQDwjpANppavbr169v0yNv75RhSMPTE7TsymmaPtxivbKbPNLWV8w95ttfk/zelteGzTaD+XEXmXu5AQAAgAhASAfQxo7SWt264lNtKDL7Z182Y5juveA4Jbks8J8Lb71UVWTuLd/8gllR3etpeT1nsrknfPIlfVuwDQAAAOgjFvhTN4CBYBiGnvqgUD9+abMavH6lJsRq6cVTdM6UIeEemsnvM/eSV+2Xqvebj1X7zVBetU+qLpLqDrV/X2qBOWM+5VIpe+LAjxsAAADoAUI6AJXXNup7K9dr1ZZSSdLJYzJ1/2VTleuO658vNAypuVHy1plL0ls/NlSbgbtqXyCA7zefVx+QDN/RP9uZJLmHSaM+bwbzvBkUbAMAAIBlENKBQeywp0l/+d9e/en93Tpc55XTYdd3vzhe15w0UnZ7D4PtjtfNfd/BsO2tbxXA68xl5011gdfqJMPf8wHbY6SUoVLKMDOIu4dJ7jyzVVpKnvk8zk0oBwAAgGUR0oFBaF9FnR57b7dWfLhP9V5zdnp8TrKWXTlNE4d03bexQx8/Lv3z5t4NxuEyW505E6XYBMmV1BK4g0cwlCdlS3ZH774HAAAAsABCOjCIbCyq0h/e2aWXNhyUz2+2IJs0JEXfOG2UzpsypHet1db+pSWgT7pIyp0sxSZKzoRWj4EjeB4M5LEJkoP/DAEAAABB/OkYiHKGYei9HeV69O1dem9Heej6KWMzdd2po3TymEzZers8/JMnpRdvMs/nXC998WcsNQcAAACOASEdiFLNPr9e2nBQj769S5sPVkuSHHabzpsyRNedOkqT89zH9gWfPCX940ZJhjT7GwR0AAAAoA8Q0oEo42ls1ooP9+mx93arqLJekhQf69AVs/L1tZNHKj894di/5NOnpX98S5IhzbpWOufnBHQAAACgDxDSgShRXtuox/+7R0+s3quqeq8kKSPRqUUnjtDVnytQWqKzb75o3d+kF26QGdC/Lp37SwI6AAAA0EcI6YDF7Sn36I/v7tLKj/ersdlsazYiI0FfP2WULp0xTHGxfVgNfd0K6fnrJRnSzK9J595PQAcAAAD6ECEdsKAdpbV6bXOJ/rO5WJ8UVoauT81P1fWnjtIXjsuVo6d9zo9m/d+lFwIBfcZiAjoAAADQDwjpgAX4/YY+2Vep/2wu1mubS7SrzNPm9c+Pz9L1p43W7JHpva/U3pX1z0jPf0My/NKMRdJ5D0j2XrRrAwAAANAlQjoQoRq8Pq3eeSgQzEtVXtsYei3WYdPc0Zk6e1KOzp6Yo1x3XP8NZMNK6fnrzIA+faF03q8J6AAAAEA/IaQDEaSqzqs3t5bqP5uL9fbWMnmafKHXkl0xOn1Ctr4wKUenjc9SSlxs/w9o47PSc9cGAvoC6fxlBHQAAACgHxHSgTA7UFkf2l/+wa4KNfuN0Gs5KS6dPSlHX5iUq8+NypAzZgAD8sbnpGcDAf2Eq6Xzf0NABwAAAPoZIR0IA8Mw9PwnRVr+/m5tLKpu89q4nKRQMJ+S55a9rwvAdcem56Vnvy4ZPmna1dL8BwnoAAAAwAAgpAMDbEdpje58fqM+2F0hySyQPrMgzdxfPilXIzMTwzvATS9IK78WCOhXSRcQ0AEAAICBQkgHBkiD16eH3tihR9/ZKa/PUFysXTedMVZXzMpXZpIr3MMzbf6HtPIaM6BP/TIBHQAAABhghHRgALy1tVT3/GOTCivqJElnTMjWDy84TvnpCWEeWSuf/bMloB9/pXThw5LdEe5RAQAAAIMKIR3oRyXVDbrvX5v10vqDkqTclDj94IJJmndcbv/0M2/N75f8zZLfG3j0BR4Dh8/bcu3gOunFG83z46+QLvodAR0AAAAIA0I60A98fkN/Wb1H9/9nm2obm2W3SYtPGqlbzx6nJFcf/c+ufIf00XLpsxelplrJ19w2hMs46ke0M+Uy6aLfE9ABAACAMCGkA31sw/4qff/5DdpQVCVJmpqfqp9cNFmT89zH/uE+r7TlJemjx6Td7/TuM+yxkj3GPBwxLeeTLpS+8BMCOgAAABBGhHSgj1Q3ePXAf7bpidV75Dek5LgYfe+LE/Tl2cPlONY2apX7pLWPS2ufkGpLzGs2uzR2njRjkZQ+qm3gDh2OwGMwmFMEDgAAAIhkhHTgGBmGoZc2HNR9/9ys0ppGSdKF04bqzvMmKjs5rvcf7PdJO1aZS9q3/1sy/Ob1pBxp+gJp+kIpNb8PfgIAAAAAkYKQDhyDvYc8uucfm/T2tjJJ0sjMRP3owsk6eWxm7z+0tlT65C/Sx3+WKgtbro88TZp5jTThPMkRe2wDBwAAABCRCOlALzQ2+/THd3bpwTd2qLHZL6fDrhs+P1rXnzZacbG92NNtGNKe9wKF4P5pVmSXpLhU6YSrzSXtmWP78kcAAAAAEIEI6UAP+P2G/rn+gH792jbtOWT2PD95TKbuu/A4jcpK6vkH1ldK6/5qhvPybS3Xh82SZn5NOu4iKTa+T8YOAAAAIPIR0oFuMAxD/95Uol+/tk1bS2okSZlJLt19/kRdMHVoz3qe11VI21+Ttr4sbfu31FxvXo9NlI6/3FzSPuT4fvgpAAAAAEQ6QjrQBcMw9M72cv3qP1u1fr/ZUi05LkbfOHWUFp80Uond7Xl+aKe09RXzKFwtGb6W17KPk2ZdI025XIpL6YefAgAAAIBVENKBTqzZXaH7/71Va/ZUSJISnA5dc9JIXXvKKLkTjlK4ze+T9n9kzpZvfUUq39r29ezjpPHnSBPOlYZOl3oyEw8AAAAgahHSgSOs21ep+/+zVe9uL5ckOWPsWvC5Al1/+mhlJrk6f2OTR9r5phnKt70q1ZW3vGaPkQpOksafK43/opQ2on9/CAAAAACWREgHArYUV+uB/2zTfzaXSJJi7DZdMStfN50xVrnuTvqd1xSbgXzrK9Kut6TmhpbXXG5p7NnmjPmYs6T41H7/GQAAAABYGyEdg97uco9+/do2/XP9ARmGZLdJF58wTLecOVbDMxLav8EwpLWPS2ufkIo+bvta6nBp/HlmMC84kX7mAAAAAHqEkI5Bq6iyXr99fbtWrt0vn9+QJJ03ZYhuPXusxmQnd/ymhmrpH9+SPnux5VreTDOUjz9Xyp7I/nIAAAAAvUZIx6BTWtOg3725U09/UKgmn1+SdMaEbC05e5wm57k7f2PxRunvC6SKnZI9VjrjTmnql6Xk3AEaOQAAAIBoR0jHoPLpvkpd/f8+UG1jsyRp7qgM3TZvvGYUpHX9xk+ekl5aYu45d+dLlz0uDZsxACMGAAAAMJgQ0jFo7Cn36Jo/f6jaxmZNzkvR98+ZqBPHZHb9Jm+99Mp3zf3nkjTmbOlLf5AS0vt/wAAAAAAGHUI6BoXy2kYt/NMaVXiaNCXPrb9d9zkluo7yr3/FLnN5e/EGSTbp83dKp3xHstsHZMwAAAAABh9COqKep7FZ1/z5Q+09VKf89HgtXzTr6AH9s39JL9wgNVZJCZnSJf9PGv35gRkwAAAAgEGLkI6o1uzz68an12r9/iqlJcTq8cWzlZXs6vwNPq+06ofSfx80n+d/TrrsT1LK0IEZMAAAAIBBjZCOqGUYhu58fqPe3FqmuFi7Hls0S6Oykjp/Q/VBaeViqXC1+XzujdJZP6DXOQAAAIABQ0hH1PrNqu1a8dE+2W3Sg1+erunDu6jgvutt6dmvSZ4yyZUiXfiwNOmCgRssAAAAAIiQjij1tzWFWvb6dknSjy6arLMn5XR8o98vvfeA9OZPJMMv5UyWLn9Cyhg9gKMFAAAAABMhHVHnzS2luvOFjZKkGz8/RlfNKej4xroK6flvSNv/Yz6fdrV03v1SbPwAjRQAAAAA2iKkI6qs21epG55aK5/f0CXTh+k7XxjX8Y1FH0t/XyRVFUoxcdK590vTvzqgYwUAAACAIxHSETX2lHt0zZ8/VL3Xp1PGZupnl0yRzWZre5NhSB89Jr16h+RrktJGmsvbhxwfnkEDAAAAQCuEdESFQ7WNWvSnNTrkadJxQ1P0+6tnKNZhb3tTQ7X0z1ukTc+ZzyecL130OynOPfADBgAAAIAOENJheXVNzbrm8Y+051CdhqXF60+LZynJdcS/2gfXS88slCp2SfYYs7Xa3BulI2faAQAAACCMCOmwtGafXzc+/YnW7atUakKsHr9mtrKT41puMAzp4z9Jr9wu+RqllGHSZX+S8meHb9AAAAAA0AlCOizLMAzd/Y+NemNLqVwxdj22cKZGZyW13NBYI/3z29LGlebzcV+ULvq9lJAelvECAAAAwNEQ0mFZD76xQ39ds092m/TbL5+gGQWtwnfxBunvC6WKnZLN0bK83W7v9PMAAAAAINwI6bCkv3+4Tw+8tk2S9MMLjtO843LNFwxD+vjP0ivfa1nefulyafic8A0WAAAAALqJkA7LeXNrqe54foMk6YbTR+urc0eYLxy5vH3sPOniR1jeDgAAAMAyCOmwlPX7K/Wtp9bK5zf0pRPy9H/zxpsvFG80q7cf2hFY3n6vNPcmlrcDAAAAsBRCOizjs4PVuubPH6quyaeTx2TqZ5ccL5skffy49Mp3peYGKSUvsLz9c+EeLgAAAAD0GCEdEc/nN/T/3t2lX/1nm5p8fk0akqLfXz1dTl+d9I9bpQ1/N28c+wXpokekxIzwDhgAAAAAeomQjoi2r6JO3/n7Oq3ZUyFJOnNCtn5x6fFKrtpmVm8/tN1c3n7mPdKJN7O8HQAAAIClEdIRkQzD0IoP9+lH/9osT5NPiU6H7pk/SZfPGCbbp09KL/+fubw9eai5vL1gbriHDAAAAADHjJCOiFNa06A7nt2gVVtKJUmzRqTpV5dN0/Akv/TC9dL6FeaNY86SLv4Dy9sBAAAARA1COiLKqxsP6o7nNuhwnVdOh13f+cI4ff2UUXKUrJf+cE1L9fYz7pJO+jbL2wEAAABEFUI6IkJVvVc/fHGTnvukSJI0cUiKfn3FVE3ISZY+eFR67W7J1xRY3v6YVHBimEcMAAAAAH2PkI6we39Huf7vmXU6UNUgu026/rTRuuWssXI1VUl//bK07RXzxvHnShc+LCWkh3fAAAAAANBPCOkImwavTz9/dYv+9P4eSVJBRoIeuHyqZhSkS3vek569Vqo5IDmc0hd+Is2+VrLZwjtoAAAAAOhHhHSExbp9lVry90+1s8wjSbpqznB9/9yJSoy1SW8uld75hWT4pYyxZvX2IceHecQAAAAA0P8I6RhQXp9fD7+5Qw++sUM+v6HsZJd+funx+vz4bKmqSHr6Wmnv++bN066SzvmF5EoK76ABAAAAYIAQ0jFgdpTW6jt//1Tr9ldJks47foh+fOFkpSU6pS0vS/+4Qao/LDmTpPN/LR1/eZhHDAAAAAADi5COAfHyhoO6dcWnamz2KyUuRj+6aLIumDpUtuZG6eXvSmseNW8cMs1c3p4xOqzjBQAAAIBwIKSj39U1NeuuFzaqsdmvU8Zm6heXHq8h7nipfLu0crFUvMG8ce6N0pn3SjHO8A4YAAAAAMKEkI5+9/QHharwNGl4eoL+tGiWYuw26dOnpZduk7weKSFDuugRadwXwj1UAAAAAAgrQjr6VYPXp0fe3iVJ+tbnRyum2SO99B1p/QrzhhGnSF/6o5QyJIyjBAAAAIDIQEhHv/rbmkKV1zYqLzVeX8otlx69UKrYJdkc0ufvkE5eItkd4R4mAAAAAEQEQjr6TWOzOYtuk1+/LXhfsX/6jeT3Su586ZL/Jw3/XLiHCAAAAAARhZCOfvPMR/vlqz6ov8b/UTO2fmpenHC+dOFDUnxaWMcGAAAAAJGIkI5+4fX5tW7V3/Sq60FlGDVSTLw07yfSzGskmy3cwwMAAACAiERIR9/z1mvPk7fql96/SjbJnz1Z9suWS1njwz0yAAAAAIhohHT0rZJNMlZeo7FlWyRJG/Kv0pSFv5ZiXGEeGAAAAABEPnu4B4AoYRjS/x6R/vB52cq2qMxw61v2uzT6q78loAMAAABANzGTjmNXWyb94wZp+38kSasdM3Wj52v62hdnK8HJv2IAAAAA0F0kKByb7a9LL1wvecokh0sbjvs/fXnNRLnjnVowd0S4RwcAAAAAlsJyd/SOt0F69Q7pqUvMgJ49Sf5r39R39s6WZNM1J41Ukou/AwIAAACAniBFoedKt0jPfk0q2Wg+n/0N6ewf6j9bK7WtZI+SXTFadNKIsA4RAAAAAKyIkI7uMwzpo8ekf98pNTdICZnSRb+Txs2TYRj67aodkqRFJ42QOz42zIMFAAAAAOuJiOXuDz/8sEaMGKG4uDjNmTNHa9as6fTe008/XTabrd1x3nnnDeCIByHPIelvX5Fe+o4Z0MecJX3zv9K4eZKkVZ+VavPBaiU6HbrmpJFhHiwAAAAAWFPYQ/qKFSu0ZMkS3XvvvVq7dq2mTp2qefPmqbS0tMP7n3vuOR08eDB0bNy4UQ6HQ5dddtkAj3wQ2f2u9PsTpa0vSw6nNG+p9JVnpOQcSZJhGHrwje2SpK/OHaG0RGc4RwsAAAAAlhX2kP7AAw/o2muv1eLFizVp0iQ98sgjSkhI0PLlyzu8Pz09Xbm5uaHjtddeU0JCAiG9vzRUSX+9UqotljLHS9e+Ic29QbK3/KvzzvZyrdtfpbhYu75+CrPoAAAAANBbYQ3pTU1N+vjjj3XWWWeFrtntdp111llavXp1tz7jscce05VXXqnExMQOX29sbFR1dXWbAz2w8VmpqVbKGCtd95aUO6XNy+ZedHMW/ao5BcpMcoVhkAAAAAAQHcIa0svLy+Xz+ZSTk9Pmek5OjoqLi4/6/jVr1mjjxo36+te/3uk9S5culdvtDh35+fnHPO5BZe1fzMcZCyVnQruXV+88pI/3HpYzxq5vnDpqgAcHAAAAANEl7Mvdj8Vjjz2mKVOmaPbs2Z3ec8cdd6iqqip07Nu3bwBHaHHFG6UDayV7jHT8lR3e8tvAXvQvz8pXdkrcQI4OAAAAAKJOWFuwZWZmyuFwqKSkpM31kpIS5ebmdvlej8ejv/3tb7rvvvu6vM/lcsnlYgl2r3wSmEUff46UlNXu5TW7K/S/XRWKddj0jdNGD/DgAAAAACD6hHUm3el0asaMGVq1alXomt/v16pVqzR37twu3/vMM8+osbFRV199dX8Pc3BqbpTWrzDPpy/s8JZgRffLZuZraGr8QI0MAAAAAKJWWGfSJWnJkiVauHChZs6cqdmzZ2vZsmXyeDxavHixJGnBggXKy8vT0qVL27zvscce00UXXaSMjIxwDDv6bfmXVH9YSsmTRp/R7uVPCg/r3e3lirHb9E1m0QEAAACgT4Q9pF9xxRUqKyvTPffco+LiYk2bNk2vvvpqqJhcYWGh7Pa2E/5bt27Ve++9p//85z/hGPLgECwYN+0rkt3R7uUH39ghSbr4hDzlp7cvKAcAAAAA6DmbYRhGuAcxkKqrq+V2u1VVVaWUlJRwDycyVRZKy46XZEg3fyqlt+19vmF/leY/9J7sNumN75yuEZkdt78DAAAAAPQsh1q6ujv6ySdPSTKkkae2C+hSy170C6flEdABAAAAoA8R0tGW3yd98qR5fsKCdi9/drBa/9lcIptN+tbnxwzw4AAAAAAguhHS0dauN6Xq/VJcqjRxfruXHwrsRT9vyhCNyU4a4MEBAAAAQHQjpKOtYMG44y+XYuPavLSjtEYvbzwoSbrxDGbRAQAAAKCvEdLRwnNI2vKSeX7CV9u9/NAbO2QY0rzjcjQhl6J7AAAAANDXCOlosX6F5PdKQ6ZKQ45v89Luco9eXHdAknTTGWPDMToAAAAAiHqEdJgMQ/oksNS9g1n0h9/cIb8hnTkhW5Pz3AM8OAAAAAAYHAjpMBWtlUo3SzFx0pTL2ry0r6JOz39SJEm66Uxm0QEAAACgvxDSYVr7uPk46UIpPrXNS797a6d8fkOnjsvStPzUdm8FAAAAAPQNQjqkJo+08Tnz/Iil7l6fX8+u3S9JuomK7gAAAADQrwjpkDa9IDXVSGkjpREnt3lpd7lHTc1+JbliNLMgLTzjAwAAAIBBgpCOVgXjrpZstjYvbSupkSSNzUmS7YjXAAAAAAB9i5A+2JVvlwpXSza7NO0r7V7eVmyG9PE5yQM9MgAAAAAYdAjpg11wFn3M2VLK0HYvbw3MpI8jpAMAAABAvyOkD2Y+r/TpX83z6e17o0vS9pJaSYR0AAAAABgIhPTBbNu/JU+plJgljftiu5cbvD7tOeSRJI3LTRro0QEAAADAoENIH8yCS92nfllyxLZ7eUdprfyGlJYQq6wk1wAPDgAAAAAGH0L6YFV9UNr+H/P8hI6Xum9rtR+dyu4AAAAA0P8I6YPVuqclwy/lf07KGtfhLdvYjw4AAAAAA4qQPhgZhvTJk+Z5JwXjpFYz6bmEdAAAAAAYCIT0wWjv+1LFLsmZJE26qNPbttIjHQAAAAAGFCF9MFobKBg3+RLJ1XHV9trGZhVV1kuSxuVQ2R0AAAAABgIhfbCpr5Q2v2CeT1/Q6W3bA0vds5NdSk1w9v+4AAAAAACE9EFn40qpuUHKmijlzej0tuB+9PHsRwcAAACAAUNIH2yCS92nf1Xqoq1asLL72GxCOgAAAAAMFEL6YFK8QTr4qWSPlY6/sstbW2bS2Y8OAAAAAAOFkD6YBGfRJ5wrJWZ0eWuwsjs90gEAAABg4BDSBwtvg7R+hXneRcE4Saqsa1JpTaMkaSwhHQAAAAAGDCF9sNjyL6mhUkoZJo36fJe3Bvej56XGK8kVMwCDAwAAAABIhPTBY+0T5uMJV0l2R5e3bqWyOwAAAACEBSF9MDi8R9r9tiSbNO2qo96+jf3oAAAAABAWhPTB4JOnzMdRp0lpBUe9PVjZfVwOld0BAAAAYCAR0qOd3yd9GgjpJ3z1qLcbhtEqpDOTDgAAAAADiZAe7Xa+KVUXSfFp0oTzj3p7WW2jDtd5ZbdJY7KZSQcAAACAgURIj3afBArGHX+FFBt31Nu3Byq7F2QkKi626wJzAAAAAIC+RUiPZp5D0paXzfNuLHWXpK3F7EcHAAAAgHAhpEez4nWS3ytljJFyJ3frLcH96OPZjw4AAAAAA46QHs085eZjSl633xLskT6WkA4AAAAAA46QHs08ZeZjYla3bjcMI7QnfXwuIR0AAAAABhohPZqFQnpmt24/UNWg2sZmxTpsGpGR2I8DAwAAAAB0hJAezYLL3bsZ0rcFisaNykySM4Z/NQAAAABgoJHEolkopHdvufu20H50KrsDAAAAQDgQ0qNZD/ekb6WyOwAAAACEFSE9mgVDekI3l7sHQvo4isYBAAAAQFgQ0qNZ3SHzsRt70n1+QztKzcru45hJBwAAAICwIKRHq6Y6qckM3d1Z7r6vok4NXr9cMXYNT0/o58EBAAAAADpCSI9WdYGicQ6n5Dr6zPjWVkXjHHZbf44MAAAAANAJQnq0al00znb00B1svzYum6XuAAAAABAuhPRo5en+fnRJ2hbcj07ROAAAAAAIm16F9DfffLOvx4G+1sP2a8GZdNqvAQAAAED49Cqkf/GLX9To0aP14x//WPv27evrMaEv9KD9mtfn165yZtIBAAAAINx6FdKLiop04403auXKlRo1apTmzZunv//972pqaurr8aG3goXjurHcfU+5R16foSRXjIa64/p5YAAAAACAzvQqpGdmZurWW2/Vp59+qg8++EDjxo3TDTfcoKFDh+rmm2/WunXr+nqc6ClPMKQffbl768rutm4UmQMAAAAA9I9jLhw3ffp03XHHHbrxxhtVW1ur5cuXa8aMGTrllFO0adOmvhgjeqMHe9LZjw4AAAAAkaHXId3r9WrlypU699xzVVBQoH//+9966KGHVFJSoh07dqigoECXXXZZX44VPREK6Udf7r6txNyPPpaQDgAAAABhFdObN910003661//KsMw9NWvflW/+MUvNHny5NDriYmJuv/++zV06NA+Gyh6qAct2LaVMJMOAAAAAJGgVyF98+bNevDBB/WlL31JLperw3syMzNp1RYuhtHt5e4NXp/2HPJIksblJvX3yAAAAAAAXehVSF+1atXRPzgmRqeddlpvPh7HqrFG8jWa50dpwbajtFZ+Q0pNiFVWUsd/4QIAAAAAGBi92pO+dOlSLV++vN315cuX6+c///kxDwrHKNh+LTZRciZ0eev2UnOp+7icZCq7AwAAAECY9SqkP/roo5owYUK768cdd5weeeSRYx4UjpGn+z3StxabRePYjw4AAAAA4derkF5cXKwhQ4a0u56VlaWDBw8e86BwjHrSfq0kOJPOfnQAAAAACLdehfT8/Hy9//777a6///77VHSPBD1qv9ay3B0AAAAAEF69Khx37bXX6tvf/ra8Xq/OOOMMSWYxue9+97v6zne+06cDRC90c7l7bWOz9h+ul0RIBwAAAIBI0KuQ/n//9386dOiQbrjhBjU1NUmS4uLi9L3vfU933HFHnw4QvRAK6V0vd98emEXPTnYpLdHZ36MCAAAAABxFr0K6zWbTz3/+c91999367LPPFB8fr7Fjx3baMx0DLLjc/Sjt17aXmEXjmEUHAAAAgMjQq5AelJSUpFmzZvXVWNBX6ro3k76V/egAAAAAEFF6HdI/+ugj/f3vf1dhYWFoyXvQc889d8wDwzHo5p70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yx/465MUZtIBAAAAYFAgpEeoqkBl9/hYh+L6qA0BAAAAACCyEdIjVGV9YD86ReMAAAAAYNAgpEcoeqQDAAAAwOBDSI9QlbRfAwAAAIBBh5AeoaqCIT3eGeaRAAAAAAAGCiE9QlXVsScdAAAAAAYbQnqEyk6O06wRaRqTnRTuoQAAAAAABkhMuAeAjl0+K1+Xz8oP9zAAAAAAAAOImXQAAAAAwKA0YsQILVu2LNzDaIOQDgAAAABAhCCkAwAAAAAQIQjpAAAAAIAWhiE1ecJzGEa3h/mHP/xBQ4cOld/vb3P9wgsv1DXXXKOdO3fqwgsvVE5OjpKSkjRr1iy9/vrrff3b6nMUjgMAAAAAtPDWST8dGp7v/v4ByZnYrVsvu+wy3XTTTXrzzTd15plnSpIqKir06quv6uWXX1Ztba3OPfdc/eQnP5HL5dITTzyh+fPna+vWrRo+fHh//hTHhJl0AAAAAIDlpKWl6ZxzztHTTz8durZy5UplZmbq85//vKZOnapvfOMbmjx5ssaOHasf/ehHGj16tF588cUwjvromEkHAAAAALSITTBntMP13T1w1VVX6dprr9Xvfvc7uVwuPfXUU7ryyitlt9tVW1urH/zgB3rppZd08OBBNTc3q76+XoWFhf00+L5BSAcAAAAAtLDZur3kPNzmz58vwzD00ksvadasWXr33Xf161//WpJ022236bXXXtP999+vMWPGKD4+XpdeeqmamprCPOquEdIBAAAAAJYUFxenL33pS3rqqae0Y8cOjR8/XtOnT5ckvf/++1q0aJEuvvhiSVJtba327NkTxtF2DyEdAAAAAGBZV111lc4//3xt2rRJV199dej62LFj9dxzz2n+/Pmy2Wy6++6721WCj0QUjgMAAAAAWNYZZ5yh9PR0bd26VV/5yldC1x944AGlpaXpxBNP1Pz58zVv3rzQLHskYyYdAAAAAGBZdrv9/7d35+E13fkfwN83kdwsJEQEkcUSElWisTUYtDRhTGx9RKd23SxRqoutSqUVS5Upaukog45tSlFFbdGpJ1Uh1kmzoKX2sSQkJGny+f3hyf25Se4933OjdZj363nyPHWd887npm/nnu9dTnDhQukL3dWuXRt79uyxum3EiBFWfzbi29/5SjoRERERERGRQXCRTkRERERERGQQXKQTERERERERGQQX6UREREREREQG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uEhQUJC8++67pf4NqBzL7ty5I8OHD5cqVaqIh4eH9OzZ0+oJIZWMyZMn291GK8PWfQUgZ86cUco4f/68dOnSRfz8/MTFxUUCAgLkxRdflJ9++kn3z6SkkieRWhlnz56Vdu3aiY+Pj5jNZgkJCZG3337b6roQqnMkJCRIQECAeHh4SGRkpNWTSqoZ48ePl8DAQCksLLR5/7Ry0tPTpVevXuLn5yceHh7SpEkTq18ZpJIxduxYqV69uri4uEj9+vVLdV7rMVOrqyoZWl1VyVHpq1aGal/1nkeU7KpKjkpfVWex11fVDK2+amVodVUlQ6urtpQ8P1PprEqOam9tZah21l6Game17ktJtjprL0e1syqzaHVWJUOrs1oZKp1VydHqrdZ6wNG+GpVJRARERERERERE9NDx96QTERERERERGQQX6UREREREREQGwUU6ERERERERkUFwkU5ERERERERkEFykExERERERERkEF+lEREREREREBsFFOhEREREREZFBcJFOREREREREZBBcpBMREdHvKjExESaTCTdv3nzYoxARERkeF+lEREREREREBsFFOhEREREREZFBcJFORET0mCsqKkJCQgLq1KkDd3d3hIeH41//+heA/38r+tatW9GkSRO4ubnh6aefxokTJ6wyvvzySzRq1Ahmsxm1a9fG7Nmzrf4+Ly8PY8eORWBgIMxmM0JCQrB06VKrbQ4dOoTmzZvDw8MDrVu3Rlpa2u97x4mIiB5BXKQTERE95hISErBixQosWrQIJ0+exBtvvIF+/fph3759lm3efvttzJ49GwcPHkS1atUQExODgoICAPcW17GxsXjhhRdw/PhxTJkyBZMmTcLy5cst+w8YMACrV6/GJ598gtTUVCxevBgVK1a0mmPixImYPXs2kpOTUaFCBQwZMuQPuf9ERESPEpOIyMMegoiIiH4feXl58PHxwa5duxAZGWm5/eWXX0Zubi5effVVPPPMM1izZg369OkDALh+/ToCAgKwfPlyxMbGom/fvrh69Sq+/fZby/7vvPMOtm7dipMnTyI9PR2hoaHYuXMnOnXqVGqGxMREPPPMM9i1axc6duwIAPjmm2/QtWtX3LlzB25ubr/zT4GIiOjRwVfSiYiIHmOZmZnIzc3Fc889h4oVK1q+VqxYgVOnTlm2u38B7+Pjg9DQUKSmpgIAUlNT0aZNG6vcNm3aICMjA4WFhThy5AicnZ3Rvn17u7M0adLE8t81a9YEAFy5cqXc95GIiOhxUuFhD0BERES/n9u3bwMAtm7dilq1aln9ndlstlqoO8rd3V1pOxcXF8t/m0wmAPc+L09ERET/j6+kExERPcaeeOIJmM1mnD17FiEhIVZfgYGBlu1++OEHy3/fuHED6enpaNiwIQCgYcOG2L9/v1Xu/v370aBBAzg7O6Nx48YoKiqy+ow7EREROYavpBMRET3GKlWqhLfeegtvvPEGioqK0LZtW2RlZWH//v3w8vJCcHAwAGDq1KmoWrUqqlevjokTJ8LX1xc9evQAALz55pto0aIF4uPj0adPHyQlJWH+/Pn49NNPAQC1a9fGwIEDMWTIEHzyyScIDw/HL7/8gitXriA2NvZh3XUiIqJHEhfpREREj7n4+HhUq1YNCQkJOH36NCpXroyIiAhMmDDB8nbz6dOnY9SoUcjIyEDTpk2xZcsWuLq6AgAiIiKwbt06vPfee4iPj0fNmjUxdepUDBo0yPI9Fi5ciAkTJmD48OG4du0agoKCMGHChIdxd4mIiB5pvLo7ERHR/7DiK6/fuHEDlStXftjjEBER/c/jZ9KJiIiIiIiIDIKLdCIiIiIiIiKD4NvdiYiIiIiIiAyCr6QTERERERERGQQX6UREREREREQGwUU6ERERERERkUFwkU5ERERERERkEFykExERERERERkEF+lEREREREREBsFFOhEREREREZFBcJFOREREREREZBD/B1BNGaXyEDRzAAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
],
"source": [
"plt.figure(figsize=(12, 8))\n",
"\n",
"plt.plot(history['train']['accuracy'])\n",
"plt.plot(history['val']['accuracy'])\n",
"plt.title('model accuracy')\n",
"plt.ylabel('accuracy')\n",
"plt.xlabel('epoch')\n",
"plt.xticks(np.arange(len(history['train']['accuracy'])), np.arange(1, len(history['train']['accuracy']) + 1))\n",
"plt.legend(['train', 'val'], loc='lower right')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5DaCsCk836S3"
},
"source": [
"### Predict"
]
},
{
"cell_type": "code",
"source": [
"test = pd.read_csv('/content/test.csv')"
],
"metadata": {
"id": "SZuNwt_0VD4H"
},
"execution_count": 96,
"outputs": []
},
{
"cell_type": "code",
"source": [
"test"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 423
},
"id": "6ZkZMm41WD6t",
"outputId": "6b99b007-964f-4bf6-bd3e-1ea4be497869"
},
"execution_count": 97,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" id word num_syllables lemma\n",
"0 0 эпилепсия 5 эпилепсия\n",
"1 1 относящейся 5 относиться\n",
"2 2 размышлениями 6 размышление\n",
"3 3 модемы 3 модем\n",
"4 4 солнц 1 солнце\n",
"... ... ... ... ...\n",
"29955 29955 донбасса 3 донбасс\n",
"29956 29956 обложка 3 обложка\n",
"29957 29957 правителя 4 правитель\n",
"29958 29958 шерстяной 3 шерстяной\n",
"29959 29959 оптимизации 6 оптимизация\n",
"\n",
"[29960 rows x 4 columns]"
],
"text/html": [
"\n",
" <div id=\"df-298679aa-e94c-4753-88bc-8080a262015b\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>word</th>\n",
" <th>num_syllables</th>\n",
" <th>lemma</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>эпилепсия</td>\n",
" <td>5</td>\n",
" <td>эпилепсия</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>относящейся</td>\n",
" <td>5</td>\n",
" <td>относиться</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>размышлениями</td>\n",
" <td>6</td>\n",
" <td>размышление</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>модемы</td>\n",
" <td>3</td>\n",
" <td>модем</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>солнц</td>\n",
" <td>1</td>\n",
" <td>солнце</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29955</th>\n",
" <td>29955</td>\n",
" <td>донбасса</td>\n",
" <td>3</td>\n",
" <td>донбасс</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29956</th>\n",
" <td>29956</td>\n",
" <td>обложка</td>\n",
" <td>3</td>\n",
" <td>обложка</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29957</th>\n",
" <td>29957</td>\n",
" <td>правителя</td>\n",
" <td>4</td>\n",
" <td>правитель</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29958</th>\n",
" <td>29958</td>\n",
" <td>шерстяной</td>\n",
" <td>3</td>\n",
" <td>шерстяной</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29959</th>\n",
" <td>29959</td>\n",
" <td>оптимизации</td>\n",
" <td>6</td>\n",
" <td>оптимизация</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>29960 rows × 4 columns</p>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-298679aa-e94c-4753-88bc-8080a262015b')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-298679aa-e94c-4753-88bc-8080a262015b button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-298679aa-e94c-4753-88bc-8080a262015b');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
]
},
"metadata": {},
"execution_count": 97
}
]
},
{
"cell_type": "code",
"source": [
"def stress_pred(words):\n",
" tokens = pad_sequence(tokenizer.transform(words))\n",
" sequences = torch.tensor(tokens, dtype=torch.long).cuda()\n",
" preds = model(sequences)\n",
" indeces = torch.argmax(preds, axis=1)\n",
" indeces = indeces.to('cpu').numpy()\n",
" res = []\n",
" for i in range(len(indeces)):\n",
" pos = indeces[i]\n",
" coun = 1\n",
" for j in range(pos - 1,-1,-1,):\n",
" if words[i][j] in {'а', 'о', 'у', 'ы', 'э', 'е', 'ё', 'и', 'ю', 'я'}:\n",
" coun += 1\n",
" res.append(coun)\n",
" return res"
],
"metadata": {
"id": "xK1ZTbtRd644"
},
"execution_count": 98,
"outputs": []
},
{
"cell_type": "code",
"source": [
"words = test['word'].tolist()"
],
"metadata": {
"id": "ajqABWgCYJ0n"
},
"execution_count": 99,
"outputs": []
},
{
"cell_type": "code",
"source": [
"pred_stress = stress_pred(words)"
],
"metadata": {
"id": "BnQIjobDlnoP"
},
"execution_count": 100,
"outputs": []
},
{
"cell_type": "code",
"source": [
"test['pred_stress'] = pred_stress"
],
"metadata": {
"id": "1UClWDbuZYWK"
},
"execution_count": 101,
"outputs": []
},
{
"cell_type": "code",
"source": [
"test"
],
"metadata": {
"id": "eaHU-R2LmII3",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 423
},
"outputId": "5d143eb5-f0c3-41c7-d982-ece4bf5596f8"
},
"execution_count": 102,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" id word num_syllables lemma pred_stress\n",
"0 0 эпилепсия 5 эпилепсия 3\n",
"1 1 относящейся 5 относиться 3\n",
"2 2 размышлениями 6 размышление 3\n",
"3 3 модемы 3 модем 2\n",
"4 4 солнц 1 солнце 1\n",
"... ... ... ... ... ...\n",
"29955 29955 донбасса 3 донбасс 2\n",
"29956 29956 обложка 3 обложка 2\n",
"29957 29957 правителя 4 правитель 2\n",
"29958 29958 шерстяной 3 шерстяной 2\n",
"29959 29959 оптимизации 6 оптимизация 4\n",
"\n",
"[29960 rows x 5 columns]"
],
"text/html": [
"\n",
" <div id=\"df-58d65a88-788e-4cef-aa6e-c99c96833dc8\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>word</th>\n",
" <th>num_syllables</th>\n",
" <th>lemma</th>\n",
" <th>pred_stress</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>эпилепсия</td>\n",
" <td>5</td>\n",
" <td>эпилепсия</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>относящейся</td>\n",
" <td>5</td>\n",
" <td>относиться</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>размышлениями</td>\n",
" <td>6</td>\n",
" <td>размышление</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>модемы</td>\n",
" <td>3</td>\n",
" <td>модем</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>солнц</td>\n",
" <td>1</td>\n",
" <td>солнце</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29955</th>\n",
" <td>29955</td>\n",
" <td>донбасса</td>\n",
" <td>3</td>\n",
" <td>донбасс</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29956</th>\n",
" <td>29956</td>\n",
" <td>обложка</td>\n",
" <td>3</td>\n",
" <td>обложка</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29957</th>\n",
" <td>29957</td>\n",
" <td>правителя</td>\n",
" <td>4</td>\n",
" <td>правитель</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29958</th>\n",
" <td>29958</td>\n",
" <td>шерстяной</td>\n",
" <td>3</td>\n",
" <td>шерстяной</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29959</th>\n",
" <td>29959</td>\n",
" <td>оптимизации</td>\n",
" <td>6</td>\n",
" <td>оптимизация</td>\n",
" <td>4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>29960 rows × 5 columns</p>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-58d65a88-788e-4cef-aa6e-c99c96833dc8')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-58d65a88-788e-4cef-aa6e-c99c96833dc8 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-58d65a88-788e-4cef-aa6e-c99c96833dc8');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
]
},
"metadata": {},
"execution_count": 102
}
]
},
{
"cell_type": "code",
"source": [
"test.to_csv('pred.csv')"
],
"metadata": {
"id": "p9M0Oei0Z16J"
},
"execution_count": 103,
"outputs": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "ujctqO-d36S4"
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "--8Nn7QD36S4"
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Zy4DN7mL36S4"
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "tqzDD25l36S4"
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.8.10 64-bit",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
},
"vscode": {
"interpreter": {
"hash": "767d51c1340bd893661ea55ea3124f6de3c7a262a8b4abca0554b478b1e2ff90"
}
},
"colab": {
"provenance": []
},
"accelerator": "GPU",
"gpuClass": "standard"
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment