├── README.md
└── structuredData
└── StructuredDeepLearning_Manthan.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # NeuralNetworks
2 | NeuralNetworks
3 |
--------------------------------------------------------------------------------
/structuredData/StructuredDeepLearning_Manthan.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## Structured Data Learning Template for deep Neural Networks Using fast AI library"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "%matplotlib inline\n",
17 | "%reload_ext autoreload\n",
18 | "%autoreload 2"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 2,
24 | "metadata": {},
25 | "outputs": [],
26 | "source": [
27 | "from fastai.structured import *\n",
28 | "from fastai.column_data import *\n",
29 | "from sklearn.datasets import load_boston\n",
30 | "\n",
31 | "np.set_printoptions(threshold=50, edgeitems=20)\n",
32 | "\n",
33 | "PATH='data/manthan/'"
34 | ]
35 | },
36 | {
37 | "cell_type": "markdown",
38 | "metadata": {},
39 | "source": [
40 | "## Create datasets"
41 | ]
42 | },
43 | {
44 | "cell_type": "code",
45 | "execution_count": 100,
46 | "metadata": {},
47 | "outputs": [
48 | {
49 | "name": "stdout",
50 | "output_type": "stream",
51 | "text": [
52 | "13\n"
53 | ]
54 | }
55 | ],
56 | "source": [
57 | "data= load_boston()\n",
58 | "print(len(data.feature_names))"
59 | ]
60 | },
61 | {
62 | "cell_type": "markdown",
63 | "metadata": {},
64 | "source": [
65 | "## Data Cleaning / Feature Engineering"
66 | ]
67 | },
68 | {
69 | "cell_type": "markdown",
70 | "metadata": {},
71 | "source": [
72 | "## Durations"
73 | ]
74 | },
75 | {
76 | "cell_type": "markdown",
77 | "metadata": {},
78 | "source": [
79 | "## Create features\n"
80 | ]
81 | },
82 | {
83 | "cell_type": "markdown",
84 | "metadata": {},
85 | "source": [
86 | "## Linear Regression"
87 | ]
88 | },
89 | {
90 | "cell_type": "markdown",
91 | "metadata": {},
92 | "source": [
93 | "Let's first apply a simple linear regression by scikit learn and see the baseline results and try using deep learning library to see if we can beat those results.\n"
94 | ]
95 | },
96 | {
97 | "cell_type": "code",
98 | "execution_count": 55,
99 | "metadata": {},
100 | "outputs": [
101 | {
102 | "name": "stdout",
103 | "output_type": "stream",
104 | "text": [
105 | "training error 22.9834937317 test_error 20.7471433603\n"
106 | ]
107 | }
108 | ],
109 | "source": [
110 | "from sklearn.linear_model import LinearRegression\n",
111 | "from sklearn.model_selection import train_test_split\n",
112 | "from sklearn.metrics import mean_squared_error\n",
113 | "import numpy as np\n",
114 | "X=data.data\n",
115 | "y=data.target\n",
116 | "\n",
117 | "X_train,X_test,y_train,y_test=train_test_split(X, y, test_size=0.33, random_state=42)\n",
118 | "model=LinearRegression().fit(X_train,y_train)\n",
119 | "\n",
120 | "train_error= mean_squared_error(model.predict(X_train),y_train)\n",
121 | "test_error= mean_squared_error(model.predict(X_test),y_test)\n",
122 | "print('training error',train_error,'test_error',test_error)"
123 | ]
124 | },
125 | {
126 | "cell_type": "markdown",
127 | "metadata": {},
128 | "source": [
129 | "## DeepLearning"
130 | ]
131 | },
132 | {
133 | "cell_type": "markdown",
134 | "metadata": {},
135 | "source": [
136 | "RMSE being the evaluation criteria"
137 | ]
138 | },
139 | {
140 | "cell_type": "code",
141 | "execution_count": 179,
142 | "metadata": {},
143 | "outputs": [
144 | {
145 | "data": {
146 | "text/plain": [
147 | "506"
148 | ]
149 | },
150 | "execution_count": 179,
151 | "metadata": {},
152 | "output_type": "execute_result"
153 | }
154 | ],
155 | "source": [
156 | "def inv_y(a): return np.exp(a)\n",
157 | "\n",
158 | "def exp_rmspe(y_pred, targ):\n",
159 | " targ = inv_y(targ)\n",
160 | " pct_var = (targ - inv_y(y_pred))/targ\n",
161 | " return math.sqrt((pct_var**2).mean())\n",
162 | "\n",
163 | "len(data.target.astype(np.float32))"
164 | ]
165 | },
166 | {
167 | "cell_type": "markdown",
168 | "metadata": {},
169 | "source": [
170 | "Boston Dataset with chas being the categorical attribute"
171 | ]
172 | },
173 | {
174 | "cell_type": "code",
175 | "execution_count": 190,
176 | "metadata": {},
177 | "outputs": [
178 | {
179 | "name": "stdout",
180 | "output_type": "stream",
181 | "text": [
182 | " CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \\\n",
183 | "0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 \n",
184 | "1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 \n",
185 | "2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 \n",
186 | "3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 \n",
187 | "4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 \n",
188 | "\n",
189 | " PTRATIO B LSTAT \n",
190 | "0 15.3 396.90 4.98 \n",
191 | "1 17.8 396.90 9.14 \n",
192 | "2 17.8 392.83 4.03 \n",
193 | "3 18.7 394.63 2.94 \n",
194 | "4 18.7 396.90 5.33 \n"
195 | ]
196 | }
197 | ],
198 | "source": [
199 | "print(dl_data.head())"
200 | ]
201 | },
202 | {
203 | "cell_type": "markdown",
204 | "metadata": {},
205 | "source": [
206 | "Cross Validation Indexes should be choosed randomly from the dataset "
207 | ]
208 | },
209 | {
210 | "cell_type": "code",
211 | "execution_count": 196,
212 | "metadata": {},
213 | "outputs": [],
214 | "source": [
215 | "import random\n",
216 | "validation_indexes=random.sample(range(0,len(data.data)),math.floor (len(data.data)/4))\n",
217 | "dl_data=pd.DataFrame(data.data,columns=data.feature_names)"
218 | ]
219 | },
220 | {
221 | "cell_type": "markdown",
222 | "metadata": {},
223 | "source": [
224 | "Loads the columnar data with categorical values
\n",
225 | "PATH - all intermediate model or temp will be stored. make sure its empty.
\n",
226 | "validation_index - indexes with validation_indexes will be used for validation
\n",
227 | "dl_data - dataframe to train
\n",
228 | "data.target - label
\n",
229 | "cat_flds - categorocial attributes
\n",
230 | "bs batch size for stochastic gradient descent
"
231 | ]
232 | },
233 | {
234 | "cell_type": "code",
235 | "execution_count": 197,
236 | "metadata": {},
237 | "outputs": [],
238 | "source": [
239 | "model=ColumnarModelData.from_data_frame(PATH,validation_indexes,dl_data,data.target.astype(np.float32),cat_flds=['CHAS'],bs=2)"
240 | ]
241 | },
242 | {
243 | "cell_type": "markdown",
244 | "metadata": {},
245 | "source": [
246 | "embd for categorical attributes and their mapping like for (100 categories map -> 10) - Embedding
\n",
247 | "number_of_non_categorical_value - number of non_categorical_values
\n",
248 | "layers - Number of hidden layers in sequence
\n",
249 | "drop_outs - Dropouts for each hidden layer
"
250 | ]
251 | },
252 | {
253 | "cell_type": "code",
254 | "execution_count": 198,
255 | "metadata": {},
256 | "outputs": [],
257 | "source": [
258 | "embd=[(2,1)]\n",
259 | "number_of_non_categorical_value=12\n",
260 | "layers=[500]\n",
261 | "drop_outs=[0.01]\n",
262 | "model=model.get_learner(embd,number_of_non_categorical_value, 0.04, 1, layers,drop_outs)"
263 | ]
264 | },
265 | {
266 | "cell_type": "markdown",
267 | "metadata": {},
268 | "source": [
269 | "This is new so take a breath. Hyperparameter tuning: Learning rate. Fast Ai runs a sample of algorithm with learning rate growing very fast. So we run the same training algorithm not to optimize the loss but to find the learning rate. Would be in seconds. Plotting the graph we can find the perfect learning rate and use that. Kudos FastAI! "
270 | ]
271 | },
272 | {
273 | "cell_type": "code",
274 | "execution_count": 184,
275 | "metadata": {},
276 | "outputs": [
277 | {
278 | "data": {
279 | "application/vnd.jupyter.widget-view+json": {
280 | "model_id": "b8a167a887d64820862609e09f9933d6",
281 | "version_major": 2,
282 | "version_minor": 0
283 | },
284 | "text/html": [
285 | "
Failed to display Jupyter Widget of type HBox.
\n", 287 | " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", 288 | " that the widgets JavaScript is still loading. If this message persists, it\n", 289 | " likely means that the widgets JavaScript library is either not installed or\n", 290 | " not enabled. See the Jupyter\n", 291 | " Widgets Documentation for setup instructions.\n", 292 | "
\n", 293 | "\n", 294 | " If you're reading this message in another frontend (for example, a static\n", 295 | " rendering on GitHub or NBViewer),\n", 296 | " it may mean that your frontend doesn't currently support widgets.\n", 297 | "
\n" 298 | ], 299 | "text/plain": [ 300 | "HBox(children=(IntProgress(value=0, description='Epoch', max=1), HTML(value='')))" 301 | ] 302 | }, 303 | "metadata": {}, 304 | "output_type": "display_data" 305 | }, 306 | { 307 | "name": "stdout", 308 | "output_type": "stream", 309 | "text": [ 310 | " 66%|██████▌ | 125/190 [00:00<00:00, 282.90it/s, loss=1.31e+04]\n", 311 | " \r" 312 | ] 313 | } 314 | ], 315 | "source": [ 316 | "model.lr_find()" 317 | ] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "execution_count": 163, 322 | "metadata": {}, 323 | "outputs": [ 324 | { 325 | "data": { 326 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEOCAYAAACEiBAqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzt3Xl4VOX1wPHvyU72hAQIBCTsOwJhE1FRpGrdRa22FhWX+rN1q1qttq6trVZtq9aK4l7qgguKVUREXFnCvi+yhiQQyEL2ZfL+/pibkMCETMLcmST3fJ4nz9y5c+/MuZNkzry7GGNQSinlXEGBDkAppVRgaSJQSimH00SglFIOp4lAKaUcThOBUko5nCYCpZRyOE0ESinlcJoIlFLK4TQRKKWUw2kiUEophwsJdADeSEpKMj179gx0GEop1aYsX778gDEmuanj2kQi6NmzJxkZGYEOQyml2hQR2eXNcVo1pJRSDqeJQCmlHE4TgVJKOZwmAqWUcjhNBEop5XCaCJRSyuFsTQQicruIrBeRdSLyXxGJEJE0EVkiIltF5G0RCbMzBqWUaotyCsuZv2EfReVVtr+WbYlARLoBtwDpxpghQDDwM+CvwNPGmL5APjDdrhiUUqqt+mH7Aa5/PYN9hypsfy27q4ZCgA4iEgJEAtnA6cBs6/HXgAttjkEppdqczLwyAFITOtj+WrYlAmPMXuBvwG7cCaAQWA4UGGOqrcMygW52xaCUUm1VZn4ZyTHhRIQG2/5adlYNJQAXAGlAVyAKONvDoaaR828QkQwRycjNzbUrTKWUapX25Jf6pTQA9lYNTQZ2GGNyjTFVwPvASUC8VVUEkApkeTrZGDPDGJNujElPTm5yziSllGpXMvPL6J4Q6ZfXsjMR7AbGiUikiAhwBrABWAhMtY6ZBsyxMQallGpzXDWGrIKytl8iMMYswd0ovAJYa73WDOB3wB0isg3oCMy0KwallGqLcg6VU11j6J7onxKBrdNQG2MeAB44Yvd2YIydr6uUUm1ZZl4p4J8eQ6Aji5VSqtXJzK/tOtr22wiUUkq1wJ78UkSga3yEX15PE4FSSrUymflldI6JIDzE/jEEoIlAKaVanUw/jiEATQRKKdXq7Mkr81uPIdBEoJRSrUq1q4acQ+VaIlBKKafKLizHVWP8NqoYNBEopdRxqayu8enzbcopAvw3hgA0ESilVIu9tzyTMX/+gv2Hyn3yfMYY/r3oR1LiIhjVM8Enz+kNTQRKKdVC23KLKSit4vlFP/rk+b7eeoDlu/K5eVIfv3UdBU0ESinVYgWllQDMWrL7uEsFxhiemr+FbvEduCy9uy/C85omAqWUaqH8kioSo8KorjH866vjKxWs2J3P6j0F3DypD2Eh/v1o1kSglFItlFdaSZ9O0UwdmcqsJbvZtr+oyXOMMdz21krmrc9psH/+hv2EBAnnDk+xK9xGaSJQSqkWKiitJCEylLvO6k9keDD3vLeWmhqPiy7WyTlUzoersnjoo/VUVLvq9i/YuI8xaYnERoTaHfZRNBEopVQL5ZdWkRAZRlJ0OH/46SAyduXz5pJdxzxn3d5DAGQVlvNuRiYAuw+WsnV/MWcM7Gx7zJ5oIlBKqRYwxlBQWkl8ZBgAF4/sxsS+STw6dyOfH1HtU9/avYUECQztFsdzC7dRUe1iwaZ9AJwxoJNfYj+SJgKllGqBkkoXVS5DQqS7KkdEeOaKEQzqGstN/1nBv77axtrMQnKLKsgtqqirMlq3t5DeydHcfVZ/sgvLuePt1cxdk02v5Ch6JkUF5FpsXaFMKaXaq/wSd9fRBKtEABAfGcab143lV28s5/HPNvM4m+seu3hEN566/ETW7S3k5D5JnNwnidsn9+PZhVupchluOKWX36+hliYCpZRqgYLSKgDiIxs27kaHh/DG9DHsyStj7d5CDpZU8PWWXD5ek8UNp/Zif1EFQ7rFISLcOrkvPx2Wwivf7eCqcScE4jIATQRKKdUi+dZgsoSosKMeExF6dIykR0f3xHFj0hL5YuN+Hp27EYAh3eLqju3TKZo/XTTUDxE3TtsIlFKqBeoSQWTT3T0HdIlleGoc3247gAgM7hprd3jNoolAKaWAT9Zk82NusdfHH64aOrpE4Mllo93TRvRKiiIqvHVVxmgiUEop4LfvruKe99Z4fXxtiSC+g3cDwM4b3pUOocEMT41vUXx2al1pSSmlAqC8ykV5VQ3LduazfFceo05IbPKcgtIqYiNCCAn27vt0bEQo79w4nk6x4ccbrs9piUAp5XiFZVV1289/td2rc/JLKz02FB/L0NQ4OsdGNOscf7AtEYhIfxFZVe/nkIjcJiKJIjJfRLZat/5bfUEppTyore/v3zmGLzbuY8u+piePyyup9Lp9oLWzLREYYzYbY040xpwIjAJKgQ+Ae4AFxpi+wALrvlJKBUxtieDXp/chJjyEX72xnKyCMuas2supTyxk6Y68o84pKK3yqsdQW+CvqqEzgB+NMbuAC4DXrP2vARf6KQallPKoNhH07BjFq9eOJreogp/8/WtufWsVuw6W8uTnm486J7+0ssGo4rbMX4ngZ8B/re3OxphsAOs2MLMsKaWUpXalsfjIUEadkMis68eRHB3Oryf14ffnDGDJjjyW78o/4pyqo0YVt1W2JwIRCQPOB95t5nk3iEiGiGTk5ubaE5xSSnG4RBBrdQUdmhrHl3eexp0/6c/Px55AfGQoz9dbgayyuobiimotETTD2cAKY8w+6/4+EUkBsG73ezrJGDPDGJNujElPTk72Q5hKKac6VFaFCMR4GOgVFR7CtPE9+WLjPtZnFQJQUOb9qOK2wB+J4AoOVwsBfARMs7anAXP8EINSSjWqsKyK2IhQgoLE4+PXTOhJx6gwfv/+Wlw1ptmjils7WxOBiEQCZwLv19v9F+BMEdlqPfYXO2NQSqmmFJQdu74/PjKMB84fzOrMQl79fqfHKajbMltHFhtjSoGOR+w7iLsXkVJKtQqFZVXENTFVxHnDUvhw5V6emLeJdGvksTYWK6VUO+FNIhARHrt4KKf2S2bZzjyCg4Quca1vlHBL6FxDSinHKyytomt8hyaP6xwbwQtXpVNSUc2B4gqSolvfvEEtoYlAKeV4hWVVXs8iCu6eRK1tKunjoVVDSilHM8Z4VTXUnmkiUEo5Wkmli+oao4lAKaWcqnZUcXvpAdQSmgiUUo5WaA0O0xKBUko5VO10EbGaCJRSypkOlWmJQBOBUsrRDrcRtI/pIlpCE4FSytEKtI1AE4FSytkKy6oIDhKiwoIDHUrAaCJQSjla7ahiEc9TUDuBJgKllKMVOHxUMWgiUEo53KGyKkd3HQWddE4p5VB/m7eZTTmH2J5bQp9O0YEOJ6A0ESilHOnzDTls2VcMwNi0xABHE1iaCJRSjlRS4eLcYSmcO6wrg1JiAx1OQGkiUEo5UlmVi7gOoZw1pEugQwk4bSxWSjlSaWU1kQ4eO1CfJgKllOPU1BjKq2roEKaVIqCJQCnlQGVVLgBHjyauTxOBUspxSiqrAbRqyKKJQCnlOGWV7hKBVg25aSJQSjlOqZUItETgZmsiEJF4EZktIptEZKOIjBeRRBGZLyJbrdsEO2NQSqkjaSJoyO4SwT+Az4wxA4DhwEbgHmCBMaYvsMC6r5RSflNWlwi0aghsTAQiEgucAswEMMZUGmMKgAuA16zDXgMutCsGpZTyRBuLG7KzRNALyAVeEZGVIvKSiEQBnY0x2QDWbScbY1BKqaMcbizWRAD2JoIQYCTwvDFmBFBCM6qBROQGEckQkYzc3Fy7YlRKOZC2ETRkZyLIBDKNMUus+7NxJ4Z9IpICYN3u93SyMWaGMSbdGJOenJxsY5hKKacprasa0jYCsDERGGNygD0i0t/adQawAfgImGbtmwbMsSsGpZTypExLBA3YnQ5/A/xHRMKA7cA1uJPPOyIyHdgNXGpzDEop1UBJpYvQYCE0WIdSgc2JwBizCkj38NAZdr6uUkodS1llNR1CtTRQS9OhUspxSitd2j5QjyYCpZTjlFa5iAzXEkEtTQRKKccprdBFaerTRKCUcpzSSheRoVo1VEsTgVLKccqqXDqquB5NBEopxymtdBGlbQR1NBEopRynrNJFB60aqqOJQCnlOCWV2lhcnyYCpZTjuMcRaCKopYlAKeUorhpDZXWNNhbXo4lAKeUotTOPRunI4jqaCJRSjqKL0hxNE4FSylFKdArqo2giUEo5SqmuV3wUTQRKKUc5XDWkbQS1NBEopRyldr3iKC0R1PEqEYjIrSISK24zRWSFiEyxOzillPK1Um0sPoq3JYJrjTGHgClAMu4lJ/9iW1RKKWUTXbj+aN4mArFuzwFeMcasrrdPKaXajFLtNXQUbxPBchH5HHcimCciMUCNfWEppZQ9yjQRHMXbstF04ERguzGmVEQScVcPKaVUm3K4RKBVQ7W8LRGMBzYbYwpE5BfA/UChfWEppZQ9SiurCQsJIjhIa7dreZsIngdKRWQ4cDewC3jdtqiUUsomOvPo0bxNBNXGGANcAPzDGPMPIMa+sJRSyh7u9Yo1EdTnbSVZkYjcC1wFTBSRYCDUvrCUUsoeZVXVRIZr+0B93pYILgcqcI8nyAG6AU80dZKI7BSRtSKySkQyrH2JIjJfRLZatwktjl4ppZpJq4aO5lUisD78/wPEici5QLkxxts2gknGmBONMenW/XuABcaYvsAC675SSvlFSUW1rkVwBG+nmLgMWApcClwGLBGRqS18zQuA16zt14ALW/g8SinVbEXl1URp1VAD3r4b9wGjjTH7AUQkGfgCmN3EeQb4XEQM8IIxZgbQ2RiTDWCMyRaRTi0LXSmlmq+kspqYCE0E9Xn7bgTVJgHLQbwrTUwwxmRZH/bzRWSTt4GJyA3ADQA9evTw9jSllDqm4vJqosK1jaA+bxuLPxOReSJytYhcDXwC/K+pk4wxWdbtfuADYAywT0RSAKzb/Y2cO8MYk26MSU9OTvYyTKWUOraSChfR4drpsT5vG4vvAmYAw4DhwAxjzO+OdY6IRFlzEiEiUbhnLl0HfARMsw6bBsxpWehKKdU8FdUuKl01RGuJoAGvK8qMMe8B7zXjuTsDH4hI7evMMsZ8JiLLgHdEZDqwG3cDtFJK2a6kwj3PULQ2FjdwzHdDRIpwN/ge9RBgjDGxjZ1rjNmOu/Rw5P6DwBnNjFMppY5bcbl7LQLtNdTQMd8NY4xOI6GUajeKK9yJQHsNNaRrFiulHKM2EWiJoCFNBEopxyixEoG2ETSkiUAp5RhFWjXkkSYCpZRjaGOxZ5oIlFKOoVVDnmkiUEo5Rm3VkM4+2pAmAqWUY7inoA4mSNcrbkATgVLKMYp1CmqPNBEopRyjuLKaaO0xdBRNBEopxygur9aGYg80ESilHKOkQhOBJ5oIlFKOUVyhbQSeaCJQSjlGcUU1MZoIjqKJQCnlGFoi8EwTgVLKEYwx7jYC7TV0FE0ESilHqKiuocpltLHYA00ESilHKNZ5hhqliUAp5Qg64VzjNBEopRyhSKegbpQmAqWUI5ToojSN0kSglHIEXa+4cZoIlFKOoI3FjdNE4GP3vr+GP85ZF+gwlFJH0ETQOH1HfGzpjjx+zC1hRI94LhqRGuhwlFKWul5D2kZwFNtLBCISLCIrRWSudT9NRJaIyFYReVtEwuyOwZ/Kq2oAuP+Ddew6WBLgaJRSldU1FFdU1y1cHxkaHOCIWh9/VA3dCmysd/+vwNPGmL5APjDdDzH4TUW1i9P6JxMcJNw1ew3GmECHpJSjPfvlVkY/+gWLth4gOjxEl6n0wNZEICKpwE+Bl6z7ApwOzLYOeQ240M4Y/K28qoZeSdHcc/ZAlu7I48NVeyksreLBj9azIetQoMNTynHW7C2krMrF6j0FRIVracATuyvL/g7cDcRY9zsCBcaYaut+JtDN5hj8qrzKRURoED8b3Z13Mvbwp0828s8F29hxoISt+4v4z3XjAh2iUo6yO6+UU/olExYcRI2W0D2yrUQgIucC+40xy+vv9nCox9+MiNwgIhkikpGbm2tLjL5W7aqhusYQERpMUJDw6IVDyCup5FBZFRee2JXvth1kY7aWCpTyl5oaQ2ZeGQO7xPDStHRmTksPdEitkp0lggnA+SJyDhABxOIuIcSLSIhVKkgFsjydbIyZAcwASE9PbxNpvLza3VAcEerOr0O6xfHur04iNaEDESHBzFu/j5e/3cETlw4PZJhKOca+onIqXTV0T4wEwF07rY5kW4nAGHOvMSbVGNMT+BnwpTHm58BCYKp12DRgjl0x+Ft5lQuAiHq9EkadkEDn2AjiIkOZOiqVOauyyC2qCFSISjnK7oOlAHWJQHkWiAFlvwPuEJFtuNsMZgYgBlvUJYIQzw1S10zoSaWrhjcW7/JnWEo51p78MgB6aCI4Jr8kAmPMV8aYc63t7caYMcaYPsaYS40x7ebrce0YgvBQz29rr+RozhjQif8s3lWXNJRS9tmdV4oIdIvvEOhQWjWdYsKHPFUNHWn6yWkcLKlkzqq9/gpLKcfak1dK17gOhIXoR92x6LvjQxXVTSeC8b07MqBLDDO/3aGDzZSy2e68UronammgKZoIfKi2aijiGN8+RITpJ6exZV8x3/940F+hKeVIu/NKtX3AC5oIfMibqiGA84Z3Ja5DKO9k7PFHWEo5Ulmli9yiCk0EXtBE4EN1JYImEkFEaDDnD+/KZ+tyKCyr8kdoSjnOnnztOuotTQQ+dLhE0PTbOnVUKhXVNXyyJtvusJRypNoxBFoiaJpOzO1D5V40FtcalhpH307RzF6+hyvH9rA7NKUcY0PWIR6ft4mcwnJAE4E3tETgQ4cbi5tOBCLCpemprNhdwKYcnX/Il1w12hvLyeas2ss3Ww8gIpw5qDOJUe1qyRNbaCLwodqqocYGlB1p6qjuxEaE8OjcjQHtSlpZXcMzC7Zyz3trqHLVBCwOX3h72W7G/vkLtucWBzoUFSDrsw4xMCWGT2+dyIu/TNf5hbygicCHKqpciEC4l4NXEqPC+O2U/ny77QCfrsuxOTrP9uSVcsFz3/Hk/C28tcw9bXZbtimniAPFlVz3eoY2xDuQMYb1WYUMTokLdChtiiYCHyqvriE8JKhZ30B+PrYHA1NieXTuBsoq/T/txHMLt7HrYAkvXDWK605O49Xvd/L2st1+j8NX8ksqiQoLZvfBUn49a0VA3lMVOFmF5eSXVjGkW2ygQ2lTNBH4kHtRmuatgBQSHMQffjqQrMJyPl7tcUZu2xhjWLQll1P7JfOTwV245+wBTOybxD3vr+Wlb7a3yZHP+aVV9OkUzZ8vHsq32w7wi5lLKCitDHRYyk/W7y0EYFBXLRE0hyYCHyqvcnnVUHyk8b070qdTNLOW+veb+Lb9xWQXlnNKv2TAnZRmXJXOWYO78OgnG3ns001+jccX8ksrSYgK47L07jx35UjWZhZy2t++4qY3l/PN1raxwJFqufVZhxCBgSkxTR+s6jgiERSWVVFUbn99cXlVjVdjCI4kIlw5pger9hT4dV3jRVvcH4y1iQCgQ1gwz105kl+M68GMr7czd41/SynHK6+kksRIdy+Rc4am8PaN4zhjQGeW78pn+msZbM4pCnCEyk7rswrpnRxNZJj2jG8ORySCX89awe1vr7b9dVpSNVTr4pHdCA8JYtZS/61VsGhLLn06RR81RW9QkPDAeYMZ0SOee95by66DJX6L6Xjll1QSH3m4u+CIHgk8edlw/nfrRGIjQrj1rZU6BXg7U1BayZ8+2UBuUQXrsw4xuKu2DzSXIxLBroOlLNuZZ3udd3l1DeEtTATxkWH8dGgKH67MorDUH6UXF0t35HFK32SPj4cGB/HMFSMIErhixmKW7cyzPabjVVHtoqTSRWJU6FGPJUWH88Slw9mUU8RfP2t7VV6qcd9uO8CL3+zg0n9/T3ZhuSaCFnBEIsgvqaSwrIpMa7Uiu7jbCFr+ll5/Si/Kqlz85TP7u3Au2ZFHRXUNp/RLavSY1IRI3rxuLKEhQVz+wg/8t4k2jGpXDQs376eyOjBjEQqsBJrQyACiSf07cfVJPXnlu518tXm/P0NTNsoucI8gzjnkvh2sDcXN1u4TQUW1i6KKagDWWT0KbHut46gaAhiYEsv0k9P479I9LN1h7zfw/63JJiosmLFpHY953LDUeD65ZSLje3fk4Y83kFXQeDJ94evtXPPKMv4SoEbmvBJ376DEyMZHkt5z9gD6d47hznfXcKC43SyO52h7C8qIDg/hjeljuTy9O6NOSAh0SG1Ou08EBfWqWdbanAha2lhc322T+9ItvgO//2At1T4c5VtZXcOcVXupctVQVunik7XZnDM0hQ5hTSeu6PAQ/nLxMAyGR+ZuANwfuvXr2vfklfLMl1uJjQjh5e928MWGfT6L3Vv5ViKIP0YiiAgN5p9XjOBQeRW3vrUyYKUX5TtZBWWkxEUwumcif5067Li+jDlVu08EB4sP9yFfZ3OPnPLq4ysRAESGhfCHcwexbX8xc304M+mn67K59a1VvLDoR+atz6G4oppLRqV6fX73xEh+PakPn67LYfJTixj5yHwG/vEzJj7+JXfPXs1ds1cTJMJHvz6ZQSmx3DV7NTsP+LeROd9K+k3NLdO/Swx/vmgo3207yO8/WNsmx0uow7ILy+mqaxIfl3afCPKtwUQndIxk3d5CW//pWzqO4EhTBnVmQJcYnl24jRofTaC2fFc+AP/8chv/XvQj3RM7MKZnYrOe4/pTejGuVyIdo8K46yf9ue2MfgzpGsen63JYvD2PW8/oS8+kKJ77+UhEhJ+/tIRMa054f8izftcJHhqLjzR1VCq3nNGX2cszufWtVezJaxhnW59zyUmyCsroGh8R6DDatHbf2ba23viUvsm8sXiXrd8efFE1BO7umzdP6sNv/ruSeetzOHtoSrPO33WwhNSESIKDDk91sWJ3PoNSYsnML2VTThG3Te5LUFDzJuMKDwnmrRvGH7W/ylXD1n3FdYN40pKieGP6GK6YsZgrX1zCnJsnNNqA60u1VUMJx6gaqu/2yX3BGF74ejufrssmNSGS8JAgcg6VU1xezf0/HcjVE9LsDFkdp/IqFwdLKukapyWC49HuSwS1ieBUa9CUne0ExzOO4EjnDE2hV1IUzy7c1mQpZtWegrqGz637ijj9yUXc98HausdLKqrZmF3EGQM78cB5g4kMC+aSkd5XCzUlNDiIQV1jG8yxNLhrHK9eO4bswjLufm+NX6pf8koqiQkPITTYuz9rEeGOKf1ZdNckrj05jSHd4uieGMk5Q1MYk5bIQ3M38OlaXTioNcu21hxI0aqh4+KIRCDinsYhOEhs6zlkjKHiOMYRHCnYKhWszzrEvPWNN7zOWbWXi/71HTe8noExhpe+2YGrxvDWsj18/+MBAFZnFuCqMYw8IYFLRqWy5oEpflm+b2SPBH531gDmb9jHm4vtHyhXYE0v0Vxd4iK49+yBPHPFCF78ZTp/vmgoL189mhHd47n17VV176NqfbKtXmxaNXR8HJEI4jqEEhUeQt9O0azaU2DL61RU165X7Lu39MIR3eidHMVT8zd7XGzl8/U53PHOalJiI1ixu4CXv9vJByv3MnVUKid0jOTe99dSVulihdU+MLK7u1tdiJffmH3h2glpnNY/mUc+2Wj7Ajx5pVU+q4KKCA3mpWmj6dkxkumvZrB4+8G6x5bvyueRuRsoraz2yWuplttbmwi0aui42PaJICIRIrJURFaLyHoRecjanyYiS0Rkq4i8LSK2Vh7nlVbW9SJJ75nAyt0FtqxgVbdesQ8ai2sFBwm3n9mPLfuKj5rzxxjD/R+uY2BKDJ/dfgqDu8byyNwNVNXUcPOkPjx20VB2HSzlj3PWsXxXPn07RRMX2XQjqq8FBQl/u3Q4cR1C+c2slbZOC51fUkmCD68xMSqM/1w3jm4JHbjmlWW8tXQ3q/YUMO3lpcz8dgdXv7yM4gpNBoFUWzXUJU5LBMfDzq+GFcDpxpjhwInAWSIyDvgr8LQxpi+QD0y3MQby601Cln5CIsUV1bZ8M61bptLHfZjPGZLCgC4xPD1/S4NxBZtyithfVMEvx/ckNiKUP547CIDJAzuTlhTFSX2SuOX0Pry7PJNFW3IDOsgmKTqcpy87kW25xTxsjUOwQ/0J53wlOSacWdePZXj3OO55fy2XPP89CVGhPHT+YJbvzueaV5ZSUa1zFwVKVkEZSdFhOnbgONmWCIxb7XqBodaPAU4HZlv7XwMutCsGcH84JNQrEcDhrpS+VFci8GHVELi/Uf92Sn92Hizl/RV76/bXTqk8sa97ioixvTry/M9H8uD5g+uOuW1yPyYP7EyNcdfXB9LJfZO44ZRe/Hfpbr7cZM9gs5a2ETSlU0wEs64bxyMXDGZsWiKzrhvHtJN68vfLT2TZznwe/Mi+5OZUrhrjsYPBgo372G9NJQHuhWh0DMHxs7WyWESCRWQVsB+YD/wIFBhjasvTmUA3O2PIK6mko/Xh0C2+AylxESzbaUMiqK5NBL7/ZjJ5YCeGp8bxjwVb6759frP1AP06R5NSr2707KEpDWYSDQoSnr58OHec2Y+zh3bxeVzNdceZ/RjQJYbfvbe2rqunr5RX1U44Z09NY1CQcNX4nsy6flxdQ/t5w7vyf6f15r9Ldzc5D5PyXnZhGT/5+9dcNXNpg6q3ZTvzmP5aBuc+821dW1/tqGJ1fGxNBMYYlzHmRCAVGAMM9HSYp3NF5AYRyRCRjNzcli0oYoypW6jEek5GnZBAhg0zaR6uGvL9WyriLhXsLSjjraV7KK9ysWRHHhMbmTm0vpiIUG45oy8xEf5vHzhSeEgwT142nPySSu6fs86nXUprpxKJ93M7yG+n9Gdi3yTufX8tf/1skw5Ea6an529h4uNfMt+akmRPXik/m7GY7IIyfth+kKtmLqlbe/pfC7eREBlKmDUJ4vwN+8guKNMSgQ/4pfuIMaYA+AoYB8SLSO1AtlTA48onxpgZxph0Y0x6cnLTH3ieFFVUU+UyDeqNR/dMJLuwvK63ga/Y0Vhc38S+SYxJS+TxzzbxwqLtVFZu1CoAAAAUyUlEQVTX1FULtSWDu8Zx+5n9+GRNNq99v9Nnz+vNhHN2CA4SXvxlOleM6cHzX/3ItJeX6noHzfDByr1k5pdx/esZjHxkPhMfX0hecSVvXDeW564cybq9hVz54mK+33aAhZtzuXZCGnNunsCAlFhuenM5JZUu7THkA3b2GkoWkXhruwMwGdgILASmWodNA+bYFUNt9UP96oLaRlNflwpq//l9NY7gSCLCM1eMIDkmnKe/2EJYSFCTM4e2Vjed2pvJAzvx6CcbeWHRj9w9ezXPLNjarAngKqpdvP7DzroEUFA3vYR/EwG4qwMfu3goT0wdxg/bD3LLf1dS5aph2/5idh8s1bmMGrHzQAm780q5/6eDuO+cgZw+oBO/P2cAc349gZE9EjhrSBdm/DKdbfuL+cXMJUSFBfPL8T3pGB3OG9PHMKSbe7ppLREcPzunmEgBXhORYNwJ5x1jzFwR2QC8JSKPAiuBmXYFcNBDIhiYEktMRAhzVmVx/vCuDUbDHg87q4ZqdY6NYNb14/jZjMUMSon1aubQ1igoSHjyshO54NlveezTTcREhFBUXs3nG/bxzBUj6JkU1eRzfLYuhz/OWc+zX27jsYuH1k2PbVcbgTcuTe9OSUU1D368gaEPzqv7m+gUE85Np/XmGp2uooHaDg+nD+hEWiO/80n9O/HKNaO54fXlXHtyWl0X6NiIUN6YPoY3F+/m1P4tqzFQh9mWCIwxa4ARHvZvx91eYDtPJYLgIOE3p/fhz//bxLz1+zhzUGe+3prLuLSOx/XBWmFjY3F9XeM78OVvT6XahrEQ/hTXIZTZN51EblEF/TvH8PmGffzuvTVc8eJiPrx5Ap1jj90AuCazkPCQIGIiQpj+Wkbd/o4BTAQAV09IIywkmDWZBYw8IYGK6ho+XZvNQx9voLTSRWpCB2Z+u4NLRqYy7aSeAY010BZtOUD3xA707HjsUe4n9U4i4/7JhB+x6FNMRCg3ndbbzhAdo11POuepRABwzYQ0PliZxQMfreOFr39k5e4Cbjm9D3dM6d/i1zrcfdT+b+khwUHY1BThV0nR4SRFhwNw1pAudE/swGX//oFrX13GOzeOJyq88T/PNZkFDO4ay5vXjeXLTfsprXSRHB1OR+v5AunKsT24cmyPuvtXjO7Ob99dzRPzNgOQEBnKAx+tZ39ROXdO6e+zUmlbUlldww8/HuCCEd28un4dJ2Cvdj3FRN1slEckgtDgIB67eCj7iyrYeaCEtKQo5q7NPq663LqqoeNYqtLpBneN49krR7Ix+xA3vrG80UZXV41h3d5DDEuNJzIshHOHdeWy9O5MGtDJzxF7JyQ4iCcvHc6dU/rxzytGsPS+yVwxpgfPLfyRe9/37QJErV1eSSWzl2fy3opMSipdja6ZrfyrXZcI8korCQsJIspDlc+J3eOZc/MEusV34NN1Odz/4To27ytiQJeWLXztzxJBezZpQCcenzqcu2av5sY3lvPCVaOOek+37S+mrMrFsNS2szZtSHAQvz69b939P180hOToMP755TbySir55xUjHPG38+biXTw1fwvgrqYd37ttdnhob9r119e8YveUA40VPYelxtMxOpyzhnQhSNzr+LZUbYngyHpM1XxTR6Xyl4uHsmhLLte8sqyuH3mtNZnuwUTDUuMDEZ5P1E6B/dD5g5m/cR+/eGmJzwfZtUZ78kpJig7juStH8uIvRxHXIfDjW1Q7TwT5Xk45kBQdzti0jnxyHNVD5dUuQoLErzN7tmeXj+7B05cPJ2NXHpf++3te+W4Hc1btpbzKxZrMQqLDQ+jlRe+i1m7aST157sqRrNlbyCX//p6cwvKmT2rDsgrL6J4YyU+HpXD6gM6BDkdZ2nXV0MUjUynxcnbIc4Z24Q9z1vPVllwm9W9+XbMvF6VRbheNSKVzTAT/N2sFD33sns9nUv9kcosrGNItttkrrLVW5wxNISk6nGtfXcYvZi7hnRvHB7QbrJ2yCsoZ1LVl1a/KPu366+s5Q1O4NL2718d2jg3nmleWtaiY7qtlKlVDJ/VJIuO+yaz8w5k8eN4gFm7OrWsobk/GpCXy0rR09uSVMu3lpWzPLW76pDbGGMPegrIG82Gp1kE/uSwdo8NZeOdp3HfOQL7/8QAzvtnerPMrqlyEt4c+na1QSHAQCVFhXD0hjRtP7QXAiO7tKxEAjOvVked/MZIfc4uZ8vTX3D17Ne+vyGT3wdJAh+YTB4orqayu0UTQCmkiqCcyLITrT+nF2UNSeHPxLorKq446ZuHm/dw8a0WDqXDB3UagJQL7/e4nA5h1/VimDA78bKp2OH1AZxbdNYkrxvTgo9VZ3PHOak5/8ive8MNSn3bLqltWUhNBa6OfXB7ccEovisqreWvpngb7XTWGhz/ewCdrsjn/2e/qeq9AbdWQlgjsFhQknNQ7ieB20j7gSXJMOI9cOIR1D/6Ez28/hYl9k/jDh+u474O1bXp20yxdX7jV0kTgwfDu8Yzv1ZGZ3+5oMBHavPU57DhQwq1n9CU4SLhq5lLySyoxxpBVUEZUWLtue1d+FhIcRL/OMbw0bTQ3ntqL/yzZzVUzl9RNtNfW1M74q1VDrY8mgkbcdFpvcg6V8/oPOwF3Q9fzX/1IWlIUt5zRl5evHk1ReRXPLtzG3DXZbMop4qKRtq6xoxwqOEi49+yBPH35cFbsLuCC575lc05RoMNqtqyCciLDgnXsQCukiaARE/smcVr/ZP7+xVb2F5Xz8Zps1u4t5MZTehEcJPTvEsNl6d15/YedPDJ3A4NSYrnMyx5KSrXERSNSeefG8VRU1XDxv75j3vqcQIfULFnWIjJOnFuptdNE0AgR4YHzBlNZXcOVLy7h1rdWMqRbbINv/Xec2Y+QoCD2F1XwwHmD2nW9tWodTuwez8e/OZk+naK58Y3lPPa/jQ3aDXYdLGHb/uJWuQZCVqF2HW2tNBEcQ1pSFNdNTGPb/mIuHpHKuzee1KCLaKfYCP46dRh3/aQ/Y3vpnCnKPzrHRvD2jeP5xbgevPD1dq58cTE5heV8sDKT059cxOSnFjH6Twt4q5nrKL/87Q4u+td37Mk73F3VGEN5lYsaL6c9zyks5/4P19atNVDf3nxdVrK1ktb4zeFI6enpJiMjo+kDbeCqMWzMPsTgrrFapFWtzpxVe7n3/bWEBAmHyqsZ1yuRC07sxocr97JkRx53TunHzZP6ePzbNcZwqKyauMhQ/rc2m//7zwrAvZDOzZP68MHKvazdW4irxtA1LoLrJvZidM9EDpZUEBwkxHUIZXtuCav2FJCWFEVaUhR3z15DjtW1+pR+yTx8/mB6JkVRXuViwB8+484p/RpMvqfsJSLLjTHpTR2n3VyaEBwkdUviKdXaXHBiNwZ3jeW2t1eRlhTNE1OHEREazNRRqdw9ew1/+3wL+aVV3HfOwLopOSqra3jlux28nbGH7bkldIvvwIHiCkb2iOeh84dw3evLeOCj9fRKiuL6ib2IiQhh0eZcHp67wWMM4SFBVFi961LiIvjw5glk7MzjHwu2ctY/vubOKf05zVpFTEsErZOWCJRqp2pqDA/P3cCr3+/kkpGp/PWSoYQEB/Hwxxt4+bsdjO6ZwCl9k9mQfYiC0iqeuXIESdHh7D9UzvYDJYzpmdhgPqfVewrIOVROUnQYrhr3OtHdEjowoEssOw+WsGJXPqf2T6ZTjHucQE5hOfd9sJYFm/bTLb4DewvKeOuGcYzTalS/0RKBUg4XFCQ8cN4gEqPCeGr+FvYXlXPlmB68/N0Opo0/gYcuGOLxvE6xEXTysFTo8O7xDG/ktXonR9M7ObrBvi5xEbw0LZ0PV+3lwY/cpYnuicdellIFhiYCpdoxEeGWM/rSJTaC33+wlm+2HqB3chT3nD3Qb69/0YhUJvRJYlN2kfYaaqU0ESjlAJeN7k73xEiemr+ZB84bTAcPq/bZqVNMRF2VkWp9NBEo5RDje3fk3d4nBToM1QrpOAKllHI4TQRKKeVwmgiUUsrhbEsEItJdRBaKyEYRWS8it1r7E0VkvohstW4T7IpBKaVU0+wsEVQDvzXGDATGATeLyCDgHmCBMaYvsMC6r5RSKkBsSwTGmGxjzApruwjYCHQDLgBesw57DbjQrhiUUko1zS9tBCLSExgBLAE6G2OywZ0sgE7+iEEppZRnticCEYkG3gNuM8YcasZ5N4hIhohk5OYePaWtUkop37B10jkRCQXmAvOMMU9Z+zYDpxljskUkBfjKGNO/iefJBXa1IIQ4oNBHx3p63Jt9x7pffzsJOOBlrMei13x8x+o1e79Pr7n1X/MJxpjkJs80xtjyAwjwOvD3I/Y/Adxjbd8DPG5jDDN8daynx73Zd6z7R2xn6DXrNes16zXbdc3H+rFziokJwFXAWhFZZe37PfAX4B0RmQ7sBi61MYaPfXisp8e92Xes+82Jz1t6zcd3rF6z9/v0mtvWNTeqTaxH4AQikmG8mDe8PdFrdga95tZPRxa3HjMCHUAA6DU7g15zK6clAqWUcjgtESillMNpIlBKKYfTRKCUUg6niaANEJEoEVkuIucGOhZ/EJGBIvJvEZktIjcFOh5/EZELReRFEZkjIlMCHY8/iEgvEZkpIrMDHYtdrP/f16zf7c8DHY8nmghsJCIvi8h+EVl3xP6zRGSziGwTEW9mX/0d8I49UfqWL67ZGLPRGPMr4DKgTXTB89F1f2iMuR64GrjcxnB9wkfXvN0YM93eSH2vmdd+MTDb+t2e7/dgvaCJwF6vAmfV3yEiwcBzwNnAIOAKERkkIkNFZO4RP51EZDKwAdjn7+Bb6FWO85qtc84HvsU9VXlb8Co+uG7L/dZ5rd2r+O6a25pX8fLagVRgj3WYy48xek0Xr7eRMeZra+bV+sYA24wx2wFE5C3gAmPMY8BRVT8iMgmIwv2HVSYi/zPG1Nga+HHwxTVbz/MR8JGIfALMsi9i3/DR71pwj7z/1FhTuLdmvvpdt0XNuXYgE3cyWEUr/fKticD/unH42wG4/0jGNnawMeY+ABG5GjjQmpPAMTTrmkXkNNzF6XDgf7ZGZq9mXTfwG2AyECcifYwx/7YzOJs093fdEfgTMEJE7rUSRlvV2LX/E3hWRH6KPdNQHDdNBP4nHvY1OarPGPOq70Pxm2ZdszHmK+Aru4Lxo+Ze9z9xf2i0Zc295oPAr+wLx688XrsxpgS4xt/BNEerLKa0c5lA93r3U4GsAMXiL068ZnDmdTvxmmu12WvXROB/y4C+IpImImHAz4CPAhyT3Zx4zeDM63biNddqs9euicBGIvJf4Aegv4hkish0Y0w18GtgHu51nN8xxqwPZJy+5MRrBmdetxOvuVZ7u3addE4ppRxOSwRKKeVwmgiUUsrhNBEopZTDaSJQSimH00SglFIOp4lAKaUcThOB8jkRKfbDa5zv5RTevnzN00TkpBacN0JEXrK2rxaRZ30fXfOJSM8jp1H2cEyyiHzmr5hUYGgiUK2WNa2vR8aYj4wxf7HhNY81/9ZpQLMTAfB74JkWBRRgxphcIFtEJgQ6FmUfTQTKViJyl4gsE5E1IvJQvf0finvVtfUickO9/cUi8rCILAHGi8hOEXlIRFaIyFoRGWAdV/fNWkReFZF/isj3IrJdRKZa+4NE5F/Wa8wVkf/VPnZEjF+JyJ9FZBFwq4icJyJLRGSliHwhIp2tKYd/BdwuIqtEZKL1bfk96/qWefqwFJEYYJgxZrWHx04QkQXWe7NARHpY+3uLyGLrOR/2VMIS96pXn4jIahFZJyKXW/tHW+/DahFZKiIx1jf/b6z3cIWnUo2IBIvIE/V+VzfWe/hDoFWurKV8xBijP/rj0x+g2LqdAszAPStjEDAXOMV6LNG67QCsAzpa9w1wWb3n2gn8xtr+P+Ala/tq4Flr+1XgXes1BuGeEx5gKu5prIOALkA+MNVDvF8B/6p3P4HDo+6vA560th8E7qx33CzgZGu7B7DRw3NPAt6rd79+3B8D06zta4EPre25wBXW9q9q388jnvcS4MV69+OAMGA7MNraF4t7huFIIMLa1xfIsLZ7Auus7RuA+63tcCADSLPudwPWBvrvSn/s+9FpqJWdplg/K6370bg/iL4GbhGRi6z93a39B3Gv4PTeEc/zvnW7HPc6BZ58aNxrNWwQkc7WvpOBd639OSKy8Bixvl1vOxV4W0RScH+47mjknMnAIJG62YdjRSTGGFNU75gUILeR88fXu543gMfr7b/Q2p4F/M3DuWuBv4nIX4G5xphvRGQokG2MWQZgjDkE7tID7vnwT8T9/vbz8HxTgGH1SkxxuH8nO4D9QNdGrkG1A5oIlJ0EeMwY80KDne6FZyYD440xpSLyFRBhPVxujDlyOb8K69ZF43+zFfW25Yhbb5TU234GeMoY85EV64ONnBOE+xrKjvG8ZRy+tqZ4PfGXMWaLiIwCzgEeE5HPcVfheHqO23EvdTrcirncwzGCu+Q1z8NjEbivQ7VT2kag7DQPuFZEogFEpJu416mNA/KtJDAAGGfT638LXGK1FXTG3djrjThgr7U9rd7+IiCm3v3Pcc82CYD1jftIG4E+jbzO97inKgZ3Hfy31vZi3FU/1Hu8ARHpCpQaY97EXWIYCWwCuorIaOuYGKvxOw53SaEGuArw1Ag/D7hJREKtc/tZJQlwlyCO2btItW2aCJRtjDGf467a+EFE1gKzcX+QfgaEiMga4BHcH3x2eA/3YiHrgBeAJUChF+c9CLwrIt8AB+rt/xi4qLaxGLgFSLcaVzfgYaUtY8wm3EtPxhz5mHX+Ndb7cBVwq7X/NuAOEVmKu2rJU8xDgaUisgq4D3jUGFMJXA48IyKrgfm4v83/C5gmIotxf6iXeHi+l4ANwAqrS+kLHC59TQI+8XCOaid0GmrVrolItDGmWNxr4y4FJhhjcvwcw+1AkTHmJS+PjwTKjDFGRH6Gu+H4AluDPHY8X+NegD4/UDEoe2kbgWrv5opIPO5G30f8nQQszwOXNuP4UbgbdwUowN2jKCBEJBl3e4kmgXZMSwRKKeVw2kaglFIOp4lAKaUcThOBUko5nCYCpZRyOE0ESinlcJoIlFLK4f4ffyw/VkcfnToAAAAASUVORK5CYII=\n", 327 | "text/plain": [ 328 | "Failed to display Jupyter Widget of type HBox.
\n", 368 | " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", 369 | " that the widgets JavaScript is still loading. If this message persists, it\n", 370 | " likely means that the widgets JavaScript library is either not installed or\n", 371 | " not enabled. See the Jupyter\n", 372 | " Widgets Documentation for setup instructions.\n", 373 | "
\n", 374 | "\n", 375 | " If you're reading this message in another frontend (for example, a static\n", 376 | " rendering on GitHub or NBViewer),\n", 377 | " it may mean that your frontend doesn't currently support widgets.\n", 378 | "
\n" 379 | ], 380 | "text/plain": [ 381 | "HBox(children=(IntProgress(value=0, description='Epoch', max=10), HTML(value='')))" 382 | ] 383 | }, 384 | "metadata": {}, 385 | "output_type": "display_data" 386 | }, 387 | { 388 | "name": "stdout", 389 | "output_type": "stream", 390 | "text": [ 391 | "[ 0. 2851.906 108.26713] \n", 392 | "[ 1. 141.87092 74.62755] \n", 393 | "[ 2. 80.8053 74.09294] \n", 394 | "[ 3. 62.1405 48.24689] \n", 395 | "[ 4. 72.05487 42.68179] \n", 396 | "[ 5. 66.26097 38.59779] \n", 397 | "[ 6. 56.03842 51.331 ] \n", 398 | "[ 7. 76.14901 53.62796] \n", 399 | "[ 8. 62.7081 48.69091] \n", 400 | "[ 9. 66.54783 36.87793] \n", 401 | "\n" 402 | ] 403 | } 404 | ], 405 | "source": [ 406 | "lr = 0.055\n", 407 | "model.fit(lr, 10)" 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": 201, 413 | "metadata": {}, 414 | "outputs": [ 415 | { 416 | "data": { 417 | "application/vnd.jupyter.widget-view+json": { 418 | "model_id": "740ef2d6727b4b0287b47866c610585d", 419 | "version_major": 2, 420 | "version_minor": 0 421 | }, 422 | "text/html": [ 423 | "Failed to display Jupyter Widget of type HBox.
\n", 425 | " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", 426 | " that the widgets JavaScript is still loading. If this message persists, it\n", 427 | " likely means that the widgets JavaScript library is either not installed or\n", 428 | " not enabled. See the Jupyter\n", 429 | " Widgets Documentation for setup instructions.\n", 430 | "
\n", 431 | "\n", 432 | " If you're reading this message in another frontend (for example, a static\n", 433 | " rendering on GitHub or NBViewer),\n", 434 | " it may mean that your frontend doesn't currently support widgets.\n", 435 | "
\n" 436 | ], 437 | "text/plain": [ 438 | "HBox(children=(IntProgress(value=0, description='Epoch', max=10), HTML(value='')))" 439 | ] 440 | }, 441 | "metadata": {}, 442 | "output_type": "display_data" 443 | }, 444 | { 445 | "name": "stdout", 446 | "output_type": "stream", 447 | "text": [ 448 | "[ 0. 3161.95849 250.97244] \n", 449 | "[ 1. 175.02604 58.23714] \n", 450 | "[ 2. 143.91199 121.4847 ] \n", 451 | "[ 3. 100.64932 56.82617] \n", 452 | "[ 4. 100.48409 306.14642] \n", 453 | "[ 5. 54.53278 51.57714] \n", 454 | "[ 6. 62.98428 49.65561] \n", 455 | "[ 7. 107.00727 137.59152] \n", 456 | "[ 8. 50.99336 41.78915] \n", 457 | "[ 9. 58.22794 43.40128] \n", 458 | "\n" 459 | ] 460 | } 461 | ], 462 | "source": [ 463 | "lr = 0.055\n", 464 | "model.fit(lr, 10)" 465 | ] 466 | }, 467 | { 468 | "cell_type": "markdown", 469 | "metadata": {}, 470 | "source": [ 471 | "Quite Impressive! Without any tuning, we achieved accuracy of 36.877 which is still bad as compared to linear regression. Note for this tutorial. Our goal is to learn and not optimize for the best accuracy.Failed to display Jupyter Widget of type HBox.
\n", 589 | " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", 590 | " that the widgets JavaScript is still loading. If this message persists, it\n", 591 | " likely means that the widgets JavaScript library is either not installed or\n", 592 | " not enabled. See the Jupyter\n", 593 | " Widgets Documentation for setup instructions.\n", 594 | "
\n", 595 | "\n", 596 | " If you're reading this message in another frontend (for example, a static\n", 597 | " rendering on GitHub or NBViewer),\n", 598 | " it may mean that your frontend doesn't currently support widgets.\n", 599 | "
\n" 600 | ], 601 | "text/plain": [ 602 | "HBox(children=(IntProgress(value=0, description='Epoch', max=30), HTML(value='')))" 603 | ] 604 | }, 605 | "metadata": {}, 606 | "output_type": "display_data" 607 | }, 608 | { 609 | "name": "stdout", 610 | "output_type": "stream", 611 | "text": [ 612 | "[ 0. 180.57534 62.10049] \n", 613 | "[ 1. 83.37878 62.3999 ] \n", 614 | "[ 2. 55.49154 54.9498 ] \n", 615 | "[ 3. 75.46293 53.33086] \n", 616 | "[ 4. 53.62135 39.90169] \n", 617 | "[ 5. 42.08134 38.87128] \n", 618 | "[ 6. 48.64498 53.91854] \n", 619 | "[ 7. 40.48751 31.60863] \n", 620 | "[ 8. 34.10004 27.93206] \n", 621 | "[ 9. 96.70617 31.44825] \n", 622 | "[ 10. 50.85496 35.57478] \n", 623 | "[ 11. 30.64704 25.51137] \n", 624 | "[ 12. 42.23597 26.2089 ] \n", 625 | "[ 13. 39.26633 51.34911] \n", 626 | "[ 14. 26.69403 22.45991] \n", 627 | "[ 15. 41.2912 29.34616] \n", 628 | "[ 16. 36.38946 22.12777] \n", 629 | "[ 17. 26.93833 19.91111] \n", 630 | "[ 18. 47.19999 31.84199] \n", 631 | "[ 19. 40.45223 19.72345] \n", 632 | "[ 20. 35.95544 19.39541] \n", 633 | "[ 21. 27.79003 19.63288] \n", 634 | "[ 22. 38.93086 22.55372] \n", 635 | "[ 23. 24.2901 18.49149] \n", 636 | "[ 24. 43.61303 38.82179] \n", 637 | "[ 25. 43.32276 19.44667] \n", 638 | "[ 26. 27.38696 18.91724] \n", 639 | "[ 27. 39.65891 24.07587] \n", 640 | "[ 28. 31.019 21.41448] \n", 641 | "[ 29. 24.82787 20.38755] \n", 642 | "\n" 643 | ] 644 | } 645 | ], 646 | "source": [ 647 | "lr = 0.055\n", 648 | "model.fit(lr, 10,cycle_len=3)" 649 | ] 650 | }, 651 | { 652 | "cell_type": "markdown", 653 | "metadata": {}, 654 | "source": [ 655 | "Kudos! Wow! we get better than linear regression!" 656 | ] 657 | }, 658 | { 659 | "cell_type": "code", 660 | "execution_count": 188, 661 | "metadata": {}, 662 | "outputs": [ 663 | { 664 | "data": { 665 | "image/png": "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\n", 666 | "text/plain": [ 667 | "