├── Lectures and codes
├── Module 1- Introduction to Deep Learning
│ └── Module 1-Introduction to Deep Learning.pdf
├── Module 2- Setting up DL environement
│ ├── Module 2- Setting up DL environment.pdf
│ └── Python_Crash_course_2020
│ │ ├── 1-Python_Basics.ipynb
│ │ ├── 2-NumPy.ipynb
│ │ ├── 3-Pandas.ipynb
│ │ ├── 4-Matplotlib(visualization).ipynb
│ │ ├── 5-Pandas(visualization).ipynb
│ │ ├── 6-Seaborn(visualization).ipynb
│ │ ├── 7-Timeseries.ipynb
│ │ ├── GDP.csv
│ │ ├── GDP.xlsx
│ │ └── README.md
├── Module 3- Machine Learning Review
│ ├── Module 3- ML PyCaret-Classification.ipynb
│ └── Module 3-Machine Learning and boosting models review.pdf
├── Module 4- Deep Neural Networks
│ ├── DNN_python
│ │ ├── Module 4- DNN tensorflow.ipynb
│ │ ├── employee.csv
│ │ └── ticket_classifier.png
│ └── Module 4-Deep Neural Networks.pdf
├── Module 5- Deep Computer Vision
│ ├── CNN_python
│ │ ├── Module 5- CNN_Fashion_MNIST_data_augmentation.ipynb
│ │ ├── Module 5- CNN_MNIST.ipynb
│ │ └── Module 5- CNN_transfer_learning.ipynb
│ └── Module 5- Deep Computer Vision.pdf
├── Module 6- Deep Sequence Modeling
│ ├── Module 6- Deep Sequence Modeling-original.pdf
│ └── python
│ │ ├── Module 6- Deep sequence modeling-RNN-LSTM.ipynb
│ │ ├── Module 6- NLP.ipynb
│ │ └── univariate_ts
│ │ ├── Module 6- Univariate forecasting_prices.ipynb
│ │ ├── Module 6- Univariate forecasting_returns.ipynb
│ │ ├── Predictiong_stock_returns_PyCaret.ipynb
│ │ └── Univariate forecasting_plots_TensorFlow_approach.ipynb
└── Module 7- Transformers
│ ├── Module 7- Transformers.pdf
│ ├── papers
│ ├── Attention is all you need.pdf
│ └── Transformer catalog.pdf
│ └── python
│ ├── HuggingFace_Fine-tune a model.ipynb
│ ├── HuggingFace_quickTour.ipynb
│ └── Transformer_Block_from_scratch.ipynb
├── Platforms and tools
├── Google Colab
│ ├── README.md
│ └── google_colab_jumpstart.ipynb
└── PyCaret
│ ├── Predictiong_stock_price_PyCaret.ipynb
│ ├── PyCaret-ClassificationDemo.ipynb
│ ├── PyCaret-RegressionDemo.ipynb
│ ├── PyCaret-timeseries.ipynb
│ ├── PyCaret_PedramJahangiry.pdf
│ └── README.md
├── README.md
├── data
├── Logan_housing.csv
├── employee.csv
└── spam.csv
└── images
└── Jahangirylogo.png
/Lectures and codes/Module 1- Introduction to Deep Learning/Module 1-Introduction to Deep Learning.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 1- Introduction to Deep Learning/Module 1-Introduction to Deep Learning.pdf
--------------------------------------------------------------------------------
/Lectures and codes/Module 2- Setting up DL environement/Module 2- Setting up DL environment.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 2- Setting up DL environement/Module 2- Setting up DL environment.pdf
--------------------------------------------------------------------------------
/Lectures and codes/Module 2- Setting up DL environement/Python_Crash_course_2020/2-NumPy.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "attachments": {},
5 | "cell_type": "markdown",
6 | "metadata": {},
7 | "source": [
8 | "You need to make a copy to your own Google drive if you want to edit the original notebook! Start by opening this notebook on Colab 👇\n",
9 | "\n",
10 | "
\n",
11 | "\n",
12 | "\n",
13 | "\n",
14 | " \n",
15 | "\n",
16 | "\n",
17 | "## 🔗 Links\n",
18 | "\n",
19 | "[](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)\n",
20 | "\n",
21 | "[](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)\n",
22 | "\n",
23 | "[](https://twitter.com/PedramJahangiry)\n",
24 | "\n",
25 | "\n",
26 | "---"
27 | ]
28 | },
29 | {
30 | "cell_type": "markdown",
31 | "metadata": {},
32 | "source": [
33 | "\n",
34 | "\n",
35 | "# NumPy \n",
36 | "\n",
37 | "Topics to be covered:\n",
38 | "\n",
39 | "1. Numpy arrays\n",
40 | "2. Numpy indexing and extraction\n",
41 | "3. Numpy operations\n",
42 | "\n"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 1,
48 | "metadata": {},
49 | "outputs": [],
50 | "source": [
51 | "import numpy as np"
52 | ]
53 | },
54 | {
55 | "cell_type": "markdown",
56 | "metadata": {},
57 | "source": [
58 | "## 1. NumPy Arrays"
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": 2,
64 | "metadata": {},
65 | "outputs": [
66 | {
67 | "data": {
68 | "text/plain": [
69 | "[0, 1, 2, 3]"
70 | ]
71 | },
72 | "execution_count": 2,
73 | "metadata": {},
74 | "output_type": "execute_result"
75 | }
76 | ],
77 | "source": [
78 | "my_list = [0,1,2,3]\n",
79 | "my_list"
80 | ]
81 | },
82 | {
83 | "cell_type": "code",
84 | "execution_count": 3,
85 | "metadata": {},
86 | "outputs": [
87 | {
88 | "data": {
89 | "text/plain": [
90 | "array([0, 1, 2, 3])"
91 | ]
92 | },
93 | "execution_count": 3,
94 | "metadata": {},
95 | "output_type": "execute_result"
96 | }
97 | ],
98 | "source": [
99 | "np.array(my_list)"
100 | ]
101 | },
102 | {
103 | "cell_type": "code",
104 | "execution_count": 4,
105 | "metadata": {},
106 | "outputs": [
107 | {
108 | "data": {
109 | "text/plain": [
110 | "[[1, 2, 3], [4, 5, 6]]"
111 | ]
112 | },
113 | "execution_count": 4,
114 | "metadata": {},
115 | "output_type": "execute_result"
116 | }
117 | ],
118 | "source": [
119 | "my_matrix = [[1,2,3],\n",
120 | " [4,5,6]]\n",
121 | "my_matrix"
122 | ]
123 | },
124 | {
125 | "cell_type": "code",
126 | "execution_count": 5,
127 | "metadata": {},
128 | "outputs": [
129 | {
130 | "data": {
131 | "text/plain": [
132 | "array([[1, 2, 3],\n",
133 | " [4, 5, 6]])"
134 | ]
135 | },
136 | "execution_count": 5,
137 | "metadata": {},
138 | "output_type": "execute_result"
139 | }
140 | ],
141 | "source": [
142 | "np.array(my_matrix)"
143 | ]
144 | },
145 | {
146 | "cell_type": "code",
147 | "execution_count": 6,
148 | "metadata": {},
149 | "outputs": [
150 | {
151 | "data": {
152 | "text/plain": [
153 | "array([0, 1, 2, 3])"
154 | ]
155 | },
156 | "execution_count": 6,
157 | "metadata": {},
158 | "output_type": "execute_result"
159 | }
160 | ],
161 | "source": [
162 | "# Built in methods\n",
163 | "# np.arange() :Return evenly spaced values within a given interval.\n",
164 | "np.arange(0,4)"
165 | ]
166 | },
167 | {
168 | "cell_type": "code",
169 | "execution_count": 7,
170 | "metadata": {},
171 | "outputs": [
172 | {
173 | "data": {
174 | "text/plain": [
175 | "array([0, 3, 6, 9])"
176 | ]
177 | },
178 | "execution_count": 7,
179 | "metadata": {},
180 | "output_type": "execute_result"
181 | }
182 | ],
183 | "source": [
184 | "np.arange(0,10,3)"
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": 8,
190 | "metadata": {},
191 | "outputs": [
192 | {
193 | "data": {
194 | "text/plain": [
195 | "array([0., 0., 0., 0., 0.])"
196 | ]
197 | },
198 | "execution_count": 8,
199 | "metadata": {},
200 | "output_type": "execute_result"
201 | }
202 | ],
203 | "source": [
204 | "# Zeros and ones : Generate arrays of zeros or ones\n",
205 | "np.zeros(5)"
206 | ]
207 | },
208 | {
209 | "cell_type": "code",
210 | "execution_count": 9,
211 | "metadata": {},
212 | "outputs": [
213 | {
214 | "data": {
215 | "text/plain": [
216 | "array([[0., 0., 0., 0., 0.],\n",
217 | " [0., 0., 0., 0., 0.],\n",
218 | " [0., 0., 0., 0., 0.],\n",
219 | " [0., 0., 0., 0., 0.],\n",
220 | " [0., 0., 0., 0., 0.]])"
221 | ]
222 | },
223 | "execution_count": 9,
224 | "metadata": {},
225 | "output_type": "execute_result"
226 | }
227 | ],
228 | "source": [
229 | "np.zeros((5,5))"
230 | ]
231 | },
232 | {
233 | "cell_type": "code",
234 | "execution_count": 10,
235 | "metadata": {},
236 | "outputs": [
237 | {
238 | "data": {
239 | "text/plain": [
240 | "array([1., 1., 1., 1., 1.])"
241 | ]
242 | },
243 | "execution_count": 10,
244 | "metadata": {},
245 | "output_type": "execute_result"
246 | }
247 | ],
248 | "source": [
249 | "np.ones(5)"
250 | ]
251 | },
252 | {
253 | "cell_type": "code",
254 | "execution_count": 11,
255 | "metadata": {},
256 | "outputs": [
257 | {
258 | "data": {
259 | "text/plain": [
260 | "array([[1., 1., 1., 1., 1.],\n",
261 | " [1., 1., 1., 1., 1.],\n",
262 | " [1., 1., 1., 1., 1.],\n",
263 | " [1., 1., 1., 1., 1.],\n",
264 | " [1., 1., 1., 1., 1.]])"
265 | ]
266 | },
267 | "execution_count": 11,
268 | "metadata": {},
269 | "output_type": "execute_result"
270 | }
271 | ],
272 | "source": [
273 | "np.ones((5,5))"
274 | ]
275 | },
276 | {
277 | "cell_type": "code",
278 | "execution_count": 12,
279 | "metadata": {},
280 | "outputs": [
281 | {
282 | "data": {
283 | "text/plain": [
284 | "array([ 0., 5., 10., 15., 20.])"
285 | ]
286 | },
287 | "execution_count": 12,
288 | "metadata": {},
289 | "output_type": "execute_result"
290 | }
291 | ],
292 | "source": [
293 | "# linspace : Return evenly spaced numbers over a specified interval. \n",
294 | "np.linspace(0,20,5)"
295 | ]
296 | },
297 | {
298 | "cell_type": "code",
299 | "execution_count": 13,
300 | "metadata": {},
301 | "outputs": [
302 | {
303 | "data": {
304 | "text/plain": [
305 | "array([[1., 0., 0., 0., 0.],\n",
306 | " [0., 1., 0., 0., 0.],\n",
307 | " [0., 0., 1., 0., 0.],\n",
308 | " [0., 0., 0., 1., 0.],\n",
309 | " [0., 0., 0., 0., 1.]])"
310 | ]
311 | },
312 | "execution_count": 13,
313 | "metadata": {},
314 | "output_type": "execute_result"
315 | }
316 | ],
317 | "source": [
318 | "# eye: Creates identity matrix\n",
319 | "np.eye(5)"
320 | ]
321 | },
322 | {
323 | "cell_type": "code",
324 | "execution_count": 14,
325 | "metadata": {},
326 | "outputs": [
327 | {
328 | "data": {
329 | "text/plain": [
330 | "array([0.24743719, 0.23361749, 0.99695809, 0.63900589, 0.9334282 ])"
331 | ]
332 | },
333 | "execution_count": 14,
334 | "metadata": {},
335 | "output_type": "execute_result"
336 | }
337 | ],
338 | "source": [
339 | "# rand : create random samples from a uniform distribution\n",
340 | "np.random.rand(5)"
341 | ]
342 | },
343 | {
344 | "cell_type": "code",
345 | "execution_count": 15,
346 | "metadata": {},
347 | "outputs": [
348 | {
349 | "data": {
350 | "text/plain": [
351 | "array([[0.75151958, 0.80063038, 0.14451056, 0.33734486, 0.27168524],\n",
352 | " [0.91440163, 0.07305328, 0.68766001, 0.46134214, 0.39925077],\n",
353 | " [0.12292387, 0.39694622, 0.81511339, 0.74829813, 0.00304258],\n",
354 | " [0.49405795, 0.37169662, 0.60717281, 0.76731192, 0.06313865],\n",
355 | " [0.18904521, 0.64445119, 0.37663504, 0.79442819, 0.6753975 ]])"
356 | ]
357 | },
358 | "execution_count": 15,
359 | "metadata": {},
360 | "output_type": "execute_result"
361 | }
362 | ],
363 | "source": [
364 | "np.random.rand(5,5)"
365 | ]
366 | },
367 | {
368 | "cell_type": "code",
369 | "execution_count": 16,
370 | "metadata": {},
371 | "outputs": [
372 | {
373 | "data": {
374 | "text/plain": [
375 | "array([ 0.39390151, -1.00159347, -0.42107951, 1.16437189, -0.41880771])"
376 | ]
377 | },
378 | "execution_count": 16,
379 | "metadata": {},
380 | "output_type": "execute_result"
381 | }
382 | ],
383 | "source": [
384 | "# randn : create random samples from standard normal distribution\n",
385 | "np.random.randn(5)"
386 | ]
387 | },
388 | {
389 | "cell_type": "code",
390 | "execution_count": 17,
391 | "metadata": {},
392 | "outputs": [
393 | {
394 | "data": {
395 | "text/plain": [
396 | "array([[ 0.11406524, -0.25653226, -0.36776475, -0.74455242, -0.08243789],\n",
397 | " [ 0.10119703, -0.23826288, -1.39111353, 0.47035082, 0.56374782],\n",
398 | " [ 1.41655916, 0.66789595, 1.25703205, -0.59814531, -1.23362211],\n",
399 | " [ 0.17848835, 0.65575975, -0.59251051, 0.53511962, 1.30532523],\n",
400 | " [-1.97123125, 0.11010475, -1.10363541, 1.32782061, 0.16670226]])"
401 | ]
402 | },
403 | "execution_count": 17,
404 | "metadata": {},
405 | "output_type": "execute_result"
406 | }
407 | ],
408 | "source": [
409 | "np.random.randn(5,5)"
410 | ]
411 | },
412 | {
413 | "cell_type": "code",
414 | "execution_count": 25,
415 | "metadata": {},
416 | "outputs": [
417 | {
418 | "data": {
419 | "text/plain": [
420 | "4"
421 | ]
422 | },
423 | "execution_count": 25,
424 | "metadata": {},
425 | "output_type": "execute_result"
426 | }
427 | ],
428 | "source": [
429 | "# randit(a,b) : create random sample of integers from a (including a) to b (excluding b) \n",
430 | "np.random.randint(1,5)"
431 | ]
432 | },
433 | {
434 | "cell_type": "code",
435 | "execution_count": 26,
436 | "metadata": {},
437 | "outputs": [
438 | {
439 | "data": {
440 | "text/plain": [
441 | "array([1, 3, 3, 4, 4, 2, 2, 3, 2, 1, 2, 3, 1, 4, 1, 1, 1, 4, 1, 3])"
442 | ]
443 | },
444 | "execution_count": 26,
445 | "metadata": {},
446 | "output_type": "execute_result"
447 | }
448 | ],
449 | "source": [
450 | "np.random.randint(1,5,20)"
451 | ]
452 | },
453 | {
454 | "cell_type": "code",
455 | "execution_count": 27,
456 | "metadata": {},
457 | "outputs": [
458 | {
459 | "data": {
460 | "text/plain": [
461 | "array([-1.74976547, 0.3426804 , 1.1530358 , -0.25243604, 0.98132079])"
462 | ]
463 | },
464 | "execution_count": 27,
465 | "metadata": {},
466 | "output_type": "execute_result"
467 | }
468 | ],
469 | "source": [
470 | "# seed is used to fix the random state.\n",
471 | "np.random.seed(100)\n",
472 | "np.random.randn(5)"
473 | ]
474 | },
475 | {
476 | "cell_type": "code",
477 | "execution_count": 28,
478 | "metadata": {},
479 | "outputs": [
480 | {
481 | "data": {
482 | "text/plain": [
483 | "array([-1.74976547, 0.3426804 , 1.1530358 , -0.25243604])"
484 | ]
485 | },
486 | "execution_count": 28,
487 | "metadata": {},
488 | "output_type": "execute_result"
489 | }
490 | ],
491 | "source": [
492 | "np.random.seed(100)\n",
493 | "np.random.randn(4)"
494 | ]
495 | },
496 | {
497 | "cell_type": "code",
498 | "execution_count": 29,
499 | "metadata": {},
500 | "outputs": [
501 | {
502 | "data": {
503 | "text/plain": [
504 | "array([1, 2, 3, 4, 5, 6, 7, 8, 9])"
505 | ]
506 | },
507 | "execution_count": 29,
508 | "metadata": {},
509 | "output_type": "execute_result"
510 | }
511 | ],
512 | "source": [
513 | "# array methods\n",
514 | "\n",
515 | "my_array = np.arange(1,10)\n",
516 | "my_array\n"
517 | ]
518 | },
519 | {
520 | "cell_type": "code",
521 | "execution_count": 30,
522 | "metadata": {},
523 | "outputs": [
524 | {
525 | "data": {
526 | "text/plain": [
527 | "array([[1, 2, 3],\n",
528 | " [4, 5, 6],\n",
529 | " [7, 8, 9]])"
530 | ]
531 | },
532 | "execution_count": 30,
533 | "metadata": {},
534 | "output_type": "execute_result"
535 | }
536 | ],
537 | "source": [
538 | "# reshape\n",
539 | "new_array = my_array.reshape(3,3)\n",
540 | "new_array"
541 | ]
542 | },
543 | {
544 | "cell_type": "code",
545 | "execution_count": 31,
546 | "metadata": {},
547 | "outputs": [
548 | {
549 | "data": {
550 | "text/plain": [
551 | "(3, 3)"
552 | ]
553 | },
554 | "execution_count": 31,
555 | "metadata": {},
556 | "output_type": "execute_result"
557 | }
558 | ],
559 | "source": [
560 | "new_array.shape"
561 | ]
562 | },
563 | {
564 | "cell_type": "code",
565 | "execution_count": 33,
566 | "metadata": {},
567 | "outputs": [
568 | {
569 | "data": {
570 | "text/plain": [
571 | "dtype('int32')"
572 | ]
573 | },
574 | "execution_count": 33,
575 | "metadata": {},
576 | "output_type": "execute_result"
577 | }
578 | ],
579 | "source": [
580 | "new_array.dtype"
581 | ]
582 | },
583 | {
584 | "cell_type": "code",
585 | "execution_count": 34,
586 | "metadata": {},
587 | "outputs": [
588 | {
589 | "data": {
590 | "text/plain": [
591 | "numpy.ndarray"
592 | ]
593 | },
594 | "execution_count": 34,
595 | "metadata": {},
596 | "output_type": "execute_result"
597 | }
598 | ],
599 | "source": [
600 | "type(new_array)"
601 | ]
602 | },
603 | {
604 | "cell_type": "code",
605 | "execution_count": 35,
606 | "metadata": {},
607 | "outputs": [
608 | {
609 | "data": {
610 | "text/plain": [
611 | "array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 100, -100])"
612 | ]
613 | },
614 | "execution_count": 35,
615 | "metadata": {},
616 | "output_type": "execute_result"
617 | }
618 | ],
619 | "source": [
620 | "my_array = np.append(my_array, [100,-100])\n",
621 | "my_array"
622 | ]
623 | },
624 | {
625 | "cell_type": "code",
626 | "execution_count": 36,
627 | "metadata": {},
628 | "outputs": [
629 | {
630 | "data": {
631 | "text/plain": [
632 | "100"
633 | ]
634 | },
635 | "execution_count": 36,
636 | "metadata": {},
637 | "output_type": "execute_result"
638 | }
639 | ],
640 | "source": [
641 | "my_array.max()"
642 | ]
643 | },
644 | {
645 | "cell_type": "code",
646 | "execution_count": 37,
647 | "metadata": {},
648 | "outputs": [
649 | {
650 | "data": {
651 | "text/plain": [
652 | "9"
653 | ]
654 | },
655 | "execution_count": 37,
656 | "metadata": {},
657 | "output_type": "execute_result"
658 | }
659 | ],
660 | "source": [
661 | "my_array.argmax()"
662 | ]
663 | },
664 | {
665 | "cell_type": "code",
666 | "execution_count": 38,
667 | "metadata": {},
668 | "outputs": [
669 | {
670 | "data": {
671 | "text/plain": [
672 | "-100"
673 | ]
674 | },
675 | "execution_count": 38,
676 | "metadata": {},
677 | "output_type": "execute_result"
678 | }
679 | ],
680 | "source": [
681 | "my_array.min()"
682 | ]
683 | },
684 | {
685 | "cell_type": "code",
686 | "execution_count": 39,
687 | "metadata": {},
688 | "outputs": [
689 | {
690 | "data": {
691 | "text/plain": [
692 | "10"
693 | ]
694 | },
695 | "execution_count": 39,
696 | "metadata": {},
697 | "output_type": "execute_result"
698 | }
699 | ],
700 | "source": [
701 | "my_array.argmin()"
702 | ]
703 | },
704 | {
705 | "cell_type": "markdown",
706 | "metadata": {},
707 | "source": [
708 | "## 2. Numpy indexing and extraction"
709 | ]
710 | },
711 | {
712 | "cell_type": "code",
713 | "execution_count": 40,
714 | "metadata": {},
715 | "outputs": [
716 | {
717 | "data": {
718 | "text/plain": [
719 | "array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 100, -100])"
720 | ]
721 | },
722 | "execution_count": 40,
723 | "metadata": {},
724 | "output_type": "execute_result"
725 | }
726 | ],
727 | "source": [
728 | "my_array"
729 | ]
730 | },
731 | {
732 | "cell_type": "code",
733 | "execution_count": 41,
734 | "metadata": {},
735 | "outputs": [
736 | {
737 | "data": {
738 | "text/plain": [
739 | "2"
740 | ]
741 | },
742 | "execution_count": 41,
743 | "metadata": {},
744 | "output_type": "execute_result"
745 | }
746 | ],
747 | "source": [
748 | "# extraction is very similar to list extraction\n",
749 | "my_array[1]"
750 | ]
751 | },
752 | {
753 | "cell_type": "code",
754 | "execution_count": 42,
755 | "metadata": {},
756 | "outputs": [
757 | {
758 | "data": {
759 | "text/plain": [
760 | "array([7, 8, 9])"
761 | ]
762 | },
763 | "execution_count": 42,
764 | "metadata": {},
765 | "output_type": "execute_result"
766 | }
767 | ],
768 | "source": [
769 | "my_array[6:9]"
770 | ]
771 | },
772 | {
773 | "cell_type": "code",
774 | "execution_count": 43,
775 | "metadata": {},
776 | "outputs": [
777 | {
778 | "data": {
779 | "text/plain": [
780 | "array([ 100, 100, 100, 100, 100, 6, 7, 8, 9, 100, -100])"
781 | ]
782 | },
783 | "execution_count": 43,
784 | "metadata": {},
785 | "output_type": "execute_result"
786 | }
787 | ],
788 | "source": [
789 | "# With NumPy arrays, you can broadcast a single value across a larger set of values. This is not possible using lists. \n",
790 | "\n",
791 | "my_array[0:5]=100\n",
792 | "my_array"
793 | ]
794 | },
795 | {
796 | "cell_type": "code",
797 | "execution_count": 44,
798 | "metadata": {},
799 | "outputs": [
800 | {
801 | "data": {
802 | "text/plain": [
803 | "[1, 2, 3, 4, 5, 6, 7, 8, 9]"
804 | ]
805 | },
806 | "execution_count": 44,
807 | "metadata": {},
808 | "output_type": "execute_result"
809 | }
810 | ],
811 | "source": [
812 | "my_list = list(range(1,10))\n",
813 | "my_list"
814 | ]
815 | },
816 | {
817 | "cell_type": "code",
818 | "execution_count": 45,
819 | "metadata": {},
820 | "outputs": [
821 | {
822 | "data": {
823 | "text/plain": [
824 | "[1, 2, 3, 4, 5]"
825 | ]
826 | },
827 | "execution_count": 45,
828 | "metadata": {},
829 | "output_type": "execute_result"
830 | }
831 | ],
832 | "source": [
833 | "my_list[0:5]"
834 | ]
835 | },
836 | {
837 | "cell_type": "code",
838 | "execution_count": 46,
839 | "metadata": {},
840 | "outputs": [
841 | {
842 | "ename": "TypeError",
843 | "evalue": "can only assign an iterable",
844 | "output_type": "error",
845 | "traceback": [
846 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
847 | "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
848 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mmy_list\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
849 | "\u001b[1;31mTypeError\u001b[0m: can only assign an iterable"
850 | ]
851 | }
852 | ],
853 | "source": [
854 | "my_list[0:2]=100"
855 | ]
856 | },
857 | {
858 | "cell_type": "code",
859 | "execution_count": 47,
860 | "metadata": {},
861 | "outputs": [
862 | {
863 | "data": {
864 | "text/plain": [
865 | "[100, 100, 100, 3, 4, 5, 6, 7, 8, 9]"
866 | ]
867 | },
868 | "execution_count": 47,
869 | "metadata": {},
870 | "output_type": "execute_result"
871 | }
872 | ],
873 | "source": [
874 | "my_list[0:2]=[100,100,100]\n",
875 | "my_list"
876 | ]
877 | },
878 | {
879 | "cell_type": "code",
880 | "execution_count": 49,
881 | "metadata": {},
882 | "outputs": [
883 | {
884 | "data": {
885 | "text/plain": [
886 | "array([[0, 1, 2],\n",
887 | " [3, 4, 5]])"
888 | ]
889 | },
890 | "execution_count": 49,
891 | "metadata": {},
892 | "output_type": "execute_result"
893 | }
894 | ],
895 | "source": [
896 | "# matrix: Note that matrix indexing in python is slightly different than R, Matlab or other programming languages. \n",
897 | "\n",
898 | "my_matrix= np.arange(0,6).reshape(2,3)\n",
899 | "my_matrix"
900 | ]
901 | },
902 | {
903 | "cell_type": "code",
904 | "execution_count": 50,
905 | "metadata": {},
906 | "outputs": [
907 | {
908 | "data": {
909 | "text/plain": [
910 | "array([0, 1, 2])"
911 | ]
912 | },
913 | "execution_count": 50,
914 | "metadata": {},
915 | "output_type": "execute_result"
916 | }
917 | ],
918 | "source": [
919 | "# Format is matrix[row][col] or matrix[row,col]\n",
920 | "\n",
921 | "# extracting the first row\n",
922 | "my_matrix[0]"
923 | ]
924 | },
925 | {
926 | "cell_type": "code",
927 | "execution_count": 51,
928 | "metadata": {},
929 | "outputs": [
930 | {
931 | "data": {
932 | "text/plain": [
933 | "array([0, 3])"
934 | ]
935 | },
936 | "execution_count": 51,
937 | "metadata": {},
938 | "output_type": "execute_result"
939 | }
940 | ],
941 | "source": [
942 | "# extracting the first column\n",
943 | "my_matrix[:,0]"
944 | ]
945 | },
946 | {
947 | "cell_type": "code",
948 | "execution_count": 52,
949 | "metadata": {},
950 | "outputs": [
951 | {
952 | "data": {
953 | "text/plain": [
954 | "True"
955 | ]
956 | },
957 | "execution_count": 52,
958 | "metadata": {},
959 | "output_type": "execute_result"
960 | }
961 | ],
962 | "source": [
963 | "my_matrix[0][1] == my_matrix[0,1]"
964 | ]
965 | },
966 | {
967 | "cell_type": "code",
968 | "execution_count": 53,
969 | "metadata": {},
970 | "outputs": [
971 | {
972 | "data": {
973 | "text/plain": [
974 | "array([[1, 2],\n",
975 | " [4, 5]])"
976 | ]
977 | },
978 | "execution_count": 53,
979 | "metadata": {},
980 | "output_type": "execute_result"
981 | }
982 | ],
983 | "source": [
984 | "my_matrix[:2,1:]"
985 | ]
986 | },
987 | {
988 | "cell_type": "markdown",
989 | "metadata": {},
990 | "source": [
991 | "Use google image and search for \"numpy array indexing\" \n"
992 | ]
993 | },
994 | {
995 | "cell_type": "markdown",
996 | "metadata": {},
997 | "source": [
998 | "### Extracting with conditional selection\n"
999 | ]
1000 | },
1001 | {
1002 | "cell_type": "code",
1003 | "execution_count": 54,
1004 | "metadata": {},
1005 | "outputs": [
1006 | {
1007 | "data": {
1008 | "text/plain": [
1009 | "array([ 100, 100, 100, 100, 100, 6, 7, 8, 9, 100, -100])"
1010 | ]
1011 | },
1012 | "execution_count": 54,
1013 | "metadata": {},
1014 | "output_type": "execute_result"
1015 | }
1016 | ],
1017 | "source": [
1018 | "my_array"
1019 | ]
1020 | },
1021 | {
1022 | "cell_type": "code",
1023 | "execution_count": 55,
1024 | "metadata": {},
1025 | "outputs": [
1026 | {
1027 | "data": {
1028 | "text/plain": [
1029 | "array([ True, True, True, True, True, False, False, False, False,\n",
1030 | " True, False])"
1031 | ]
1032 | },
1033 | "execution_count": 55,
1034 | "metadata": {},
1035 | "output_type": "execute_result"
1036 | }
1037 | ],
1038 | "source": [
1039 | "my_array > 50"
1040 | ]
1041 | },
1042 | {
1043 | "cell_type": "code",
1044 | "execution_count": 56,
1045 | "metadata": {},
1046 | "outputs": [
1047 | {
1048 | "data": {
1049 | "text/plain": [
1050 | "array([100, 100, 100, 100, 100, 100])"
1051 | ]
1052 | },
1053 | "execution_count": 56,
1054 | "metadata": {},
1055 | "output_type": "execute_result"
1056 | }
1057 | ],
1058 | "source": [
1059 | "my_array[my_array>50]"
1060 | ]
1061 | },
1062 | {
1063 | "cell_type": "markdown",
1064 | "metadata": {},
1065 | "source": [
1066 | "This is another advantage of using arrays instead of lists. You cannot simply apply the comparison operators to a list. You must use filter() function instead. "
1067 | ]
1068 | },
1069 | {
1070 | "cell_type": "code",
1071 | "execution_count": 57,
1072 | "metadata": {},
1073 | "outputs": [
1074 | {
1075 | "data": {
1076 | "text/plain": [
1077 | "[100, 100, 100, 100, 100, 100]"
1078 | ]
1079 | },
1080 | "execution_count": 57,
1081 | "metadata": {},
1082 | "output_type": "execute_result"
1083 | }
1084 | ],
1085 | "source": [
1086 | "list(filter(lambda x: x>50, my_array))"
1087 | ]
1088 | },
1089 | {
1090 | "cell_type": "code",
1091 | "execution_count": 58,
1092 | "metadata": {},
1093 | "outputs": [
1094 | {
1095 | "data": {
1096 | "text/plain": [
1097 | "array([[0, 1, 2],\n",
1098 | " [3, 4, 5]])"
1099 | ]
1100 | },
1101 | "execution_count": 58,
1102 | "metadata": {},
1103 | "output_type": "execute_result"
1104 | }
1105 | ],
1106 | "source": [
1107 | "my_matrix"
1108 | ]
1109 | },
1110 | {
1111 | "cell_type": "code",
1112 | "execution_count": 59,
1113 | "metadata": {},
1114 | "outputs": [
1115 | {
1116 | "data": {
1117 | "text/plain": [
1118 | "array([[False, False, True],\n",
1119 | " [ True, True, True]])"
1120 | ]
1121 | },
1122 | "execution_count": 59,
1123 | "metadata": {},
1124 | "output_type": "execute_result"
1125 | }
1126 | ],
1127 | "source": [
1128 | "my_matrix > 1"
1129 | ]
1130 | },
1131 | {
1132 | "cell_type": "code",
1133 | "execution_count": 60,
1134 | "metadata": {},
1135 | "outputs": [
1136 | {
1137 | "data": {
1138 | "text/plain": [
1139 | "array([2, 3, 4, 5])"
1140 | ]
1141 | },
1142 | "execution_count": 60,
1143 | "metadata": {},
1144 | "output_type": "execute_result"
1145 | }
1146 | ],
1147 | "source": [
1148 | "my_matrix[my_matrix > 1]\n",
1149 | "# the shape is not reserved though!"
1150 | ]
1151 | },
1152 | {
1153 | "cell_type": "markdown",
1154 | "metadata": {},
1155 | "source": [
1156 | "## 3. Numpy operations"
1157 | ]
1158 | },
1159 | {
1160 | "cell_type": "code",
1161 | "execution_count": 61,
1162 | "metadata": {},
1163 | "outputs": [
1164 | {
1165 | "data": {
1166 | "text/plain": [
1167 | "array([0, 1, 2, 3, 4])"
1168 | ]
1169 | },
1170 | "execution_count": 61,
1171 | "metadata": {},
1172 | "output_type": "execute_result"
1173 | }
1174 | ],
1175 | "source": [
1176 | "arr = np.arange(0,5)\n",
1177 | "arr"
1178 | ]
1179 | },
1180 | {
1181 | "cell_type": "code",
1182 | "execution_count": 62,
1183 | "metadata": {},
1184 | "outputs": [
1185 | {
1186 | "data": {
1187 | "text/plain": [
1188 | "array([0, 2, 4, 6, 8])"
1189 | ]
1190 | },
1191 | "execution_count": 62,
1192 | "metadata": {},
1193 | "output_type": "execute_result"
1194 | }
1195 | ],
1196 | "source": [
1197 | "arr + arr"
1198 | ]
1199 | },
1200 | {
1201 | "cell_type": "code",
1202 | "execution_count": 63,
1203 | "metadata": {},
1204 | "outputs": [
1205 | {
1206 | "data": {
1207 | "text/plain": [
1208 | "array([ 1, 1, 4, 27, 256], dtype=int32)"
1209 | ]
1210 | },
1211 | "execution_count": 63,
1212 | "metadata": {},
1213 | "output_type": "execute_result"
1214 | }
1215 | ],
1216 | "source": [
1217 | "arr ** arr"
1218 | ]
1219 | },
1220 | {
1221 | "cell_type": "code",
1222 | "execution_count": 64,
1223 | "metadata": {},
1224 | "outputs": [
1225 | {
1226 | "name": "stderr",
1227 | "output_type": "stream",
1228 | "text": [
1229 | ":1: RuntimeWarning: invalid value encountered in true_divide\n",
1230 | " arr/arr\n"
1231 | ]
1232 | },
1233 | {
1234 | "data": {
1235 | "text/plain": [
1236 | "array([nan, 1., 1., 1., 1.])"
1237 | ]
1238 | },
1239 | "execution_count": 64,
1240 | "metadata": {},
1241 | "output_type": "execute_result"
1242 | }
1243 | ],
1244 | "source": [
1245 | "arr/arr"
1246 | ]
1247 | },
1248 | {
1249 | "cell_type": "code",
1250 | "execution_count": 65,
1251 | "metadata": {},
1252 | "outputs": [
1253 | {
1254 | "name": "stderr",
1255 | "output_type": "stream",
1256 | "text": [
1257 | ":1: RuntimeWarning: divide by zero encountered in true_divide\n",
1258 | " 1/arr\n"
1259 | ]
1260 | },
1261 | {
1262 | "data": {
1263 | "text/plain": [
1264 | "array([ inf, 1. , 0.5 , 0.33333333, 0.25 ])"
1265 | ]
1266 | },
1267 | "execution_count": 65,
1268 | "metadata": {},
1269 | "output_type": "execute_result"
1270 | }
1271 | ],
1272 | "source": [
1273 | "1/arr"
1274 | ]
1275 | },
1276 | {
1277 | "cell_type": "code",
1278 | "execution_count": 66,
1279 | "metadata": {},
1280 | "outputs": [
1281 | {
1282 | "data": {
1283 | "text/plain": [
1284 | "array([0. , 1. , 1.41421356, 1.73205081, 2. ])"
1285 | ]
1286 | },
1287 | "execution_count": 66,
1288 | "metadata": {},
1289 | "output_type": "execute_result"
1290 | }
1291 | ],
1292 | "source": [
1293 | "# Square Roots\n",
1294 | "np.sqrt(arr)"
1295 | ]
1296 | },
1297 | {
1298 | "cell_type": "code",
1299 | "execution_count": 67,
1300 | "metadata": {},
1301 | "outputs": [
1302 | {
1303 | "data": {
1304 | "text/plain": [
1305 | "array([ 1. , 2.71828183, 7.3890561 , 20.08553692, 54.59815003])"
1306 | ]
1307 | },
1308 | "execution_count": 67,
1309 | "metadata": {},
1310 | "output_type": "execute_result"
1311 | }
1312 | ],
1313 | "source": [
1314 | "# Exponential\n",
1315 | "np.exp(arr)"
1316 | ]
1317 | },
1318 | {
1319 | "cell_type": "code",
1320 | "execution_count": 68,
1321 | "metadata": {},
1322 | "outputs": [
1323 | {
1324 | "name": "stderr",
1325 | "output_type": "stream",
1326 | "text": [
1327 | ":2: RuntimeWarning: divide by zero encountered in log\n",
1328 | " np.log(arr)\n"
1329 | ]
1330 | },
1331 | {
1332 | "data": {
1333 | "text/plain": [
1334 | "array([ -inf, 0. , 0.69314718, 1.09861229, 1.38629436])"
1335 | ]
1336 | },
1337 | "execution_count": 68,
1338 | "metadata": {},
1339 | "output_type": "execute_result"
1340 | }
1341 | ],
1342 | "source": [
1343 | "# Natural Logarithm\n",
1344 | "np.log(arr)"
1345 | ]
1346 | },
1347 | {
1348 | "cell_type": "code",
1349 | "execution_count": 69,
1350 | "metadata": {},
1351 | "outputs": [
1352 | {
1353 | "data": {
1354 | "text/plain": [
1355 | "array([0, 1, 2, 3, 4])"
1356 | ]
1357 | },
1358 | "execution_count": 69,
1359 | "metadata": {},
1360 | "output_type": "execute_result"
1361 | }
1362 | ],
1363 | "source": [
1364 | "# summary statistics on arrays\n",
1365 | "arr"
1366 | ]
1367 | },
1368 | {
1369 | "cell_type": "code",
1370 | "execution_count": 70,
1371 | "metadata": {},
1372 | "outputs": [
1373 | {
1374 | "data": {
1375 | "text/plain": [
1376 | "10"
1377 | ]
1378 | },
1379 | "execution_count": 70,
1380 | "metadata": {},
1381 | "output_type": "execute_result"
1382 | }
1383 | ],
1384 | "source": [
1385 | "arr.sum()"
1386 | ]
1387 | },
1388 | {
1389 | "cell_type": "code",
1390 | "execution_count": 71,
1391 | "metadata": {},
1392 | "outputs": [
1393 | {
1394 | "data": {
1395 | "text/plain": [
1396 | "2.0"
1397 | ]
1398 | },
1399 | "execution_count": 71,
1400 | "metadata": {},
1401 | "output_type": "execute_result"
1402 | }
1403 | ],
1404 | "source": [
1405 | "arr.mean()"
1406 | ]
1407 | },
1408 | {
1409 | "cell_type": "code",
1410 | "execution_count": 72,
1411 | "metadata": {},
1412 | "outputs": [
1413 | {
1414 | "data": {
1415 | "text/plain": [
1416 | "2.0"
1417 | ]
1418 | },
1419 | "execution_count": 72,
1420 | "metadata": {},
1421 | "output_type": "execute_result"
1422 | }
1423 | ],
1424 | "source": [
1425 | "arr.var()"
1426 | ]
1427 | },
1428 | {
1429 | "cell_type": "code",
1430 | "execution_count": 73,
1431 | "metadata": {},
1432 | "outputs": [
1433 | {
1434 | "data": {
1435 | "text/plain": [
1436 | "1.4142135623730951"
1437 | ]
1438 | },
1439 | "execution_count": 73,
1440 | "metadata": {},
1441 | "output_type": "execute_result"
1442 | }
1443 | ],
1444 | "source": [
1445 | "arr.std()"
1446 | ]
1447 | },
1448 | {
1449 | "cell_type": "markdown",
1450 | "metadata": {},
1451 | "source": [
1452 | "## Axis Logic\n",
1453 | "When working with 2-dimensional arrays (matrices) we have to consider rows and columns. This becomes very important when we get to the section on pandas. In array terms, axis 0 is the vertical axis (elements on the rows), and axis 1 is the horizonal axis (elements on the columns). These values (0,1) correspond to the order in which arr.shape values are returned.\n",
1454 | "\n",
1455 | "Let's see how this affects our summary statistic calculations from above."
1456 | ]
1457 | },
1458 | {
1459 | "cell_type": "code",
1460 | "execution_count": 74,
1461 | "metadata": {},
1462 | "outputs": [
1463 | {
1464 | "data": {
1465 | "text/plain": [
1466 | "array([[0, 1, 2],\n",
1467 | " [3, 4, 5]])"
1468 | ]
1469 | },
1470 | "execution_count": 74,
1471 | "metadata": {},
1472 | "output_type": "execute_result"
1473 | }
1474 | ],
1475 | "source": [
1476 | "my_matrix"
1477 | ]
1478 | },
1479 | {
1480 | "cell_type": "code",
1481 | "execution_count": 75,
1482 | "metadata": {},
1483 | "outputs": [
1484 | {
1485 | "data": {
1486 | "text/plain": [
1487 | "array([3, 5, 7])"
1488 | ]
1489 | },
1490 | "execution_count": 75,
1491 | "metadata": {},
1492 | "output_type": "execute_result"
1493 | }
1494 | ],
1495 | "source": [
1496 | "# axis 0 (zero) is doing a vertical operation, and axis 1 a horizonal one. \n",
1497 | "# again, note that the logic is different from R, Matlab or etc\n",
1498 | "my_matrix.sum(axis=0)"
1499 | ]
1500 | },
1501 | {
1502 | "cell_type": "code",
1503 | "execution_count": 76,
1504 | "metadata": {},
1505 | "outputs": [
1506 | {
1507 | "data": {
1508 | "text/plain": [
1509 | "array([ 3, 12])"
1510 | ]
1511 | },
1512 | "execution_count": 76,
1513 | "metadata": {},
1514 | "output_type": "execute_result"
1515 | }
1516 | ],
1517 | "source": [
1518 | "my_matrix.sum(1)"
1519 | ]
1520 | },
1521 | {
1522 | "cell_type": "code",
1523 | "execution_count": 77,
1524 | "metadata": {},
1525 | "outputs": [
1526 | {
1527 | "data": {
1528 | "text/plain": [
1529 | "array([[ 0, 1, 4],\n",
1530 | " [ 9, 16, 25]])"
1531 | ]
1532 | },
1533 | "execution_count": 77,
1534 | "metadata": {},
1535 | "output_type": "execute_result"
1536 | }
1537 | ],
1538 | "source": [
1539 | "my_matrix * my_matrix # note that this is not a matrix multiplication"
1540 | ]
1541 | },
1542 | {
1543 | "cell_type": "code",
1544 | "execution_count": 78,
1545 | "metadata": {},
1546 | "outputs": [
1547 | {
1548 | "data": {
1549 | "text/plain": [
1550 | "array([[ 5, 14],\n",
1551 | " [14, 50]])"
1552 | ]
1553 | },
1554 | "execution_count": 78,
1555 | "metadata": {},
1556 | "output_type": "execute_result"
1557 | }
1558 | ],
1559 | "source": [
1560 | "# To do a matrix multiplication use np.dot (equivalent to %*% in R)\n",
1561 | "np.dot(my_matrix,my_matrix.T)"
1562 | ]
1563 | },
1564 | {
1565 | "cell_type": "code",
1566 | "execution_count": 79,
1567 | "metadata": {},
1568 | "outputs": [
1569 | {
1570 | "data": {
1571 | "text/plain": [
1572 | "array([[1, 2],\n",
1573 | " [3, 4]])"
1574 | ]
1575 | },
1576 | "execution_count": 79,
1577 | "metadata": {},
1578 | "output_type": "execute_result"
1579 | }
1580 | ],
1581 | "source": [
1582 | "# inverse of a matrix\n",
1583 | "A = np.array([[1,2],[3,4]]) \n",
1584 | "A"
1585 | ]
1586 | },
1587 | {
1588 | "cell_type": "code",
1589 | "execution_count": 80,
1590 | "metadata": {},
1591 | "outputs": [
1592 | {
1593 | "data": {
1594 | "text/plain": [
1595 | "array([[-2. , 1. ],\n",
1596 | " [ 1.5, -0.5]])"
1597 | ]
1598 | },
1599 | "execution_count": 80,
1600 | "metadata": {},
1601 | "output_type": "execute_result"
1602 | }
1603 | ],
1604 | "source": [
1605 | "A_inv = np.linalg.inv(A)\n",
1606 | "A_inv"
1607 | ]
1608 | }
1609 | ],
1610 | "metadata": {
1611 | "anaconda-cloud": {},
1612 | "kernelspec": {
1613 | "display_name": "Python 3 (ipykernel)",
1614 | "language": "python",
1615 | "name": "python3"
1616 | },
1617 | "language_info": {
1618 | "codemirror_mode": {
1619 | "name": "ipython",
1620 | "version": 3
1621 | },
1622 | "file_extension": ".py",
1623 | "mimetype": "text/x-python",
1624 | "name": "python",
1625 | "nbconvert_exporter": "python",
1626 | "pygments_lexer": "ipython3",
1627 | "version": "3.9.7"
1628 | }
1629 | },
1630 | "nbformat": 4,
1631 | "nbformat_minor": 4
1632 | }
1633 |
--------------------------------------------------------------------------------
/Lectures and codes/Module 2- Setting up DL environement/Python_Crash_course_2020/4-Matplotlib(visualization).ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "attachments": {},
5 | "cell_type": "markdown",
6 | "metadata": {},
7 | "source": [
8 | "You need to make a copy to your own Google drive if you want to edit the original notebook! Start by opening this notebook on Colab 👇\n",
9 | "\n",
10 | "
\n",
11 | "\n",
12 | "\n",
13 | "\n",
14 | " \n",
15 | "\n",
16 | "\n",
17 | "\n",
18 | "## 🔗 Links\n",
19 | "\n",
20 | "[](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)\n",
21 | "\n",
22 | "[](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)\n",
23 | "\n",
24 | "[](https://twitter.com/PedramJahangiry)\n",
25 | "\n",
26 | "\n",
27 | "---\n",
28 | "\n",
29 | "\n",
30 | "# Matplotlib "
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": 1,
36 | "metadata": {},
37 | "outputs": [],
38 | "source": [
39 | "import matplotlib.pyplot as plt"
40 | ]
41 | },
42 | {
43 | "cell_type": "markdown",
44 | "metadata": {},
45 | "source": [
46 | "If you are using another editor, you must use: **plt.show()** at the end of all your plotting commands to have the figure pop up in another window."
47 | ]
48 | },
49 | {
50 | "cell_type": "code",
51 | "execution_count": 2,
52 | "metadata": {},
53 | "outputs": [],
54 | "source": [
55 | "import numpy as np"
56 | ]
57 | },
58 | {
59 | "cell_type": "code",
60 | "execution_count": 3,
61 | "metadata": {},
62 | "outputs": [],
63 | "source": [
64 | "x = np.linspace(-5, 5, 20)\n",
65 | "y = x ** 2 + 1"
66 | ]
67 | },
68 | {
69 | "cell_type": "code",
70 | "execution_count": 4,
71 | "metadata": {},
72 | "outputs": [
73 | {
74 | "data": {
75 | "text/plain": [
76 | "array([-5. , -4.47368421, -3.94736842, -3.42105263, -2.89473684,\n",
77 | " -2.36842105, -1.84210526, -1.31578947, -0.78947368, -0.26315789,\n",
78 | " 0.26315789, 0.78947368, 1.31578947, 1.84210526, 2.36842105,\n",
79 | " 2.89473684, 3.42105263, 3.94736842, 4.47368421, 5. ])"
80 | ]
81 | },
82 | "execution_count": 4,
83 | "metadata": {},
84 | "output_type": "execute_result"
85 | }
86 | ],
87 | "source": [
88 | "x"
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": 5,
94 | "metadata": {},
95 | "outputs": [
96 | {
97 | "data": {
98 | "text/plain": [
99 | "array([26. , 21.01385042, 16.58171745, 12.70360111, 9.37950139,\n",
100 | " 6.60941828, 4.3933518 , 2.73130194, 1.6232687 , 1.06925208,\n",
101 | " 1.06925208, 1.6232687 , 2.73130194, 4.3933518 , 6.60941828,\n",
102 | " 9.37950139, 12.70360111, 16.58171745, 21.01385042, 26. ])"
103 | ]
104 | },
105 | "execution_count": 5,
106 | "metadata": {},
107 | "output_type": "execute_result"
108 | }
109 | ],
110 | "source": [
111 | "y"
112 | ]
113 | },
114 | {
115 | "cell_type": "code",
116 | "execution_count": 6,
117 | "metadata": {},
118 | "outputs": [
119 | {
120 | "data": {
121 | "image/png": "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",
122 | "text/plain": [
123 | ""
124 | ]
125 | },
126 | "metadata": {
127 | "needs_background": "light"
128 | },
129 | "output_type": "display_data"
130 | }
131 | ],
132 | "source": [
133 | "plt.plot(x, y, 'red') \n",
134 | "plt.show()"
135 | ]
136 | },
137 | {
138 | "cell_type": "code",
139 | "execution_count": 7,
140 | "metadata": {},
141 | "outputs": [
142 | {
143 | "data": {
144 | "image/png": "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",
145 | "text/plain": [
146 | ""
147 | ]
148 | },
149 | "metadata": {
150 | "needs_background": "light"
151 | },
152 | "output_type": "display_data"
153 | }
154 | ],
155 | "source": [
156 | "plt.plot(x, y, 'b--') \n",
157 | "plt.xlabel('X')\n",
158 | "plt.ylabel('Y')\n",
159 | "plt.title('Title')\n",
160 | "plt.show()"
161 | ]
162 | },
163 | {
164 | "cell_type": "code",
165 | "execution_count": 8,
166 | "metadata": {},
167 | "outputs": [
168 | {
169 | "data": {
170 | "image/png": "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",
171 | "text/plain": [
172 | ""
173 | ]
174 | },
175 | "metadata": {
176 | "needs_background": "light"
177 | },
178 | "output_type": "display_data"
179 | }
180 | ],
181 | "source": [
182 | "# adjusting the size\n",
183 | "fig =plt.figure(figsize=(10,4))\n",
184 | "\n",
185 | "\n",
186 | "# plt.subplot(nrows, ncols, plot_number)\n",
187 | "plt.subplot(1,2,1)\n",
188 | "plt.plot(x, y, 'r--') \n",
189 | "plt.subplot(1,2,2)\n",
190 | "plt.plot(y, x, 'g*-');\n",
191 | "\n",
192 | "\n",
193 | "\n",
194 | "plt.show()"
195 | ]
196 | },
197 | {
198 | "cell_type": "markdown",
199 | "metadata": {},
200 | "source": [
201 | "To save a figure to a file we can use the `savefig` method in the `Figure` class:"
202 | ]
203 | },
204 | {
205 | "cell_type": "code",
206 | "execution_count": 9,
207 | "metadata": {},
208 | "outputs": [],
209 | "source": [
210 | "fig.savefig(\"my_fig.png\") # we can save it as a pdf as well. "
211 | ]
212 | },
213 | {
214 | "cell_type": "markdown",
215 | "metadata": {},
216 | "source": [
217 | "Check out the matplotlib documentation website (http://matplotlib.org/gallery.html) to explore the following types of figures:\n",
218 | "\n",
219 | "1. plt.hist(data)\n",
220 | "2. plt.boxplot(data)\n",
221 | "3. plt.scatter(x,y)\n",
222 | "4. ...."
223 | ]
224 | }
225 | ],
226 | "metadata": {
227 | "kernelspec": {
228 | "display_name": "Python 3.9.7 ('base')",
229 | "language": "python",
230 | "name": "python3"
231 | },
232 | "language_info": {
233 | "codemirror_mode": {
234 | "name": "ipython",
235 | "version": 3
236 | },
237 | "file_extension": ".py",
238 | "mimetype": "text/x-python",
239 | "name": "python",
240 | "nbconvert_exporter": "python",
241 | "pygments_lexer": "ipython3",
242 | "version": "3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)]"
243 | },
244 | "vscode": {
245 | "interpreter": {
246 | "hash": "49cb93f377a7abe7414b7b0f21fb3017538004a126cf690fb524202736b7fb92"
247 | }
248 | }
249 | },
250 | "nbformat": 4,
251 | "nbformat_minor": 4
252 | }
253 |
--------------------------------------------------------------------------------
/Lectures and codes/Module 2- Setting up DL environement/Python_Crash_course_2020/GDP.csv:
--------------------------------------------------------------------------------
1 | DATE,GDP
2 | 1947-01-01,243.164
3 | 1947-04-01,245.968
4 | 1947-07-01,249.585
5 | 1947-10-01,259.745
6 | 1948-01-01,265.742
7 | 1948-04-01,272.567
8 | 1948-07-01,279.196
9 | 1948-10-01,280.366
10 | 1949-01-01,275.034
11 | 1949-04-01,271.351
12 | 1949-07-01,272.889
13 | 1949-10-01,270.627
14 | 1950-01-01,280.828
15 | 1950-04-01,290.383
16 | 1950-07-01,308.153
17 | 1950-10-01,319.945
18 | 1951-01-01,336.0
19 | 1951-04-01,344.09
20 | 1951-07-01,351.385
21 | 1951-10-01,356.178
22 | 1952-01-01,359.82
23 | 1952-04-01,361.03
24 | 1952-07-01,367.701
25 | 1952-10-01,380.812
26 | 1953-01-01,387.98
27 | 1953-04-01,391.749
28 | 1953-07-01,391.171
29 | 1953-10-01,385.97
30 | 1954-01-01,385.345
31 | 1954-04-01,386.121
32 | 1954-07-01,390.996
33 | 1954-10-01,399.734
34 | 1955-01-01,413.073
35 | 1955-04-01,421.532
36 | 1955-07-01,430.221
37 | 1955-10-01,437.092
38 | 1956-01-01,439.746
39 | 1956-04-01,446.01
40 | 1956-07-01,451.191
41 | 1956-10-01,460.463
42 | 1957-01-01,469.779
43 | 1957-04-01,472.025
44 | 1957-07-01,479.49
45 | 1957-10-01,474.864
46 | 1958-01-01,467.54
47 | 1958-04-01,471.978
48 | 1958-07-01,485.841
49 | 1958-10-01,499.555
50 | 1959-01-01,510.33
51 | 1959-04-01,522.653
52 | 1959-07-01,525.034
53 | 1959-10-01,528.6
54 | 1960-01-01,542.648
55 | 1960-04-01,541.08
56 | 1960-07-01,545.604
57 | 1960-10-01,540.197
58 | 1961-01-01,545.018
59 | 1961-04-01,555.545
60 | 1961-07-01,567.664
61 | 1961-10-01,580.612
62 | 1962-01-01,594.013
63 | 1962-04-01,600.366
64 | 1962-07-01,609.027
65 | 1962-10-01,612.28
66 | 1963-01-01,621.672
67 | 1963-04-01,629.752
68 | 1963-07-01,644.444
69 | 1963-10-01,653.938
70 | 1964-01-01,669.822
71 | 1964-04-01,678.674
72 | 1964-07-01,692.031
73 | 1964-10-01,697.319
74 | 1965-01-01,717.79
75 | 1965-04-01,730.191
76 | 1965-07-01,749.323
77 | 1965-10-01,771.857
78 | 1966-01-01,795.734
79 | 1966-04-01,804.981
80 | 1966-07-01,819.638
81 | 1966-10-01,833.302
82 | 1967-01-01,844.17
83 | 1967-04-01,848.983
84 | 1967-07-01,865.233
85 | 1967-10-01,881.439
86 | 1968-01-01,909.387
87 | 1968-04-01,934.344
88 | 1968-07-01,950.825
89 | 1968-10-01,968.03
90 | 1969-01-01,993.337
91 | 1969-04-01,1009.02
92 | 1969-07-01,1029.956
93 | 1969-10-01,1038.147
94 | 1970-01-01,1051.2
95 | 1970-04-01,1067.375
96 | 1970-07-01,1086.059
97 | 1970-10-01,1088.608
98 | 1971-01-01,1135.156
99 | 1971-04-01,1156.271
100 | 1971-07-01,1177.675
101 | 1971-10-01,1190.297
102 | 1972-01-01,1230.609
103 | 1972-04-01,1266.369
104 | 1972-07-01,1290.566
105 | 1972-10-01,1328.904
106 | 1973-01-01,1377.49
107 | 1973-04-01,1413.887
108 | 1973-07-01,1433.838
109 | 1973-10-01,1476.289
110 | 1974-01-01,1491.209
111 | 1974-04-01,1530.056
112 | 1974-07-01,1560.026
113 | 1974-10-01,1599.679
114 | 1975-01-01,1616.116
115 | 1975-04-01,1651.853
116 | 1975-07-01,1709.82
117 | 1975-10-01,1761.831
118 | 1976-01-01,1820.487
119 | 1976-04-01,1852.332
120 | 1976-07-01,1886.558
121 | 1976-10-01,1934.273
122 | 1977-01-01,1988.648
123 | 1977-04-01,2055.909
124 | 1977-07-01,2118.473
125 | 1977-10-01,2164.27
126 | 1978-01-01,2202.76
127 | 1978-04-01,2331.633
128 | 1978-07-01,2395.053
129 | 1978-10-01,2476.949
130 | 1979-01-01,2526.61
131 | 1979-04-01,2591.247
132 | 1979-07-01,2667.565
133 | 1979-10-01,2723.883
134 | 1980-01-01,2789.842
135 | 1980-04-01,2797.352
136 | 1980-07-01,2856.483
137 | 1980-10-01,2985.557
138 | 1981-01-01,3124.206
139 | 1981-04-01,3162.532
140 | 1981-07-01,3260.609
141 | 1981-10-01,3280.818
142 | 1982-01-01,3274.302
143 | 1982-04-01,3331.972
144 | 1982-07-01,3366.322
145 | 1982-10-01,3402.561
146 | 1983-01-01,3473.413
147 | 1983-04-01,3578.848
148 | 1983-07-01,3689.179
149 | 1983-10-01,3794.706
150 | 1984-01-01,3908.054
151 | 1984-04-01,4009.601
152 | 1984-07-01,4084.25
153 | 1984-10-01,4148.551
154 | 1985-01-01,4230.168
155 | 1985-04-01,4294.887
156 | 1985-07-01,4386.773
157 | 1985-10-01,4444.094
158 | 1986-01-01,4507.894
159 | 1986-04-01,4545.34
160 | 1986-07-01,4607.669
161 | 1986-10-01,4657.627
162 | 1987-01-01,4722.156
163 | 1987-04-01,4806.16
164 | 1987-07-01,4884.555
165 | 1987-10-01,5007.994
166 | 1988-01-01,5073.372
167 | 1988-04-01,5190.036
168 | 1988-07-01,5282.835
169 | 1988-10-01,5399.509
170 | 1989-01-01,5511.253
171 | 1989-04-01,5612.463
172 | 1989-07-01,5695.365
173 | 1989-10-01,5747.237
174 | 1990-01-01,5872.701
175 | 1990-04-01,5960.028
176 | 1990-07-01,6015.116
177 | 1990-10-01,6004.733
178 | 1991-01-01,6035.178
179 | 1991-04-01,6126.862
180 | 1991-07-01,6205.937
181 | 1991-10-01,6264.54
182 | 1992-01-01,6363.102
183 | 1992-04-01,6470.763
184 | 1992-07-01,6566.641
185 | 1992-10-01,6680.803
186 | 1993-01-01,6729.459
187 | 1993-04-01,6808.939
188 | 1993-07-01,6882.098
189 | 1993-10-01,7013.738
190 | 1994-01-01,7115.652
191 | 1994-04-01,7246.931
192 | 1994-07-01,7331.075
193 | 1994-10-01,7455.288
194 | 1995-01-01,7522.289
195 | 1995-04-01,7580.997
196 | 1995-07-01,7683.125
197 | 1995-10-01,7772.586
198 | 1996-01-01,7868.468
199 | 1996-04-01,8032.84
200 | 1996-07-01,8131.408
201 | 1996-10-01,8259.771
202 | 1997-01-01,8362.655
203 | 1997-04-01,8518.825
204 | 1997-07-01,8662.823
205 | 1997-10-01,8765.907
206 | 1998-01-01,8866.48
207 | 1998-04-01,8969.699
208 | 1998-07-01,9121.097
209 | 1998-10-01,9293.991
210 | 1999-01-01,9417.264
211 | 1999-04-01,9524.152
212 | 1999-07-01,9681.856
213 | 1999-10-01,9899.378
214 | 2000-01-01,10002.857
215 | 2000-04-01,10247.679
216 | 2000-07-01,10319.825
217 | 2000-10-01,10439.025
218 | 2001-01-01,10472.879
219 | 2001-04-01,10597.822
220 | 2001-07-01,10596.294
221 | 2001-10-01,10660.294
222 | 2002-01-01,10788.952
223 | 2002-04-01,10893.207
224 | 2002-07-01,10992.051
225 | 2002-10-01,11071.463
226 | 2003-01-01,11183.507
227 | 2003-04-01,11312.875
228 | 2003-07-01,11567.326
229 | 2003-10-01,11769.275
230 | 2004-01-01,11920.169
231 | 2004-04-01,12108.987
232 | 2004-07-01,12303.34
233 | 2004-10-01,12522.425
234 | 2005-01-01,12761.337
235 | 2005-04-01,12910.022
236 | 2005-07-01,13142.873
237 | 2005-10-01,13332.316
238 | 2006-01-01,13603.933
239 | 2006-04-01,13749.806
240 | 2006-07-01,13867.469
241 | 2006-10-01,14037.228
242 | 2007-01-01,14208.569
243 | 2007-04-01,14382.363
244 | 2007-07-01,14535.003
245 | 2007-10-01,14681.501
246 | 2008-01-01,14651.039
247 | 2008-04-01,14805.611
248 | 2008-07-01,14835.187
249 | 2008-10-01,14559.543
250 | 2009-01-01,14394.547
251 | 2009-04-01,14352.85
252 | 2009-07-01,14420.312
253 | 2009-10-01,14628.021
254 | 2010-01-01,14721.35
255 | 2010-04-01,14926.098
256 | 2010-07-01,15079.917
257 | 2010-10-01,15240.843
258 | 2011-01-01,15285.828
259 | 2011-04-01,15496.189
260 | 2011-07-01,15591.85
261 | 2011-10-01,15796.46
262 | 2012-01-01,16019.758
263 | 2012-04-01,16152.257
264 | 2012-07-01,16257.151
265 | 2012-10-01,16358.863
266 | 2013-01-01,16569.591
267 | 2013-04-01,16637.926
268 | 2013-07-01,16848.748
269 | 2013-10-01,17083.137
270 | 2014-01-01,17104.555
271 | 2014-04-01,17432.909
272 | 2014-07-01,17721.657
273 | 2014-10-01,17849.912
274 | 2015-01-01,17984.178
275 | 2015-04-01,18219.405
276 | 2015-07-01,18344.713
277 | 2015-10-01,18350.825
278 | 2016-01-01,18424.283
279 | 2016-04-01,18637.253
280 | 2016-07-01,18806.743
281 | 2016-10-01,18991.883
282 | 2017-01-01,19190.431
283 | 2017-04-01,19356.649
284 | 2017-07-01,19611.704
285 | 2017-10-01,19918.91
286 | 2018-01-01,20163.159
287 | 2018-04-01,20510.177
288 | 2018-07-01,20749.752
289 | 2018-10-01,20897.804
290 | 2019-01-01,21098.827
291 | 2019-04-01,21339.121
292 |
--------------------------------------------------------------------------------
/Lectures and codes/Module 2- Setting up DL environement/Python_Crash_course_2020/GDP.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 2- Setting up DL environement/Python_Crash_course_2020/GDP.xlsx
--------------------------------------------------------------------------------
/Lectures and codes/Module 2- Setting up DL environement/Python_Crash_course_2020/README.md:
--------------------------------------------------------------------------------
1 | Here is the link to my YouTube playlist for Python Crash course! https://www.youtube.com/playlist?list=PL2GWo47BFyUPsqzaOdIdZlAwQmrXkSJxX
2 |
3 |
4 | **Topics**:
5 | 1. Installation!
6 | 2. What is Python notebook!
7 | 3. Python Basics
8 | 4. Numpy
9 | 5. Pandas
10 | 6. Matplotlib
11 | 7. Pandas visualization
12 | 8. Seaborn
13 | 9. Time series
14 |
15 |
16 |
17 | ## 🔗 Links
18 |
19 | [](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)
20 |
21 | [](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)
22 |
23 | [](https://twitter.com/PedramJahangiry)
24 |
25 |
--------------------------------------------------------------------------------
/Lectures and codes/Module 3- Machine Learning Review/Module 3-Machine Learning and boosting models review.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 3- Machine Learning Review/Module 3-Machine Learning and boosting models review.pdf
--------------------------------------------------------------------------------
/Lectures and codes/Module 4- Deep Neural Networks/DNN_python/ticket_classifier.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 4- Deep Neural Networks/DNN_python/ticket_classifier.png
--------------------------------------------------------------------------------
/Lectures and codes/Module 4- Deep Neural Networks/Module 4-Deep Neural Networks.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 4- Deep Neural Networks/Module 4-Deep Neural Networks.pdf
--------------------------------------------------------------------------------
/Lectures and codes/Module 5- Deep Computer Vision/Module 5- Deep Computer Vision.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 5- Deep Computer Vision/Module 5- Deep Computer Vision.pdf
--------------------------------------------------------------------------------
/Lectures and codes/Module 6- Deep Sequence Modeling/Module 6- Deep Sequence Modeling-original.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 6- Deep Sequence Modeling/Module 6- Deep Sequence Modeling-original.pdf
--------------------------------------------------------------------------------
/Lectures and codes/Module 7- Transformers/Module 7- Transformers.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 7- Transformers/Module 7- Transformers.pdf
--------------------------------------------------------------------------------
/Lectures and codes/Module 7- Transformers/papers/Attention is all you need.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 7- Transformers/papers/Attention is all you need.pdf
--------------------------------------------------------------------------------
/Lectures and codes/Module 7- Transformers/papers/Transformer catalog.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Lectures and codes/Module 7- Transformers/papers/Transformer catalog.pdf
--------------------------------------------------------------------------------
/Lectures and codes/Module 7- Transformers/python/HuggingFace_Fine-tune a model.ipynb:
--------------------------------------------------------------------------------
1 | {"cells":[{"cell_type":"code","execution_count":null,"metadata":{"id":"omHtkOoA99bO"},"outputs":[],"source":["# Transformers installation\n","! pip install transformers datasets\n","# To install from source instead of the last release, comment the command above and uncomment the following one.\n","# ! pip install git+https://github.com/huggingface/transformers.git"]},{"cell_type":"markdown","metadata":{"id":"VIaVOXAa99bP"},"source":["# Fine-tune a pretrained model"]},{"cell_type":"markdown","metadata":{"id":"uLH25lm599bQ"},"source":["There are significant benefits to using a pretrained model. It reduces computation costs, your carbon footprint, and allows you to use state-of-the-art models without having to train one from scratch. 🤗 Transformers provides access to thousands of pretrained models for a wide range of tasks. When you use a pretrained model, you train it on a dataset specific to your task. This is known as fine-tuning, an incredibly powerful training technique. In this tutorial, you will fine-tune a pretrained model with a deep learning framework of your choice:\n","\n","* Fine-tune a pretrained model with 🤗 Transformers [Trainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer).\n","* Fine-tune a pretrained model in TensorFlow with Keras.\n","* Fine-tune a pretrained model in native PyTorch.\n","\n",""]},{"cell_type":"markdown","metadata":{"id":"7L1P8mwR99bR"},"source":["## Prepare a dataset"]},{"cell_type":"code","execution_count":null,"metadata":{"cellView":"form","hide_input":true,"id":"lNyJJiDL99bR","outputId":"5aa858df-4af7-40cc-f9b1-b876c8b738c2"},"outputs":[{"data":{"text/html":[""],"text/plain":[""]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["#@title\n","from IPython.display import HTML\n","\n","HTML('')"]},{"cell_type":"markdown","metadata":{"id":"KYyNCdmI99bR"},"source":["Before you can fine-tune a pretrained model, download a dataset and prepare it for training. The previous tutorial showed you how to process data for training, and now you get an opportunity to put those skills to the test!\n","\n","Begin by loading the [Yelp Reviews](https://huggingface.co/datasets/yelp_review_full) dataset:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"QW1zcNKF99bS","outputId":"d3234337-5d9b-47c6-d9f9-9ab5a30a1b76"},"outputs":[{"data":{"text/plain":["{'label': 0,\n"," 'text': 'My expectations for McDonalds are t rarely high. But for one to still fail so spectacularly...that takes something special!\\\\nThe cashier took my friends\\'s order, then promptly ignored me. I had to force myself in front of a cashier who opened his register to wait on the person BEHIND me. I waited over five minutes for a gigantic order that included precisely one kid\\'s meal. After watching two people who ordered after me be handed their food, I asked where mine was. The manager started yelling at the cashiers for \\\\\"serving off their orders\\\\\" when they didn\\'t have their food. But neither cashier was anywhere near those controls, and the manager was the one serving food to customers and clearing the boards.\\\\nThe manager was rude when giving me my order. She didn\\'t make sure that I had everything ON MY RECEIPT, and never even had the decency to apologize that I felt I was getting poor service.\\\\nI\\'ve eaten at various McDonalds restaurants for over 30 years. I\\'ve worked at more than one location. I expect bad days, bad moods, and the occasional mistake. But I have yet to have a decent experience at this store. It will remain a place I avoid unless someone in my party needs to avoid illness from low blood sugar. Perhaps I should go back to the racially biased service of Steak n Shake instead!'}"]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["from datasets import load_dataset\n","\n","dataset = load_dataset(\"yelp_review_full\")\n","dataset[\"train\"][100]"]},{"cell_type":"markdown","metadata":{"id":"Boz2nsx399bS"},"source":["As you now know, you need a tokenizer to process the text and include a padding and truncation strategy to handle any variable sequence lengths. To process your dataset in one step, use 🤗 Datasets [`map`](https://huggingface.co/docs/datasets/process.html#map) method to apply a preprocessing function over the entire dataset:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"UvB0nrYZ99bS"},"outputs":[],"source":["from transformers import AutoTokenizer\n","\n","tokenizer = AutoTokenizer.from_pretrained(\"bert-base-cased\")\n","\n","\n","def tokenize_function(examples):\n"," return tokenizer(examples[\"text\"], padding=\"max_length\", truncation=True)\n","\n","\n","tokenized_datasets = dataset.map(tokenize_function, batched=True)"]},{"cell_type":"markdown","metadata":{"id":"2z-q4Z6499bS"},"source":["If you like, you can create a smaller subset of the full dataset to fine-tune on to reduce the time it takes:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Ug5NnXZ099bS"},"outputs":[],"source":["small_train_dataset = tokenized_datasets[\"train\"].shuffle(seed=42).select(range(1000))\n","small_eval_dataset = tokenized_datasets[\"test\"].shuffle(seed=42).select(range(1000))"]},{"cell_type":"markdown","metadata":{"id":"Lau4J2Am99bT"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"X4wyLLEt99bT"},"source":["## Train"]},{"cell_type":"markdown","metadata":{"id":"9r9lCj7y99bT"},"source":["At this point, you should follow the section corresponding to the framework you want to use. You can use the links\n","in the right sidebar to jump to the one you want - and if you want to hide all of the content for a given framework,\n","just use the button at the top-right of that framework's block!\n","\n",""]},{"cell_type":"code","execution_count":null,"metadata":{"cellView":"form","hide_input":true,"id":"XZgz9lz-99bT","outputId":"cff5eacf-f559-4a18-c163-eb10a4fdc824"},"outputs":[{"data":{"text/html":[""],"text/plain":[""]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["#@title\n","from IPython.display import HTML\n","\n","HTML('')"]},{"cell_type":"markdown","metadata":{"id":"EES8ApGB99bT"},"source":["## Train a TensorFlow model with Keras"]},{"cell_type":"markdown","metadata":{"id":"dlv5-Jo499bT"},"source":["You can also train 🤗 Transformers models in TensorFlow with the Keras API!"]},{"cell_type":"markdown","metadata":{"id":"bQBVNIQW99bT"},"source":["### Loading data for Keras"]},{"cell_type":"markdown","metadata":{"id":"pgmgQ1Jx99bT"},"source":["When you want to train a 🤗 Transformers model with the Keras API, you need to convert your dataset to a format that\n","Keras understands. If your dataset is small, you can just convert the whole thing to NumPy arrays and pass it to Keras.\n","Let's try that first before we do anything more complicated.\n","\n","First, load a dataset. We'll use the CoLA dataset from the [GLUE benchmark](https://huggingface.co/datasets/glue),\n","since it's a simple binary text classification task, and just take the training split for now."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"s7LVKJIk99bU"},"outputs":[],"source":["from datasets import load_dataset\n","\n","dataset = load_dataset(\"glue\", \"cola\")\n","dataset = dataset[\"train\"] # Just take the training split for now"]},{"cell_type":"markdown","metadata":{"id":"59mjUqpD99bU"},"source":["Next, load a tokenizer and tokenize the data as NumPy arrays. Note that the labels are already a list of 0 and 1s,\n","so we can just convert that directly to a NumPy array without tokenization!"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"xsdzcNga99bU"},"outputs":[],"source":["from transformers import AutoTokenizer\n","\n","tokenizer = AutoTokenizer.from_pretrained(\"bert-base-cased\")\n","tokenized_data = tokenizer(dataset[\"sentence\"], return_tensors=\"np\", padding=True)\n","# Tokenizer returns a BatchEncoding, but we convert that to a dict for Keras\n","tokenized_data = dict(tokenized_data)\n","\n","labels = np.array(dataset[\"label\"]) # Label is already an array of 0 and 1"]},{"cell_type":"markdown","metadata":{"id":"n9rQfZe099bU"},"source":["Finally, load, [`compile`](https://keras.io/api/models/model_training_apis/#compile-method), and [`fit`](https://keras.io/api/models/model_training_apis/#fit-method) the model:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"iddKlrez99bU"},"outputs":[],"source":["from transformers import TFAutoModelForSequenceClassification\n","from tensorflow.keras.optimizers import Adam\n","\n","# Load and compile our model\n","model = TFAutoModelForSequenceClassification.from_pretrained(\"bert-base-cased\")\n","# Lower learning rates are often better for fine-tuning transformers\n","model.compile(optimizer=Adam(3e-5))\n","\n","model.fit(tokenized_data, labels)"]},{"cell_type":"markdown","metadata":{"id":"jc35TOAF99bU"},"source":["\n","\n","You don't have to pass a loss argument to your models when you `compile()` them! Hugging Face models automatically\n","choose a loss that is appropriate for their task and model architecture if this argument is left blank. You can always\n","override this by specifying a loss yourself if you want to!\n","\n","\n","\n","This approach works great for smaller datasets, but for larger datasets, you might find it starts to become a problem. Why?\n","Because the tokenized array and labels would have to be fully loaded into memory, and because NumPy doesn’t handle\n","“jagged” arrays, so every tokenized sample would have to be padded to the length of the longest sample in the whole\n","dataset. That’s going to make your array even bigger, and all those padding tokens will slow down training too!"]},{"cell_type":"markdown","metadata":{"id":"YNITxYTI99bU"},"source":["### Loading data as a tf.data.Dataset"]},{"cell_type":"markdown","metadata":{"id":"ttAhwutg99bU"},"source":["If you want to avoid slowing down training, you can load your data as a `tf.data.Dataset` instead. Although you can write your own\n","`tf.data` pipeline if you want, we have two convenience methods for doing this:\n","\n","- [prepare_tf_dataset()](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.prepare_tf_dataset): This is the method we recommend in most cases. Because it is a method\n","on your model, it can inspect the model to automatically figure out which columns are usable as model inputs, and\n","discard the others to make a simpler, more performant dataset.\n","- [to_tf_dataset](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.to_tf_dataset): This method is more low-level, and is useful when you want to exactly control how\n","your dataset is created, by specifying exactly which `columns` and `label_cols` to include.\n","\n","Before you can use [prepare_tf_dataset()](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.prepare_tf_dataset), you will need to add the tokenizer outputs to your dataset as columns, as shown in\n","the following code sample:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"RcJvR2Ip99bV"},"outputs":[],"source":["def tokenize_dataset(data):\n"," # Keys of the returned dictionary will be added to the dataset as columns\n"," return tokenizer(data[\"text\"])\n","\n","\n","dataset = dataset.map(tokenize_dataset)"]},{"cell_type":"markdown","metadata":{"id":"diQiG_KI99bV"},"source":["Remember that Hugging Face datasets are stored on disk by default, so this will not inflate your memory usage! Once the\n","columns have been added, you can stream batches from the dataset and add padding to each batch, which greatly\n","reduces the number of padding tokens compared to padding the entire dataset."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"fMFBHAdW99bV"},"outputs":[],"source":["tf_dataset = model.prepare_tf_dataset(dataset, batch_size=16, shuffle=True, tokenizer=tokenizer)"]},{"cell_type":"markdown","metadata":{"id":"zSxRSjeL99bV"},"source":["Note that in the code sample above, you need to pass the tokenizer to `prepare_tf_dataset` so it can correctly pad batches as they're loaded.\n","If all the samples in your dataset are the same length and no padding is necessary, you can skip this argument.\n","If you need to do something more complex than just padding samples (e.g. corrupting tokens for masked language\n","modelling), you can use the `collate_fn` argument instead to pass a function that will be called to transform the\n","list of samples into a batch and apply any preprocessing you want. See our\n","[examples](https://github.com/huggingface/transformers/tree/main/examples) or\n","[notebooks](https://huggingface.co/docs/transformers/notebooks) to see this approach in action.\n","\n","Once you've created a `tf.data.Dataset`, you can compile and fit the model as before:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"sebPDPku99bV"},"outputs":[],"source":["model.compile(optimizer=Adam(3e-5))\n","\n","model.fit(tf_dataset)"]},{"cell_type":"markdown","metadata":{"id":"2cB02_Oe99bV"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"BOFYucCf99bV"},"source":["## Train in native PyTorch"]},{"cell_type":"markdown","metadata":{"id":"e1Lq8TGY99bW"},"source":[""]},{"cell_type":"markdown","metadata":{"id":"aK3zo38299bW"},"source":["## Additional resources"]},{"cell_type":"markdown","metadata":{"id":"pYoRSX0n99bW"},"source":["For more fine-tuning examples, refer to:\n","\n","- [🤗 Transformers Examples](https://github.com/huggingface/transformers/tree/main/examples) includes scripts\n"," to train common NLP tasks in PyTorch and TensorFlow.\n","\n","- [🤗 Transformers Notebooks](https://huggingface.co/docs/transformers/main/en/notebooks) contains various notebooks on how to fine-tune a model for specific tasks in PyTorch and TensorFlow."]}],"metadata":{"colab":{"provenance":[{"file_id":"https://github.com/huggingface/notebooks/blob/main/transformers_doc/en/tensorflow/training.ipynb","timestamp":1681680499450}]}},"nbformat":4,"nbformat_minor":0}
--------------------------------------------------------------------------------
/Lectures and codes/Module 7- Transformers/python/HuggingFace_quickTour.ipynb:
--------------------------------------------------------------------------------
1 | {"cells":[{"cell_type":"code","execution_count":null,"metadata":{"id":"wORXeiay2QAk"},"outputs":[],"source":["# Transformers installation\n","! pip install transformers datasets\n","# To install from source instead of the last release, comment the command above and uncomment the following one.\n","# ! pip install git+https://github.com/huggingface/transformers.git"]},{"cell_type":"markdown","metadata":{"id":"by3pdwQa2QAn"},"source":["# Quick tour"]},{"cell_type":"markdown","metadata":{"id":"oL8aoWTE2QAo"},"source":["Get up and running with 🤗 Transformers! Whether you're a developer or an everyday user, this quick tour will help you get started and show you how to use the [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) for inference, load a pretrained model and preprocessor with an [AutoClass](https://huggingface.co/docs/transformers/main/en/./model_doc/auto), and quickly train a model with PyTorch or TensorFlow. If you're a beginner, we recommend checking out our tutorials or [course](https://huggingface.co/course/chapter1/1) next for more in-depth explanations of the concepts introduced here.\n","\n","Before you begin, make sure you have all the necessary libraries installed:\n","\n","```bash\n","!pip install transformers datasets\n","```\n","\n","You'll also need to install your preferred machine learning framework:\n","\n","```bash\n","pip install tensorflow\n","```"]},{"cell_type":"markdown","metadata":{"id":"Oa9sYOn72QAp"},"source":["## Pipeline"]},{"cell_type":"code","execution_count":null,"metadata":{"cellView":"form","hide_input":true,"id":"wrnQdhTI2QAp","outputId":"f2d89e47-e990-41dd-ee0f-7895f3c5ffba"},"outputs":[{"data":{"text/html":[""],"text/plain":[""]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["#@title\n","from IPython.display import HTML\n","\n","HTML('')"]},{"cell_type":"markdown","metadata":{"id":"9MwuNyRe2QAq"},"source":["The [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) is the easiest and fastest way to use a pretrained model for inference. You can use the [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) out-of-the-box for many tasks across different modalities, some of which are shown in the table below:\n","\n","\n","\n","For a complete list of available tasks, check out the [pipeline API reference](https://huggingface.co/docs/transformers/main/en/./main_classes/pipelines).\n","\n","\n","\n","| **Task** | **Description** | **Modality** | **Pipeline identifier** |\n","|------------------------------|--------------------------------------------------------------------------------------------------------------|-----------------|-----------------------------------------------|\n","| Text classification | assign a label to a given sequence of text | NLP | pipeline(task=“sentiment-analysis”) |\n","| Text generation | generate text given a prompt | NLP | pipeline(task=“text-generation”) |\n","| Summarization | generate a summary of a sequence of text or document | NLP | pipeline(task=“summarization”) |\n","| Image classification | assign a label to an image | Computer vision | pipeline(task=“image-classification”) |\n","| Image segmentation | assign a label to each individual pixel of an image (supports semantic, panoptic, and instance segmentation) | Computer vision | pipeline(task=“image-segmentation”) |\n","| Object detection | predict the bounding boxes and classes of objects in an image | Computer vision | pipeline(task=“object-detection”) |\n","| Audio classification | assign a label to some audio data | Audio | pipeline(task=“audio-classification”) |\n","| Automatic speech recognition | transcribe speech into text | Audio | pipeline(task=“automatic-speech-recognition”) |\n","| Visual question answering | answer a question about the image, given an image and a question | Multimodal | pipeline(task=“vqa”) |\n","| Document question answering | answer a question about a document, given an image and a question | Multimodal | pipeline(task=\"document-question-answering\") |\n","| Image captioning | generate a caption for a given image | Multimodal | pipeline(task=\"image-to-text\") |\n","\n","Start by creating an instance of [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) and specifying a task you want to use it for. In this guide, you'll use the [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) for sentiment analysis as an example:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"S9cN7k1J2QAr"},"outputs":[],"source":["from transformers import pipeline\n","\n","classifier = pipeline(\"sentiment-analysis\")"]},{"cell_type":"markdown","metadata":{"id":"RTxFnr2b2QAr"},"source":["The [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) downloads and caches a default [pretrained model](https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english) and tokenizer for sentiment analysis. Now you can use the `classifier` on your target text:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"NnBv9N622QAs","outputId":"f5ccf470-5a6c-4c08-dd72-75f61f3fe081"},"outputs":[{"data":{"text/plain":["[{'label': 'POSITIVE', 'score': 0.9998}]"]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["classifier(\"We are very happy to show you the 🤗 Transformers library.\")"]},{"cell_type":"markdown","metadata":{"id":"KJ6hG4KC2QAs"},"source":["If you have more than one input, pass your inputs as a list to the [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) to return a list of dictionaries:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"2NnI8rd32QAs","outputId":"31581f49-a1fe-4aaa-f461-05ca509ee485"},"outputs":[{"data":{"text/plain":["label: POSITIVE, with score: 0.9998\n","label: NEGATIVE, with score: 0.5309"]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["results = classifier([\"We are very happy to show you the 🤗 Transformers library.\", \"We hope you don't hate it.\"])\n","for result in results:\n"," print(f\"label: {result['label']}, with score: {round(result['score'], 4)}\")"]},{"cell_type":"markdown","metadata":{"id":"U5FCwyHA2QAt"},"source":["The [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) can also iterate over an entire dataset for any task you like. For this example, let's choose automatic speech recognition as our task:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Pq0b1CrA2QAt"},"outputs":[],"source":["import torch\n","from transformers import pipeline\n","\n","speech_recognizer = pipeline(\"automatic-speech-recognition\", model=\"facebook/wav2vec2-base-960h\")"]},{"cell_type":"markdown","metadata":{"id":"j6X7wq1q2QAt"},"source":["Load an audio dataset (see the 🤗 Datasets [Quick Start](https://huggingface.co/docs/datasets/quickstart#audio) for more details) you'd like to iterate over. For example, load the [MInDS-14](https://huggingface.co/datasets/PolyAI/minds14) dataset:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"lrSbFjzw2QAt"},"outputs":[],"source":["from datasets import load_dataset, Audio\n","\n","dataset = load_dataset(\"PolyAI/minds14\", name=\"en-US\", split=\"train\")"]},{"cell_type":"markdown","metadata":{"id":"LQM7yHOG2QAt"},"source":["You need to make sure the sampling rate of the dataset matches the sampling \n","rate [`facebook/wav2vec2-base-960h`](https://huggingface.co/facebook/wav2vec2-base-960h) was trained on:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"rtuZ7FjC2QAt"},"outputs":[],"source":["dataset = dataset.cast_column(\"audio\", Audio(sampling_rate=speech_recognizer.feature_extractor.sampling_rate))"]},{"cell_type":"markdown","metadata":{"id":"zZUEt8r82QAu"},"source":["The audio files are automatically loaded and resampled when calling the `\"audio\"` column.\n","Extract the raw waveform arrays from the first 4 samples and pass it as a list to the pipeline:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"asbrI6DV2QAu","outputId":"97582c37-d7ce-4fe3-a48e-fbc17f31119d"},"outputs":[{"data":{"text/plain":["['I WOULD LIKE TO SET UP A JOINT ACCOUNT WITH MY PARTNER HOW DO I PROCEED WITH DOING THAT', \"FONDERING HOW I'D SET UP A JOIN TO HELL T WITH MY WIFE AND WHERE THE AP MIGHT BE\", \"I I'D LIKE TOY SET UP A JOINT ACCOUNT WITH MY PARTNER I'M NOT SEEING THE OPTION TO DO IT ON THE APSO I CALLED IN TO GET SOME HELP CAN I JUST DO IT OVER THE PHONE WITH YOU AND GIVE YOU THE INFORMATION OR SHOULD I DO IT IN THE AP AN I'M MISSING SOMETHING UQUETTE HAD PREFERRED TO JUST DO IT OVER THE PHONE OF POSSIBLE THINGS\", 'HOW DO I FURN A JOINA COUT']"]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["result = speech_recognizer(dataset[:4][\"audio\"])\n","print([d[\"text\"] for d in result])"]},{"cell_type":"markdown","metadata":{"id":"nxY_n-Hr2QAu"},"source":["For larger datasets where the inputs are big (like in speech or vision), you'll want to pass a generator instead of a list to load all the inputs in memory. Take a look at the [pipeline API reference](https://huggingface.co/docs/transformers/main/en/./main_classes/pipelines) for more information."]},{"cell_type":"markdown","metadata":{"id":"7GnERGo52QAu"},"source":["### Use another model and tokenizer in the pipeline"]},{"cell_type":"markdown","metadata":{"id":"9k_Yh-Hc2QAu"},"source":["The [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) can accommodate any model from the [Hub](https://huggingface.co/models), making it easy to adapt the [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) for other use-cases. For example, if you'd like a model capable of handling French text, use the tags on the Hub to filter for an appropriate model. The top filtered result returns a multilingual [BERT model](https://huggingface.co/nlptown/bert-base-multilingual-uncased-sentiment) finetuned for sentiment analysis you can use for French text:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"EBTZ3JXl2QAu"},"outputs":[],"source":["model_name = \"nlptown/bert-base-multilingual-uncased-sentiment\""]},{"cell_type":"markdown","metadata":{"id":"WGRARSay2QAv"},"source":["Use [TFAutoModelForSequenceClassification](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.TFAutoModelForSequenceClassification) and [AutoTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoTokenizer) to load the pretrained model and it's associated tokenizer (more on an `TFAutoClass` in the next section):"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"uioM7Jjq2QAv"},"outputs":[],"source":["from transformers import AutoTokenizer, TFAutoModelForSequenceClassification\n","\n","model = TFAutoModelForSequenceClassification.from_pretrained(model_name)\n","tokenizer = AutoTokenizer.from_pretrained(model_name)"]},{"cell_type":"markdown","metadata":{"id":"Yq3fKaSO2QAv"},"source":["Specify the model and tokenizer in the [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline), and now you can apply the `classifier` on French text:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Ybq3HZ6q2QAv","outputId":"d2244fda-3cba-4d18-da19-aae5d4908191"},"outputs":[{"data":{"text/plain":["[{'label': '5 stars', 'score': 0.7273}]"]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["classifier = pipeline(\"sentiment-analysis\", model=model, tokenizer=tokenizer)\n","classifier(\"Nous sommes très heureux de vous présenter la bibliothèque 🤗 Transformers.\")"]},{"cell_type":"markdown","metadata":{"id":"wtV_AKDr2QAv"},"source":["If you can't find a model for your use-case, you'll need to finetune a pretrained model on your data. Take a look at our [finetuning tutorial](https://huggingface.co/docs/transformers/main/en/./training) to learn how. Finally, after you've finetuned your pretrained model, please consider [sharing](https://huggingface.co/docs/transformers/main/en/./model_sharing) the model with the community on the Hub to democratize machine learning for everyone! 🤗"]},{"cell_type":"markdown","metadata":{"id":"PnAiciYb2QAv"},"source":["## AutoClass"]},{"cell_type":"code","execution_count":null,"metadata":{"cellView":"form","hide_input":true,"id":"CMn_Yg1s2QAv","outputId":"f49646df-bf30-43a2-ccbb-0c78abab8c1f"},"outputs":[{"data":{"text/html":[""],"text/plain":[""]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["#@title\n","from IPython.display import HTML\n","\n","HTML('')"]},{"cell_type":"markdown","metadata":{"id":"kltamsxC2QAv"},"source":["Under the hood, the [AutoModelForSequenceClassification](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoModelForSequenceClassification) and [AutoTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoTokenizer) classes work together to power the [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline) you used above. An [AutoClass](https://huggingface.co/docs/transformers/main/en/./model_doc/auto) is a shortcut that automatically retrieves the architecture of a pretrained model from its name or path. You only need to select the appropriate `AutoClass` for your task and it's associated preprocessing class. \n","\n","Let's return to the example from the previous section and see how you can use the `AutoClass` to replicate the results of the [pipeline()](https://huggingface.co/docs/transformers/main/en/main_classes/pipelines#transformers.pipeline)."]},{"cell_type":"markdown","metadata":{"id":"e9_Age_32QAw"},"source":["### AutoTokenizer"]},{"cell_type":"markdown","metadata":{"id":"rLrNhFZm2QAw"},"source":["A tokenizer is responsible for preprocessing text into an array of numbers as inputs to a model. There are multiple rules that govern the tokenization process, including how to split a word and at what level words should be split (learn more about tokenization in the [tokenizer summary](https://huggingface.co/docs/transformers/main/en/./tokenizer_summary)). The most important thing to remember is you need to instantiate a tokenizer with the same model name to ensure you're using the same tokenization rules a model was pretrained with.\n","\n","Load a tokenizer with [AutoTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoTokenizer):"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"BjBJNJiK2QAw"},"outputs":[],"source":["from transformers import AutoTokenizer\n","\n","model_name = \"nlptown/bert-base-multilingual-uncased-sentiment\"\n","tokenizer = AutoTokenizer.from_pretrained(model_name)"]},{"cell_type":"markdown","metadata":{"id":"NKeAGv_52QAw"},"source":["Pass your text to the tokenizer:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"2Ecx6ge72QAw","outputId":"3d34a028-d94c-46a1-e005-22d979f2e2e3"},"outputs":[{"data":{"text/plain":["{'input_ids': [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102],\n"," 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n"," 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}"]},"execution_count":null,"metadata":{},"output_type":"execute_result"}],"source":["encoding = tokenizer(\"We are very happy to show you the 🤗 Transformers library.\")\n","print(encoding)"]},{"cell_type":"markdown","metadata":{"id":"pG9msf6Q2QAw"},"source":["The tokenizer returns a dictionary containing:\n","\n","* [input_ids](https://huggingface.co/docs/transformers/main/en/./glossary#input-ids): numerical representations of your tokens.\n","* [attention_mask](https://huggingface.co/docs/transformers/main/en/.glossary#attention-mask): indicates which tokens should be attended to.\n","\n","A tokenizer can also accept a list of inputs, and pad and truncate the text to return a batch with uniform length:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"NQjOkzZB2QAw"},"outputs":[],"source":["tf_batch = tokenizer(\n"," [\"We are very happy to show you the 🤗 Transformers library.\", \"We hope you don't hate it.\"],\n"," padding=True,\n"," truncation=True,\n"," max_length=512,\n"," return_tensors=\"tf\",\n",")"]},{"cell_type":"markdown","metadata":{"id":"HNUJNKSX2QAx"},"source":["\n","\n","Check out the [preprocess](https://huggingface.co/docs/transformers/main/en/./preprocessing) tutorial for more details about tokenization, and how to use an [AutoImageProcessor](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoImageProcessor), [AutoFeatureExtractor](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoFeatureExtractor) and [AutoProcessor](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoProcessor) to preprocess image, audio, and multimodal inputs.\n","\n",""]},{"cell_type":"code","source":["ouputs = model(tf_batch)"],"metadata":{"id":"Jermlll5812D"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["output.logits #non softmaxed output"],"metadata":{"id":"kbFpBTTX85kf"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import tensorflow as tf\n","tf.nn.softmax(output.logits)"],"metadata":{"id":"9wi-MDKG85f9"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"sFRWPT4x2QAx"},"source":["### AutoModel"]},{"cell_type":"markdown","metadata":{"id":"ACbeTWcP2QAx"},"source":["🤗 Transformers provides a simple and unified way to load pretrained instances. This means you can load an [TFAutoModel](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.TFAutoModel) like you would load an [AutoTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoTokenizer). The only difference is selecting the correct [TFAutoModel](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.TFAutoModel) for the task. For text (or sequence) classification, you should load [TFAutoModelForSequenceClassification](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.TFAutoModelForSequenceClassification):"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"aV7EW-FM2QAx"},"outputs":[],"source":["from transformers import TFAutoModelForSequenceClassification\n","\n","model_name = \"nlptown/bert-base-multilingual-uncased-sentiment\"\n","tf_model = TFAutoModelForSequenceClassification.from_pretrained(model_name)"]},{"cell_type":"markdown","metadata":{"id":"drB5nUKa2QAx"},"source":["\n","\n","See the [task summary](https://huggingface.co/docs/transformers/main/en/./task_summary) for tasks supported by an [AutoModel](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoModel) class.\n","\n","\n","\n","Now pass your preprocessed batch of inputs directly to the model by passing the dictionary keys directly to the tensors:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"SbOFzaYZ2QAx"},"outputs":[],"source":["tf_outputs = tf_model(tf_batch)"]},{"cell_type":"markdown","metadata":{"id":"FYR2bCKU2QAx"},"source":["The model outputs the final activations in the `logits` attribute. Apply the softmax function to the `logits` to retrieve the probabilities:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"FJDpyXRx2QAx"},"outputs":[],"source":["import tensorflow as tf\n","\n","tf_predictions = tf.nn.softmax(tf_outputs.logits, axis=-1)\n","tf_predictions"]},{"cell_type":"markdown","metadata":{"id":"SnA4l5922QAy"},"source":["\n","\n","All 🤗 Transformers models (PyTorch or TensorFlow) output the tensors *before* the final activation\n","function (like softmax) because the final activation function is often fused with the loss. Model outputs are special dataclasses so their attributes are autocompleted in an IDE. The model outputs behave like a tuple or a dictionary (you can index with an integer, a slice or a string) in which case, attributes that are None are ignored.\n","\n",""]},{"cell_type":"markdown","metadata":{"id":"71eZZK5P2QAy"},"source":["### Save a model"]},{"cell_type":"markdown","metadata":{"id":"19WHvE6q2QAy"},"source":["Once your model is fine-tuned, you can save it with its tokenizer using [TFPreTrainedModel.save_pretrained()](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.save_pretrained):"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"gwiIiFXA2QAy"},"outputs":[],"source":["tf_save_directory = \"./tf_save_pretrained\"\n","tokenizer.save_pretrained(tf_save_directory)\n","tf_model.save_pretrained(tf_save_directory)"]},{"cell_type":"markdown","metadata":{"id":"YV8sclKm2QAy"},"source":["When you are ready to use the model again, reload it with [TFPreTrainedModel.from_pretrained()](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.from_pretrained):"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"KPMvLfMt2QAy"},"outputs":[],"source":["tf_model = TFAutoModelForSequenceClassification.from_pretrained(\"./tf_save_pretrained\")"]},{"cell_type":"markdown","metadata":{"id":"7-8ENbKe2QAy"},"source":["One particularly cool 🤗 Transformers feature is the ability to save a model and reload it as either a PyTorch or TensorFlow model. The `from_pt` or `from_tf` parameter can convert the model from one framework to the other:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"e91K30dB2QAy"},"outputs":[],"source":["from transformers import TFAutoModel\n","\n","tokenizer = AutoTokenizer.from_pretrained(pt_save_directory)\n","tf_model = TFAutoModelForSequenceClassification.from_pretrained(pt_save_directory, from_pt=True)"]},{"cell_type":"markdown","metadata":{"id":"35o-P3CC2QAy"},"source":["## Custom model builds"]},{"cell_type":"markdown","metadata":{"id":"ray4WbFW2QAy"},"source":["You can modify the model's configuration class to change how a model is built. The configuration specifies a model's attributes, such as the number of hidden layers or attention heads. You start from scratch when you initialize a model from a custom configuration class. The model attributes are randomly initialized, and you'll need to train the model before you can use it to get meaningful results.\n","\n","Start by importing [AutoConfig](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoConfig), and then load the pretrained model you want to modify. Within [AutoConfig.from_pretrained()](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.AutoConfig.from_pretrained), you can specify the attribute you want to change, such as the number of attention heads:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"orTzhaqw2QAz"},"outputs":[],"source":["from transformers import AutoConfig\n","\n","my_config = AutoConfig.from_pretrained(\"distilbert-base-uncased\", n_heads=12)"]},{"cell_type":"markdown","metadata":{"id":"qxcWJAVS2QAz"},"source":["Create a model from your custom configuration with [TFAutoModel.from_config()](https://huggingface.co/docs/transformers/main/en/model_doc/auto#transformers.FlaxAutoModelForVision2Seq.from_config):"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"IBAa4wmg2QAz"},"outputs":[],"source":["from transformers import TFAutoModel\n","\n","my_model = TFAutoModel.from_config(my_config)"]},{"cell_type":"markdown","metadata":{"id":"oPW7ML6R2QAz"},"source":["Take a look at the [Create a custom architecture](https://huggingface.co/docs/transformers/main/en/./create_a_model) guide for more information about building custom configurations."]},{"cell_type":"markdown","metadata":{"id":"BWWFb1Sw2QAz"},"source":["## Trainer - a PyTorch optimized training loop"]},{"cell_type":"markdown","metadata":{"id":"PNMXhe042QAz"},"source":["All models are a standard [`torch.nn.Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) so you can use them in any typical training loop. While you can write your own training loop, 🤗 Transformers provides a [Trainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer) class for PyTorch, which contains the basic training loop and adds additional functionality for features like distributed training, mixed precision, and more.\n","\n","Depending on your task, you'll typically pass the following parameters to [Trainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer):\n","\n","1. A [PreTrainedModel](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel) or a [`torch.nn.Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module):\n","\n"," ```py\n"," >>> from transformers import AutoModelForSequenceClassification\n","\n"," >>> model = AutoModelForSequenceClassification.from_pretrained(\"distilbert-base-uncased\")\n"," ```\n","\n","2. [TrainingArguments](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.TrainingArguments) contains the model hyperparameters you can change like learning rate, batch size, and the number of epochs to train for. The default values are used if you don't specify any training arguments:\n","\n"," ```py\n"," >>> from transformers import TrainingArguments\n","\n"," >>> training_args = TrainingArguments(\n"," ... output_dir=\"path/to/save/folder/\",\n"," ... learning_rate=2e-5,\n"," ... per_device_train_batch_size=8,\n"," ... per_device_eval_batch_size=8,\n"," ... num_train_epochs=2,\n"," ... )\n"," ```\n","\n","3. A preprocessing class like a tokenizer, image processor, feature extractor, or processor:\n","\n"," ```py\n"," >>> from transformers import AutoTokenizer\n","\n"," >>> tokenizer = AutoTokenizer.from_pretrained(\"distilbert-base-uncased\")\n"," ```\n","\n","4. Load a dataset:\n","\n"," ```py\n"," >>> from datasets import load_dataset\n","\n"," >>> dataset = load_dataset(\"rotten_tomatoes\") # doctest: +IGNORE_RESULT\n"," ```\n","\n","5. Create a function to tokenize the dataset:\n","\n"," ```py\n"," >>> def tokenize_dataset(dataset):\n"," ... return tokenizer(dataset[\"text\"])\n"," ```\n","\n"," Then apply it over the entire dataset with [map](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.map):\n","\n"," ```py\n"," >>> dataset = dataset.map(tokenize_dataset, batched=True)\n"," ```\n","\n","6. A [DataCollatorWithPadding](https://huggingface.co/docs/transformers/main/en/main_classes/data_collator#transformers.DataCollatorWithPadding) to create a batch of examples from your dataset:\n","\n"," ```py\n"," >>> from transformers import DataCollatorWithPadding\n","\n"," >>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer)\n"," ```\n","\n","Now gather all these classes in [Trainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer):"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"WWiHEBKw2QAz"},"outputs":[],"source":["from transformers import Trainer\n","\n","trainer = Trainer(\n"," model=model,\n"," args=training_args,\n"," train_dataset=dataset[\"train\"],\n"," eval_dataset=dataset[\"test\"],\n"," tokenizer=tokenizer,\n"," data_collator=data_collator,\n",") # doctest: +SKIP"]},{"cell_type":"markdown","metadata":{"id":"d7hjm7U92QAz"},"source":["When you're ready, call [train()](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer.train) to start training:"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"xSvDyHgn2QA0"},"outputs":[],"source":["trainer.train()"]},{"cell_type":"markdown","metadata":{"id":"r16f7LNF2QA0"},"source":["\n","\n","For tasks - like translation or summarization - that use a sequence-to-sequence model, use the [Seq2SeqTrainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Seq2SeqTrainer) and [Seq2SeqTrainingArguments](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Seq2SeqTrainingArguments) classes instead.\n","\n","\n","\n","You can customize the training loop behavior by subclassing the methods inside [Trainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer). This allows you to customize features such as the loss function, optimizer, and scheduler. Take a look at the [Trainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer) reference for which methods can be subclassed. \n","\n","The other way to customize the training loop is by using [Callbacks](https://huggingface.co/docs/transformers/main/en/./main_classes/callbacks). You can use callbacks to integrate with other libraries and inspect the training loop to report on progress or stop the training early. Callbacks do not modify anything in the training loop itself. To customize something like the loss function, you need to subclass the [Trainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer) instead."]},{"cell_type":"markdown","metadata":{"id":"4JQ_mnpC2QA0"},"source":["## Train with TensorFlow"]},{"cell_type":"markdown","metadata":{"id":"HmloAJfL2QA0"},"source":["All models are a standard [`tf.keras.Model`](https://www.tensorflow.org/api_docs/python/tf/keras/Model) so they can be trained in TensorFlow with the [Keras](https://keras.io/) API. 🤗 Transformers provides the [prepare_tf_dataset()](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.prepare_tf_dataset) method to easily load your dataset as a `tf.data.Dataset` so you can start training right away with Keras' [`compile`](https://keras.io/api/models/model_training_apis/#compile-method) and [`fit`](https://keras.io/api/models/model_training_apis/#fit-method) methods.\n","\n","1. You'll start with a [TFPreTrainedModel](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel) or a [`tf.keras.Model`](https://www.tensorflow.org/api_docs/python/tf/keras/Model):\n","\n"," ```py\n"," >>> from transformers import TFAutoModelForSequenceClassification\n","\n"," >>> model = TFAutoModelForSequenceClassification.from_pretrained(\"distilbert-base-uncased\")\n"," ```\n","\n","2. A preprocessing class like a tokenizer, image processor, feature extractor, or processor:\n","\n"," ```py\n"," >>> from transformers import AutoTokenizer\n","\n"," >>> tokenizer = AutoTokenizer.from_pretrained(\"distilbert-base-uncased\")\n"," ```\n","\n","3. Create a function to tokenize the dataset:\n","\n"," ```py\n"," >>> def tokenize_dataset(dataset):\n"," ... return tokenizer(dataset[\"text\"]) # doctest: +SKIP\n"," ```\n","\n","4. Apply the tokenizer over the entire dataset with [map](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.map) and then pass the dataset and tokenizer to [prepare_tf_dataset()](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.prepare_tf_dataset). You can also change the batch size and shuffle the dataset here if you'd like:\n","\n"," ```py\n"," >>> dataset = dataset.map(tokenize_dataset) # doctest: +SKIP\n"," >>> tf_dataset = model.prepare_tf_dataset(\n"," ... dataset, batch_size=16, shuffle=True, tokenizer=tokenizer\n"," ... ) # doctest: +SKIP\n"," ```\n","\n","5. When you're ready, you can call `compile` and `fit` to start training:\n","\n"," ```py\n"," >>> from tensorflow.keras.optimizers import Adam\n","\n"," >>> model.compile(optimizer=Adam(3e-5))\n"," >>> model.fit(dataset) # doctest: +SKIP\n"," ```"]},{"cell_type":"markdown","metadata":{"id":"4z0VPO8Y2QA0"},"source":["## What's next?"]},{"cell_type":"markdown","metadata":{"id":"626eIn6T2QA0"},"source":["Now that you've completed the 🤗 Transformers quick tour, check out our guides and learn how to do more specific things like writing a custom model, fine-tuning a model for a task, and how to train a model with a script. If you're interested in learning more about 🤗 Transformers core concepts, grab a cup of coffee and take a look at our Conceptual Guides!"]}],"metadata":{"colab":{"provenance":[{"file_id":"https://github.com/huggingface/notebooks/blob/main/transformers_doc/en/tensorflow/quicktour.ipynb","timestamp":1681678541740}]}},"nbformat":4,"nbformat_minor":0}
--------------------------------------------------------------------------------
/Platforms and tools/Google Colab/README.md:
--------------------------------------------------------------------------------
1 | Here is the link to my YouTube playlist for Google Colab! https://www.youtube.com/playlist?list=PL2GWo47BFyUOsj5rxrF9s6vRn0HCBEhpW
2 |
3 | **Topics**:
4 | 1. Google Colab: JUmpstart!
5 | 2. Google Colab Basics
6 | 3. Google Colab Tricks
7 |
8 |
9 | ## 🔗 Links
10 |
11 | [](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)
12 |
13 | [](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)
14 |
15 | [](https://twitter.com/PedramJahangiry)
16 |
17 |
--------------------------------------------------------------------------------
/Platforms and tools/Google Colab/google_colab_jumpstart.ipynb:
--------------------------------------------------------------------------------
1 | {"cells":[{"attachments":{},"cell_type":"markdown","id":"252fb8d1-ee72-4d67-9840-54684b32ad37","metadata":{"id":"252fb8d1-ee72-4d67-9840-54684b32ad37","tags":[]},"source":["### Prof. Pedram Jahangiry\n","\n","You need to make a copy to your own Google drive if you want to edit the original notebook! Start by opening this notebook on Colab 👇\n","\n","
\n","\n","\n","\n"," \n","\n","\n","## 🔗 Links\n","\n","[](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)\n","\n","[](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)\n","\n","[](https://twitter.com/PedramJahangiry)\n","\n","\n","---\n"]},{"cell_type":"markdown","id":"64e689f4-94b0-4604-b914-05b28cd7813a","metadata":{"id":"64e689f4-94b0-4604-b914-05b28cd7813a"},"source":["# Integration with Drive\n","\n","Colaboratory is integrated with Google Drive. It allows you to share, comment, and collaborate on the same document with multiple people:\n","\n","* The **SHARE** button (top-right of the toolbar) allows you to share the notebook and control permissions set on it.\n","\n","* **File->Save a Copy in Drive** creates a copy of the notebook in Drive.\n"]},{"cell_type":"markdown","id":"2bc3034b-5e48-4fde-b0a4-ca9aea6e0a41","metadata":{"id":"2bc3034b-5e48-4fde-b0a4-ca9aea6e0a41"},"source":["---\n","\n","# Cells\n","A notebook is a list of cells. Cells contain either explanatory text or executable code and its output. Click a cell to select it.\n","\n","## Code cells\n","Below is a **code cell**. Once the toolbar button indicates CONNECTED, click in the cell to select it and execute the contents in the following ways:\n","\n","* Click the **Play icon** in the left gutter of the cell;\n","* Type **Cmd/Ctrl+Enter** to run the cell in place;\n","* Type **Shift+Enter** to run the cell and move focus to the next cell (adding one if none exists); or\n","* Type **Alt+Enter** to run the cell and insert a new code cell immediately below it.\n","\n","There are additional options for running some or all cells in the **Runtime** menu."]},{"cell_type":"code","execution_count":null,"id":"4852d01e-497b-4a42-b83a-a04f862dc9fa","metadata":{"id":"4852d01e-497b-4a42-b83a-a04f862dc9fa"},"outputs":[],"source":["a=10\n","a"]},{"cell_type":"markdown","id":"9b01251b-d481-423b-8915-b3c3a411607a","metadata":{"id":"9b01251b-d481-423b-8915-b3c3a411607a"},"source":["## Text cells\n","This is a **text cell**. You can **double-click** to edit this cell. Text cells\n","use markdown syntax. To learn more, see our [markdown\n","guide](https://colab.research.google.com/notebooks/markdown_guide.ipynb).\n","\n","You can also add math to text cells using [LaTeX](http://www.latex-project.org/)\n","to be rendered by [MathJax](https://www.mathjax.org). Just place the statement\n","within a pair of **\\$** signs. For example `$\\sqrt{3x-1}+(1+x)^2$` becomes\n","$\\sqrt{3x-1}+(1+x)^2.$\n","\n","or using two dollar signs to center an equation like this: \n","$$y= \\beta_0 + \\beta_1 x_1 + \\beta_2 x_2 + \\epsilon $$\n","\n"]},{"cell_type":"markdown","id":"d3833880-e851-4735-b904-68e409ef00f6","metadata":{"id":"d3833880-e851-4735-b904-68e409ef00f6"},"source":["## Adding and moving cells\n","You can add new cells by using the **+ CODE** and **+ TEXT** buttons that show when you hover between cells. These buttons are also in the toolbar above the notebook where they can be used to add a cell below the currently selected cell.\n","\n","You can move a cell by selecting it and clicking **Cell Up** or **Cell Down** in the top toolbar. \n","\n","Consecutive cells can be selected by \"lasso selection\" by dragging from outside one cell and through the group. Non-adjacent cells can be selected concurrently by clicking one and then holding down Ctrl while clicking another. Similarly, using Shift instead of Ctrl will select all intermediate cells."]},{"cell_type":"markdown","id":"2b4e1d8a-b057-45c1-a720-69ed5336a28b","metadata":{"id":"2b4e1d8a-b057-45c1-a720-69ed5336a28b"},"source":["---\n","# Working with python\n","Colaboratory is built on top of [Jupyter Notebook](https://jupyter.org/). Below are some examples of convenience functions provided."]},{"cell_type":"code","execution_count":null,"id":"3fa12131-6a0f-4acf-bce8-ce1733958dc8","metadata":{"id":"3fa12131-6a0f-4acf-bce8-ce1733958dc8"},"outputs":[],"source":["print(\"hello world\")"]},{"cell_type":"code","execution_count":null,"id":"92689eb1-0dd1-4506-b328-c36064f2a53e","metadata":{"id":"92689eb1-0dd1-4506-b328-c36064f2a53e"},"outputs":[],"source":["x = 1\n","y = 4\n","z = y/(1-x)"]},{"cell_type":"markdown","id":"ae3e573e-9902-44c6-8f4b-b3577c849e49","metadata":{"id":"ae3e573e-9902-44c6-8f4b-b3577c849e49"},"source":["Long running python processes can be interrupted. Run the following cell and select **Runtime -> Interrupt execution** (*hotkey: Cmd/Ctrl-M I*) to stop execution."]},{"cell_type":"code","execution_count":null,"id":"n8SkU-pIY3Pw","metadata":{"id":"n8SkU-pIY3Pw"},"outputs":[],"source":["x= 5\n","while x>0:\n"," x+=1"]},{"cell_type":"markdown","id":"134c73d2-dd3e-4702-b11e-9b50e1d91dbe","metadata":{"id":"134c73d2-dd3e-4702-b11e-9b50e1d91dbe"},"source":["## Rich, interactive outputs\n","Until now all of the generated outputs have been text, but they can be more interesting, like the chart below. "]},{"cell_type":"code","execution_count":1,"id":"2664f1f9-eb1f-49c9-a289-8f39c21f2dc0","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":281},"executionInfo":{"elapsed":833,"status":"ok","timestamp":1661962082851,"user":{"displayName":"PJ Tutorials","userId":"11195974499947542757"},"user_tz":360},"id":"2664f1f9-eb1f-49c9-a289-8f39c21f2dc0","outputId":"205575f1-059c-47b9-a474-3eba1cf1176d"},"outputs":[{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAXcAAAEICAYAAACktLTqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9edwsWVnn+Xtiy3zXu7636tZGUVCUrAVDCS7oKIg6MIozLi0qliMOo9Dt0rYjtmjb07btqI3LoGIJFGAjCBQIhbIUUCu13trrLnX37d233DP2M3+cOLFl5PrmdvOe7+fzfm7eyMiMk5kRv3jOc56FGGOQSCQSyWShjHoAEolEIuk/UtwlEolkApHiLpFIJBOIFHeJRCKZQKS4SyQSyQQixV0ikUgmECnukpYQUYWIbggef5SI/jB4/H1EdHHEY9vRGIjoHiL6pX7vOwmMw+8r2RlS3CUAACI6S0T1QMzF31WMsVnG2OlRj69XiHOaiI6MeiyC4EZhpr7rO0c9LslkIcVdEudHAjEXf0ujHlAf+F4ABwDcQETfPurBxPi3qe/6R0Y9IMlkIcVd0hIiYkT04g72+20iWiSiMhE9T0RvarLfW4noSSIqEdEFIvqD2HPXB8e7lYjOE9EGEf1u7PmpwDW0HVjinYj1rQC+AOBfg8fNxv8LRPQtIvoAERWJ6FjGZ3hBsE+ZiL5GRPtjr/8MEa0Er72PiF7ewdiyxvHbRPQIEWnB/3+FiA4TUb7dcYLv5m+I6MvBbOBbRHQlEf1F8J0dI6LXxPY/S0S/Q0RHgudvF8fJGNdVRHQHEa0T0Rki+tVePp9keEhxl+wYIroJwL8F8O2MsTkAPwTgbJPdqwB+HsBuAG8F8CtE9GOpfd4A4CYAbwLw+0T00mD7fwLwouDvh9BCrINxTQP4CQCfCP5+moiMFi95PYBTAPYHx/ocEe2NPf8zAP4P8JmAAeA/xJ77MoAbg+eeCI7XC38KwALwPiK6EcAfAfg5xpjZ4XF+CsD7gs9gAXgo2G8/gM8CeH9q/58F/y5fBOAlwWsTEJEC4E4ATwO4Gvx3+XUi+qEeP6NkGDDG5J/8A7gYVwAUgr9/DrYzAC8OHn8UwB8Gj78PwMXg8YsBrAH4AQB6l8f9CwB/Hjy+PjjeNbHnHwXw08Hj0wB+OPbcu8QYmrz3zwFYB6AByAMoAvjfYs/fA+CXgse/AGAJAKWO/Y7Yvu+LPfduAF9pctzdwefY1eT5ewDUYt91AcB/iT1/PYAtAEcB/E6Lz5c4TvD7/H3s+X8H4Gjs/68EUEj95r8c+/9bAJzK+H1fD+B86ti/A+D2UZ+38q/5n7TcJXF+jDG2O/hLW9NNYYydBPDrAP4AwBoRfYqIrsral4heT0R3B9P7IoBfBrcq46zEHtcAzAaPrwJwIfbcuTZDuxXApxljLuOW7x1obe0vskC5Yu8f/xyZ4yIilYj+mIhOEVEJ0awl/bni/Grsu97NGPs98QRj7CyAu8FF/q/F9g6Psxp7XM/4/yySpL/PrN/tBQCuIqKC+APwHwFc0eLzSUaMFHdJX2CM/SNj7A3gQsAA/L9Ndv1HAF8EcC1jbBeADwKgDg+zDODa2P+va7YjEV0D4I0Afi7wUa+Au2jeEveVp7iaiOJjuQ7cmm/HzwB4G/jMZRe4KAOdf6702N8K4DsBfAPcTTOQ4wSkv8+sz3sBwJnUzWiOMfaWHRxXMmCkuEt2DBHdRERvJKIcABPcQvSb7D4HYIsxZhLR68AFq1M+DeB3iGhPIN7/rsW+7wBwHNx3/+rg7yUALgJ4e5PXHADwq0SkE9FPAngp+EJsO+bA/dubAKbB/eQ9Edx4PgTgl8BnGT9CREJE+3acGO8homuCtYXfBfBPGfs8CqAcLPZOBTOIV4xZ9JEkhRR3ST/IAfhjABvgrosD4D7ZLN4N4P8hojKA3wcX7E75z+CugzMAvgbgH1rseyuAv2GMrcT/wGcKzVwzj4AvVm4A+K8AfoIxttnBuD4ejGsRwBEAD3fwmg+k4twfD7bfBuALjLF/DY79TgAfIqJ9PR6nHf8I/l2eBl9M/sP0DowxD8D/Cn6DPAP+/XwIfPYgGVMo6WKUSC5PiOgXwBdX3zDqsQwLIjoL/pm/PuqxSPqPtNwlEolkApHiLpFIJBOIdMtIJBLJBCItd4lEIplAtFEPAAD279/Prr/++lEPQyKRSC4pHn/88Q3G2ELWc2Mh7tdffz0OHTo06mFIJBLJJQURNc3Slm4ZiUQimUCkuEskEskEIsVdIpFIJhAp7hKJRDKBSHGXSCSSCUSKu0QikUwgUtwlEolkApHi3iMbFQtffnZ51MOQSCRjyv0n1lGx3JEdX4p7j/zTYxfwK594YqQ/nkQiGU8KNRs//5FH8clHzo9sDG3FnYiuDXpeHiGiw0T0a8H2vUR0FxGdCP7dE2z/WSJ6hoieJaIHiejmQX+IUbBZsQHwH1EikUjibNccMAac3qiObAydWO4ugN9kjL0MwHeAt+V6GYD3AvgGY+xG8F6P7w32PwPgf2aMvRLAfwHvLDNxFOpc1It1Z8QjkUgk44bQhfNbYyzujLFlxtgTweMygKMArgZv1PuxYLePAfixYJ8HGWPbwfaHAVzT70GPA8Ua//GkuEskkjSlQBfObVZGNoaufO5EdD2A14D3mryCMSZWFFcAXJHxkncC+HKT93oXER0iokPr6+vdDGMs2A7cMSUp7hKJJEXJ5LqwVLDgeM16xQ+WjsWdiGYB3AHg1xljpfhzjHf8YKn9vx9c3H876/0YY7cxxm5hjN2ysJBZsXKs2a5ZAKTlLpFIGinVeaCFz4DlgjmSMXQk7kSkgwv7Jxhjnws2rxLRweD5gwDWYvu/Crw7+ts67B5/yVGQbhmJRNIEYbkDwPmt2kjG0Em0DAH4MICjjLH3x576IoBbg8e3AvhCsP91AD4H4B2MseP9He54wBhDMbgzC5GXSCQSQdzoOzeiRdVOmnV8N4B3AHiWiJ4Ktv1HAH8M4NNE9E4A5wD8VPDc7wPYB+Bv+H0BLmPslr6OesRULBd+4ISSlrtEIklTqjvI6S4cTxmZ5d5W3BljDwCgJk+/KWP/XwLwSzsc11gTt9aluEskkjQl04Wu2TB0hvObY+qWkTQixV0yqRxfLcN2hx/d4fsMz6+Uh37cQVGqO1A1G7lcBec2R+OWkeLeAyKBSVVcFGWGqmRCKJkO3vpX9+Mzj18Y+rHvPbGOH/qL+0Zm5fabYt2GptqYzldxbqsKHlA4XKS494Cw3KfyVWzXpbhLJoNC1YHjMZxYHX7izUaZhxavV6yhH3sQFOo2NNXBVK6GquWPJPBCinsPFAJXzHS+JpOYJBND2eLn8oXt4VvPZuAKmpRCfKW6A11zMJ3nLplRLKpKce+BQpVb69P5KsqmN5Ipl0TSb6qWBwA4PwIfseXwY1fMyRD3sulB0xxM5bmoS3G/RCjUHeiqB8Ow4LPJsTYklzfV4Dy+uF0fusFSt73EGC5lTMeD4zHoUtwvPQo1B7rOp12AjJiRTAblQFjrjo+t6nDXkkzXS4zhUkZkp2qqC031MGXYI1koluLeA8W6DU2zx0LcbdeHGUxpJZKdELeaL2zXh3ps0/EbxnCpItbhhD7kcpWRlP6V4t4DW1UbmmpBU0df0/2/ffkofvZDj4zs+JLJISHuQ3Yj1IXPfQLEXZQm0bQoqu7MCEr/SnHvge2aBT1muY8yYub0ehUXRtgQQDI5VBKW+3DF3ZwgcRduGaEP0/kaVov20JPDpLj3QCEIcxoHt8x21QqtnmHw0KlNbPQYi/yBb57A//433+rziCT9omJyH3FOd3Bha7huGStwy0xCtIww9jQ1stwZgItDvmFKcW/Dh+4/jV+8/dHw/4wxlOoudH08fO7bNTv0Vw4axhhuvf1R3Hbf6Z5ef3qjiqMrpfY7SkZC1Xahqx7yuap0y+yAUnCDilvuwPAjZqS4t+GJ89u49/h62E2lYrnwfP7DqaoLIjZScS/UeVah7w8+dM1yfdiu33OtDNv1Ubf9kdQukbSnYnlQVRdTuSrObQ3XRzxRbhlhuYfizq+XYd8wpbi3oVBz4DFgMYgeEGnEhmaDCDA0d2Ti7vkMFZNfFCKUbJDUgljkXk9SKxB1GTo6nlRMB6rKY7OXCya8IRgMAmG5l81Lv5xHqe5AVXyoCj/fDd2CQj6WisPtyCTFvQ2bVe5fPhNYq8VUmJOuOeHq+LAp1Z2wt6FIAhkkNZt/zl4X2+xQ3C/9C3gSqVguFIWLu+sDq6XhiZEZnFv99rnfdt8pfPbxi319z3aUTAeGFn0OIsDQvaEbNZeduJuOB7eLhrWFoOrjuY1q8H8h6kFlSNUemSW6HatIOYxFVXEDKZteoo1Yp1jB7EJa7uNJxXKgqS6mcvzmPUw3Qm1AbpnPHLqAf35ysa/v2Y5S3Q1dMgJNc6S4D5of/cAD+Ktvnux4f9Ho9myQYSYEVdeFX81GoTaaSnaF2MkyjESmWmx2sNhDkotwy8jWhOMJj5Zxw5T5YSYyifO32ucZqOV6Q58pFusOVDV5TE21UBzyeX9ZiTtjDKfWKji13tlikeV6qAeRKGeF5V5PWu665iQs6GESP1nq9uAXKePifrEncZeW+zhTsdxgQbUOgA3Vchc3fttlfV1wtz0/7L8wLApBLfc4mmoPfRyXlbiX6i48Bmx3WDcjLp4iw0w054j73EeVxDRst4zwuQO9xeyKyn/Sch9PqrYHTXOhKD6mc3bXayt/9Y0T+IMvHu7p2Kbjgaj/JQhs10d5yLHzvDxJ8hzXNWfojX3aijsRXUtEdxPRESI6TES/FmzfS0R3EdGJ4N89wfZvI6KHiMgiov8w6A/QDVvBl7tV7cyNEtVtr+Didh2ux4vua6oHJVgJ1zR7ZGV/4yKZFve67YWzjX6xU8tdWGQFabmPHY7nw3YZNJULYS5X6dpyv/v5Ndx1ZLnrYzPGYDkMhs6vy3763R2P56UM8/osm25o/Ak0zUGxh3WqndCJ5e4C+E3G2MsAfAeA9xDRywC8F8A3GGM3AvhG8H8A2ALwqwD+bADj3RFC1DsW90A8d80W4PnAYqGO7ZoDQ49OPl11Rlb2t5XP/R8ePou3/tX9XS0et0MsqGqq29OU3QrGIhucjB/CWlYDcZ/K1boudrVermOtbHctpLbngwHIDUTcffgsaZj0wpGlEn72Qw9judjaqGGMoWw2Lqjqmo2K6Q0lH0XQVtwZY8uMsSeCx2UARwFcDeBtAD4W7PYxAD8W7LPGGHsMwNhdwVtVPqRCh3dyESmza24bAHBmo4pi3YauRTeHUWapFmLTvLS4r5ctVG0vzJbrB8ItMzNVxoXt7mcFoeV+GfWd9XyG//avR7FUGG46f7cIQRWW+1S+hrWSHa6TdMJGxYbjtU7qe+zsFn7z008lrj8zWC8yDH5d9dctw4+z0+vzS88s4VsnN/HL/+Pxlt9J3fF4kqOa/Ay6FhiB9vCMwK587kR0PYDXAHgEwBWMMTEHWwFwRZfv9S4iOkREh9bX17t5ac8IX7vtso581MIy3jVXAACc26xhu2ZDVSNx10Yq7k7oHkrHuYuog36OS4SrzU6XduSWuZwWVM9v1fB3953Gl55ZGvVQWiK6MEX1UGpgAJYKncW6Vy0XpsOFdLXUfGb89SOruOOJxYQlLRLwhFumXzXdPZ9BGMq9hO7GeezsFnTNxtMXivhPX2i+rlBMZacKQiNwiOtNHYs7Ec0CuAPArzPGEgVCGL8NdzXfYIzdxhi7hTF2y8LCQjcv7ZnN2ELqdgdfsrAwZ6fK0FUPZzaq2K7ZCX/aSC33uoO8wUU2y+fe73HVLA8Aw8xUBWWz+6QMx+OnSDq66OxGFX9zz8mJbFdYDkTlTJ/XP/pNpcEt013K/Ho5EvRWyU9iv2rMghWzTuGW6Zfl7sRckjsRVcv18NSFAq4+cB4vvOY4PvXYBXzy0fOZ+4rQaRFNJxiFEdiRuBORDi7sn2CMfS7YvEpEB4PnDwJYG8wQ+0dcVDqJmCnUHCjEeHjYVBXnNoW4R68Vj0fhR96qWsg1EXdxgfRV3G0PuuqHcdDdxLr7PgvFPR0S9vknF/EnX3keR5fLfRvruCAu9tPrgxP3Tz56Hm9+/707eo/ILcPPoyjWvTNxj1cKXSs3t9zFc2KmAETnbrig2idXohULqdyJe/K5xSIcj2H3/BZuvO4Y9u9ew+9/4bnMkOqwC5PW6JYBhqsTnUTLEIAPAzjKGHt/7KkvArg1eHwrgC/0f3j9ZbMSt9w7EPc6XzwlAqZyFZzeqIQVIQWj9blbyBvcSjJTbpnaACz3uuNCVb0wg7GbcEi7hRUlLvj7TgzHPTdMhOV+cn1wN64nzm3jxFplR4vn1VDc+XjzhglN9fDMhWJHr+/ccq8njgdEXZiEz71fC6oJy30H18GjZ/ia2575LRABr7jxCfjMw99nVEcNuzCpTdwy4yTuAL4bwDsAvJGIngr+3gLgjwG8mYhOAPiB4P8goiuJ6CKAfw/gfUR0kYjmBzT+rtiu2VAVfuJ00iOyWHNCy3w6X8X5zXpYEVIwWrcMv9FoqtdouduDsdxV1cNUnl+g3fjdhRWlKHyRN+6CWQvE4N7nx37y1zUixnqz4oRC32+WgggOcwfJP+kFVSJgYc8yvnx4KSGSzRCWO4GFv2cWa8F+CZ97yi3TL3GPJ0PtxGJ+7OwWZqerMAKjLmfYOLhwHnc8cbGht0FkuadDIYffta2TaJkHGGPEGHsVY+zVwd+/MsY2GWNvYozdyBj7AcbYVrD/CmPsGsbYPGNsd/B4LIp4b1YtTE8la8S0Ir54Oj1VCRcV4m6ZUZX9dT0fFdPjpYcVv6Gme9Xq/zSwZntQFRe6xm8o3Yi7uNByugnPT6aZr5b4+xw6t51IlJoE4gt5ZzcGk/G5VODvu5PvTrhC1FiUx5X7F1Gqe3jg5Ebb16+XLRAYZqZrTRdUXc9HocrfP2m583NBVTxoqtc3t0xc3Hu9Pn2f4bGzm9g1m/wOrr/qFByP4R8eOpfYXgxrT10alvvEsFkxMZPnfrJOLPftqpWw3AXxH25UZX+jhgA21AzLvTYAy71ue1AUB0TAdL7ek1smF0y94+NaLZvI52pwPIaHT2/2bbzjQNzXe3qjs7IXayWz4wVAxhhWivw7NXdQgqKastwBYP+edeiaiy893T4xab1iI2e4MPQaVkrZN/2tqh0aSFkLqorqQVe9xHM7IT7j6DVa5uQ6Dx7YM7+V2D4zXcXC3hV87KEziTBk8XtrKbeMqnhQhmwEXlbivl1zYBgWDM3tKNZ6u26H/vWZqUjcjdRK+CjK/hbCMgg2VCXLLRP43PsYelWxHKhKMIU2Kl3FuovSA7lgjUCM3/MZNisOrti3DFXxcd/x9lbipUTZdIK63qzjiJl3/cMh/PL/ONTRviXTDesf7aQERcV2oSo+FCVylymKj4W9S/jq4eW28e4bFQuGbiJvmOFMLE18obVmxd0yfPyq4kHV3L6VC7D6YLk/dpaL+u6UuAPcei/UXNzxRFRSuFQXGezJyC9e9ne4RuBlI+6W66Fq+TB0C4budBQKWaxHacSGboWRBKIipGAUZX/F+HXdgaJ4DQuqAwmFtN1w2p7P1bvKUo0sdzMxrq2qDZ/xPpN7dq3j7udX276X5zP85ddP4KPfOoNDZ7f6mvTSb0p1FznDwUze6ljcV0p1PHR6CydW2y/CxjMmdyLuVcsNz+84V+5fQsXy2t5018omdL2OnGFivUmW6nrMP51puSseVMXpn889brn3aHwdOruNvGEnZu6CPfOb2DVbxN/fdyrMPC2ZDnQt+1jDLvt72Yh7vIOSpplt3TKiJZxwy3BXBBezxhjW4Zf9FWVMdc0GKW7iwvZ9FiaU9F3cA8t9Ol9DxfI7fv/I5x64ZYLfY61shtv3717Duc32N42jyyX8+deP4w/uPIKf+OBDeOUffBXv+cQTOLk2fqGUZdOBptrI50sdVyMVPudPPJIdSx1nOdbdZycNWyqm2xC+BwD7dq3D0B186enWSVjrZRM53ULOMOH62Xkk8Yia+A25HvO5q6rdv2iZ0HJnPZf9feTMBnbNbYCo8Tki4AVXncTZzTq+eYwHAxTrToO/XaCplhT3QSDCIHljawvbbcS4EIpn9GNM5csN28T/h51Sv12NFm5UxU0spsWFvt3n7AYeLSMs92Q4pO+zlm3ZxBQ5bbmLqXrOMLFvNw+FvPd465BIEaFw802P4TUvfQTXHTyJrx25iDe//z782qeebBmtMWzKpgtVtTEzVcGZjUrbRC3GGKoW/64++/iFtouky7EM0rqT3PfsRhW/9qknOyqhW7G8MJIsjqIwLOxdwteOrjTtGcAYw0bFhhGIO5AdDhmPqKnaWW4ZH5rqotyhEK+VzJbhn8JyN3S7J3FfLtaxVLAyXTKCK/YtYSpn4aMPngHAZwjxDPY4mmoPVScuG3EXce2GzjNMN9sUDyumOi4BvMbMVL4apvwLdM3paw2XThClEQw98LnHRCA+5e1nDem640NNJblc3K7j3uPreN0f3YXf/fyzTV8rBMYQPvdg/OslIe4WZqYqmM6ZuK+NuIsb9dxMCQf2ruKmFx7BG157F15w9Ul86ZmL+IXbHx1K28FOKNZtaKqD6XwVVcvHRqX171G1PTAAC3uXUbE83NnGYl6Ju2VSC6oPntrEF55awvkO3GdVy21oMCE4uH8RddvHl5/LXlitWC5slyFnWOGCeVYi03rZgq55MHQPtYxoGUXhxkMnlvtqycT3/und+HgqWiVOeM7pVteVSH2f4dOPcV/6nrnmi/yKwnD1FafxwMlNnFyrhL93FprmDLWm+2Uj7sINY+h8kbRYa30ChU05Yv716686hTe85psN+2qaPfCyor/40Ufxe//8XPh/XhuaQVO5zz1urYfVG4Nx9QPGGEzbD607kcj0/q8dx60feRQbFRv/8uxSU0tKXGi65kAhP3SThW4ZwwQRsHf3Ch44ud4ytlrcmIWLB+C/603XH8HNNz2KI8sl/N+ffXosyhmUTBua5mJmirtk2vndhUtmYc8a5qYr+PhDZ1vuz5su88/ZLGKqE7EsW04iDDLOnl2bmMnX8Rv/9DTe8eGHcc/za4nvVrhb2lnu62ULOd0KBDwZ564qPoh4tE4n4/30YxdgOj6eulBouo/jReLezSLtsZUSfurvHsSff/049u3awNxs60jua644B0Xx8fGHzmbWchcMu/fDZSfuumbB0GzUHb9la7p0r1SA+9jSq+BAVPa33y3CBKfXK/jmseRi43bNQU73QMR9lfHPIlK780YdNdvvS9lf0+FlWYXlrms8KuD51TKuO3gar7zxSZRND082udhEtIWi+ImogbUyj14SneL37tpAzfbx/Epz//lGxebd5TPEaGHvGm58wVHc+cwyPnhvYwbhsCmbLrfcg2ir02387pUgP0FTHVxz5WkcXirjmYvNBWy5WA86J2WJe9CXtANhK5sOtAy3DAAoxPC6V92DG687isfOLeEXbn8Mf/a158PnxWwkZ5ihuGe5xtbLFnS93uBGNB0Pqhr0R1Bd1NqEdHo+wycf5Rb70eXmGbRWbJ2nbvstDYbVkolPPXoe7/r4IbzlL+/Hs0vrePmLn8RrX/4gFGptJOQMG1fuW8RnHr+ArWpzn7uuOUPt/XD5ibvuhOGNrRKZtmuNPvdmiMy1zUpv/u1/ePgczm02t+hE9/aL22aY5VioR9mzPM49OnGF7zWf4xdYP1xG4mIUC6pEwMtf/ARuefmDeOkNz2Fh7wqIGO5pkmUqLjSVvCB0lI99rRRN5QFgfpZfrEeWm1tLGxULOcPJXOQCgBdefRJX7l/En3zlGL7VQQLOoOC1vT1omoOpXA2q4re13MM4ac3FVQsXoaley4XVxUIN08GsIB0xVQ0t9/bncNVym1ruAGDoDm649gS+57Vfw+75Tdx9LPqd45a7qvjI6W5mItNquQ5DN6GqboPPXdzcNdWF47HQGGCM4YtPLyVuBvedWMdS0cLMVBmnN6pN1xQiV2BQbbLJdXD7t87g9X/0Dbz3c8/igVPncO3BU/iu13wd11xxoek5lua6g2dQt33UHb+pWyYs+zuk6K7LStxzuguFWCiKrSJmirHomnYI/7Noot0NF7dr+L1/fg63ZdSpALiV8tnHL4RjFhZtoWZDC+rKK4qXyFCNW+5AfyJmhBWYzGBcxr7dXDx1zcXuuS1881h2KKMdlh/wocaaBa+WTeh69L1N56vQVA9HlpqL+2bFhq41z47lN56neALOM913BuqUjYqF//6155vOjOqOB5/x2t5EwMxUDac7dMtoqgNNc7FrbhNHlrKtU8YYVotW6PJJN6QQ7rlObu6ixV47FIVh99wWTqxVQktYLJSKm3TOMLMXVMv8Rq4oDiqxpCLT9UKjQQ2MKfE9PH2xiF/95JP4jX+KasD/4yPnkTdsvPDqk/B8NI1CEoXqwgitJtfBs4tF5HQb3/Xqu/GG134N3/bCwzD07q6ZXXMF7A5KgzeNlhlyCYLLR9xrUUKSEVruzYW7ULdBQUXIdoiLq5e2diJJ4qFT2RbmAyc3sFa2ccO1xwHwMECAV4QUJ4uqeHC8KFpFWDn5XP/EXUz5s2KhBfv3rOLociVzSm7FxF3X7HBmtFqqJyx3Il4vvpmgAcBGxYSut54laaqHnGF23HWrFz724Fn8f988ieea3IjKoRUeFOPKlXGqTQGx8DVqlIHcbBGuVOcJTFO5GhTF79kt4/sMddtPZKe2Ym6mBMdjoaiuly1QzGjS9RpWy8lzwHQ8VCwfOd2CprpheQxAZD4nq1IKA+VMkNX71cOr+Nt7T2GlaOIbR1dxcOEc5me5mDZz4dmiTnxwfjXzd1ctFznDxtxMuWNLPYtrr+QGWiufOyDFve9sV21oKj/hQsu9lbjXHOSCipDtMHQrrPeePuZ7PvFEyxnCo2e4uJ/eqIWLi3E+c+gCDN3BdVeehaG7OLIcWe56TNyBKOpAXNTCLdNXy72JXxYA9u/hU/V7MqJd7IS486gBxhjWyzZyevJzz80UcWS52NQ3uRGn628AACAASURBVF42w/KwrdA0M1EJtJ8wxvCFp7i7bLlJlyUhJmKaPjNVwfnNWsuQ0dDn3kED9uUgEzSfq0NTGteQOl1QFe6bTgwZAJifCVxnwU1to2IhH3OT5QwzEcUj9gG40KqpEgOm60NRks1CysH3cG6zBoDhin1L+NOvPI/fvuMZ+IwvYs5MVaAQw7Fm4h4uqLa+DiqWC0XZ+Xly5f5F3PiCIziwN3v2miXu7/jwI/jPd/bWVLwdl424b1QiQRCWezzR4uMPnsUnHonCquI+7XYQAVNTlQZxv+/EOv7l2WU8fm676WsfOb0Z1mR/5HQynrZYc/DVwyu4cv8FKIqP2ekCjgQLSPFkCbHIKSw34c/sxi1zcbuGl/7eV/DcYrbFXAubOTS33OemS5jKWZl+99ByJx+axjN6S3XuXxWLcOH7zBRRsfzMwmSMMWxVnUSkTDMM3cJGdTAx788tlnB+i7/3UjH7GKWU5T49VYHrt66D32i5N1+EEzHuecOEqvoN4Z+h5d5O3MMuTJ2J+/RUFarih7PI9bIVCijAxX2jYif6hQq/fE43ueWeqgpJlPzcYkznNmuYzll4xY1PYm6mjHuPr2Pf7nVMT9WgKAyz0xU8v5I9c0q7ZZrVlymbzSOFukFRGG645mSoL2nEeSBu1owxPH5uG4NaX71sxH2rGlm64t94w46/vfck/vruE+H/C1W7aTJCFtP5SsOUW0wXmzUG2ahYOL1Rw7VXnoWueg1Fs774zBIcj+HqAxcAALPTRTy/UoLt+qhYfoPlLi7ueg9umSNLJdQdr6kVFFnuzcWdCNi7awX3HV9v8EPbsZK/uuagavmh5Rl3ywBc3IHsRdWS6cL10ZHlbuh2RwXieuFLzyzxRi6K39RyF4vfop+mqE/UqoBYWty1FotwIjs1nwsiUJo0bGkXBpgu99sOhRhmp8vh77NWNhNrIDmDV/6Mz4zDRVfD4mONhULyshbJNR0xgzm7WUU+X4Gmerj5pkcwP1vADdccD187PVVsGjFjhXHurX3dFcvt+LPvhLTlvlqyULM9vGhhZiDHuyzEnTGGQs0Jf2RFYdA1L/T7Fmo2losWlgpW6BpJd1xqx3S+gqWCmVi5F0LZzP1zKPC37921gV3zGwm/O2MMn3r0HOZnyqHYzc+UYDosDI3Tw8/DLwwRYZBeUO0ktnYxEKhmNyIhHO0snP171lCxPDxxPhm+Z3u8Kh5RdJKfXOMil7bcZ6fLAFjmomo4vW9iHcUxdBuluteXUNA4vs/wxacXsW/3GqbyZqIEQJwGyz3fPta9bLrQNS90cYQdfDIEerlYB4HBMCye69AkWqZdHfl0i71OmJ0u4PASd52tlc3Qrw0A+eBxfFFV1JURce6WG60RmY4bc8sIcef/P7tRwVRQ12V6qobvvPk+7N0VGUFzMyWslLJrO9muH7oBgeb1ZarDEnc1eZMR5/+LFmYHcryJFffnFouhD7JsCWsvEgRDt0Mhi4vIk4EobdesjsIgBTNTVfgMiWxAYVE0sx4fPbMNVfGxa7aAvfMbCb/7w6e3cHipjGuuOB1e6HMzfJwPneInd4NbJogPrgUV/lSVh5h1YrkLV8Fmk7HW7fZuGQDYt3sdSkZIpOX4YWavGPfx1UDcUz53TfUwO10Lp/1xhA+9E8tdLLp2UiQOAD7wzRN4x4cfabvfkxe2sVy0cOX+RRh6FYuF7CgpIarCj8yziX2sNLkZANxijQtNq8bKy0UTUzkbCjEoitPgcxeWe3u3THeWO8DPxUKNhzym3WTi94xnqcbDJcWiqVgTEElM8TFUTBdl08F2zc0s2iXghgBwPKPImuP5UBUGRfGgtLgO2oWB9gtV9RK9H8SC9IsOSHHvmKVCHT/6gQfwofv56vV2GOMeCZemWuFFfzgQdyIWijuvCNmF5Z7KQCyZDpaDOtvNxJ0XJdqCorDQGhF+97+99yTyho2rApcMAMxMl0HE8NBpIe4pt0xsQVXXRF9Kt6Oyv20t9w4WVPmYXMzPFsLvUWB7USyzGLco9JV2ywDcMnxuqTF5ZzO2MNcOo4OQ1zgPndrE/Sc2Mm8qce58mpcnPrB3BflcPWyWkaYci1kHuNsqZ9gte4yKpCeBeJwlTMuFOgyDH1tRvIY6NPUuLffuxJ0bLo+c2YTjscTNNiuRiWenOlCUKAJNzDDrTpT5LD5vxXKCxVS0FHdh8GS5E23Xh0J+0HPBy/S5M8ZQs5vHpveTdO+HU+sVGJqPA3O5gRxvIsX9nufX4TPgrqN81VpYo4YWnYC6ZoVp7IeXipjOWZifLeLJ81uwXR81228o7dsKcQKKcMjjsZMtSzDLpoOjy2XsDupWzM0WQ7/74aUi7ju+gWuvPBVm7gG8sNLsVDVcoDWE5Z4h7mKbrnVWjlg0Qm7mQori3Ntn4WqaHUY7CPgUmQVjiix3TfUyraa5mSKWCo1V9DaC77KzBdXuxP1iINL//ORi0308n+HOZxaxb88KNM1F3qhjo+Jkun5KdYeH08bWKQy93rKwGS80Fn1mvUVs9GKxhlwg7un6QgBQC3If2op7RhemdghRFUXe4jfoXOiWibbxxDMrcRzhNrIcL5zVifOrYnkdiXveqMPQ3MxF1eQ5l30diFyEViG+/STe++HkWgVz01XQTuIvW9BJg+xriehuIjpCRIeJ6NeC7XuJ6C4iOhH8uyfYTkT0V0R0koieIaL/aSAjb8HdgUvgmQtFbFXtTMtd1x1sB+L+7GIBM9Pb2DW7hacvFmKlCjq33A3dQU53wiQVYUnMTJWxkRFr/cT5AnyG0GJXiIV+97+79xR01cO1B882vG52uhAuFInxKakF1XjddVW1EnHSF7Zq+Pf/9FTDFH4xEPdmWbY12wWBQaH2/ut0ejnAF7eU2A0H4DfCvGFnhpuGFlnKit4IrN5OfhthTXYi7owxLAXRJ59/8mIi0iPOI2c2sVlxcHA/vwHkc3X4DFjNsMbLpgtDS4bTGka9aacigNeiSYp7MsIiPt6VohmGu/Ksz7TlHrgl24i7eF03lruuuZjJm7j/BF8nilvuiuIjpzsJn/ta2YIWLLqKMgdiUdVyWSLzWdd4q71zW4GvvYW4EwEz06WG8wTgbhlxzqmqnTmD7WW9YSdosZvMybUSZqe7z43plE4sdxfAbzLGXgbgOwC8h4heBuC9AL7BGLsRwDeC/wPA/wLgxuDvXQD+tu+jboHlenjgxDrmZ7fBANx/Yj2y3OPirvFKcXXbw5mNGuZni9g9tw3TYXjkTNLt0SlT+QrOBpEQz6+UYWgu5maK2MoQzMfObIGIYddcFCYp/O5femYZV19xJtPnPzsTncTiZiWsnXicu6JE/t54stZXD6/gc08uJgou1W0P20EhtWbVMmu2B031O4r7V9VGF4GYIgPRAqPrs0R2apz5JhEzm9Voet+OyHJvb+VvVm04Hs++XCvbePhMdiVAsT6zdxcXNRGRtJQRMVMynYasz5xutXHLOEm3TLigmjwXinUHpsPCRfN0fSHb9SEmE2WrtVXai1sGAGamt6MQx9SiOM9SjT7nWixZTZyvVduF5zM4HgtFmI/DQ9VycW6jhrxhQ9Naj392uoRjK6WGcFHLi51zanbZ327DQHeKqvLeD2XTwVrZwdz0YPrqAp01yF5mjD0RPC4DOArgagBvA/CxYLePAfix4PHbAHyccR4GsJuIDvZ95E04dHYbdcfHi645jpzu4J7n10PLPe6WMXQejvfcUhE+426A3XPc3y0K73ezoAokwyGPLhcxM13i4XgZro5HzmxifraYmA5GUQAML7gquxyB8HUSWHhCpt0yPCkjipOOW+6n1rmlIFbqAYQLgpoaZY6mqdte24tMoKbKIQBpyz36Xg0920Vh6Bbyht0QMbNZsTuKlOHHCWr+dGC5C3G+9uAZ6KrX1DXDrS4WfoapwHLOEve0/xzgolc2vaZF68qpphmaymdMaZdCPAwSaKwvFNUC4mGHrYpVVS3e5F1pEeaaxVzM0EgvcOt6PWy3J+q9i4XWKJbdTTTHFmgq78Z0bquKfK59g5PZ6RIqlt8QteS4PihmUGRl+kaLycPJGtU1XtP9dHAdzs+MUNzjENH1AF4D4BEAVzDGROGOFQBXBI+vBnAh9rKLwbb0e72LiA4R0aH19db1u7vh7mNrUBQfe3dvYO/uFdz9/Co2KlZQ0yQ6gcSF/0AwrZyfKSKfqyNv2KEfsVvLfXqqgrWyg5rt4thKCbOBuFctPxEiabkenrpQwJ65ZMmBudkicrqFqw6cC6fbaeaDC8qIZc8q6QzVWMRFuuyvWMSMi7tIFto1W2waOsj9+J1ZN6raGJZnuR6IRGVIBl0VPVWzrVg+3ebhdnE2KtH0vh2KwmDobkduGSHOs1MVLOxbxL88u5QpwKW6A0OPQhWF5ZwVDlkynYZciXxg4a43sd6rlpewIokAXfcyxF1kp5rBZ03eUMUaSc4w4bPWLfgqpgtd9TqalcURhoZCfoMhNDNVwbGVMpYKdVQsHvpoNPjco5ucErs21UDcz2xUWrpkwnFM82siXYbA9nxQzKDIivcftltG9H4QkTIjtdwFRDQL4A4Av84YS5hTjJsFXeVZMcZuY4zdwhi7ZWFhoZuXtuSbx1axZ34Dmuph/541FGou7j2+jpyerCIorL9vndyAobnI5+ogAuZnN6Nyv10WDxJJKg+f3kTF8jE7XQpvEHHXyMXtOhyPJSwfgPvdv+s1d+OlNzRvemHo3C0RH1tjhqobW1B1EmV/hbifiLWkE5EyolZHVmODWqz+RztUhV/Mcb+17fqhuAPRd5uezseZmyklClQBPGGmkzBIgaHbHVrukSV81cJFVC0f3zjamGmbbqOmadyvnpXIVKzZDdN90awkq9SE57PMqoJ6Ru/N0HKPuWWy6guJ7zddXyZ+c6lYnc/K4ojzN6tC5/VXnYLPPLz/rudj2alJca9ZLkxRLTRmuSuKg42KhdWSHca4t2J2hp/L6YgZO2W5Z/VcqJi9uaR6RQ/GcXKNl06YnerMUOmFjsSdiHRwYf8EY+xzweZV4W4J/hVXwiKAa2MvvybYNnAubNVweqOGhT08Smb/7jUADMdXK9C11LQxEN0nLxQwO7MdnpxxH3jXlnuQpPLlZ1cA8JNfCFFcYFZTU+o4hm639CcTAbvnN5A3Isub+xVZWPI13g4vngSzXbUD3zrD8dXoxrK4Xecn2owoStb4ueu224W4J282AK/8F+9gJb7bZpY7wC1Dx2OJWcZm1W75mjS6ZmKrg/oyS4U61KCo2d5dG5jKWfj8kxcb9ivWeU/UOPmcmVmCgPvc026ZxkgSQSUVOinQMhqwLxdMEEWlG9I3+LC+UPB8ORbrfny1jG//r1/H/Sf4DLVquVCV7t0SU7la0Fmp8bNP5eu49uBp3PH4Ih4Iyi6LsUaJSm44w1Nj54amuqHx0YnlrmsOdNVrmA3Zng8lMChEz4V05cxeFpN3gsg4fnaxGJZQGBSdRMsQgA8DOMoYe3/sqS8CuDV4fCuAL8S2/3wQNfMdAIox981AEYkzooCVoTuxMpxpnyC/QD2fhYt3ALA7EHci1vUPLhoyiBBM4ZYBkuGQwupqZbW24hUvfgI333Qo/D/vYBNVBazbkQsqnvIspoJ75rewXnbCRbrFQh1TOTO0rLLEvWJ3nuihqkmBAQDb8RI+XeGuSCcwxdk1w3+7Zy/y38d2fVRMr2OfO8B/941K++95qVjHdJ7P3oiA/XuWMmvBFzLE3TCqmbHuPK09Je4iwScjHFKEj+qp12T13lwpmYlIo3QJirhbBkiWIBDhup97YjEcp9qDz5kI2Ld7FXMz2bWTbrjmBHTNxZ98hTf2EIaOGGst7pZJ+Nx52z4guqbaoaoeTDflCoyFWGqx6yDOKNwyAPDk+W1M51vnU+yUTiz37wbwDgBvJKKngr+3APhjAG8mohMAfiD4PwD8K4DTAE4C+HsA7+7/sLO5+9gaZqZqoXsE4CcfgIYSsfE67XMxcZ+fLYCINYSwdYKmepjKWSjUHEznTOhalAgVX1RdKUUFn3pB0xprbwtx94OpfZgUkiHuB/bye+2pwCK+uF1DLlcNb3hZcfk1y0WrujJx0tE7AGB5XiKMUpzkrW5w01NV6JqLp4NyC1GrxG7cMlbbfrkA/w4MIzpvcoaZ2a2rUItKLQvyRr1hQdXzeaNrPfU7GTrPKM2KmCk3iTfn4XPJY66VTBh6dMzGyqDCLcOPE3fLiFnk144sw3S8oMVebwuKN990CC9/8TOZz+magxdecywUUDEWReE1eaq2G5bMSCyoxmY70/nOfNKq4jc0K7Hd6JzTm0QdhQuqHdSy7wdiHBXLC0uFDwqt3Q6MsQcANJO5N2XszwC8Z4fj6hrT8fCtUxu4YmElsX1hzxpOXfi2Bmsv7nIR3X8ALtDzM2V4ntrTOKbyZdStHKan+XtmJdKsFE0YuotOEoI6hdcW8UPrRcu03Hk1v/171vD8WeDEWgWvuW4PLm7XkM/XwmiiLB91zXah6p373PlrYuLu+FD02NQ7FPfmwksEzM1s46kL3DKM6sp053NfqrnwfQZFaX63XizUkZ+uJ14H8NLPV+6KzoVi3cH0bFIg8rk6Lq7yyI+8zvetNInCIALyTbJUK02ERtccFCvJ91kt1RPukGZumdDnHksqE+di1fJx/4kNVPpUFTGL6w6exYWVF6Fu5RPXnKZ6qFleWDJDTVnuAM/m7NQ1qihug+Vux0Ihm5Vx4Dc91rHhslPis75Bi/vEZKieWK3Achn2zCfjk+dnC9i3ey2MSxaoqs+zIxW/4Uu+4ZpjuP7q4+gF4XcXK/hZXZ/4lLq/CykizlnE7UY+9yjD8eRqGTNT1bBk66m1CmzXx3rZxlSuHnafybTcHa9zy11JWo9AcKHF/KpTuTo0rX1Z5V2zBRxbKcN0vJ7EXddt+Kx5uVeAR/JsVpzEGkhYOTQ24xJt89KRISJiJR4xE9aVyQin1Y16ZqeidC0agZZR9netbCVmPQ2JbFZzt8xmxYamejB0B//yzNJAqyIqio+Xv/gJvOjaY4mZsIhlz3LLiHN3Kl/tePasKG5DhJYoHAbE8wWSn7NiedC1zvI3+kH83JmZHrHlfqlwNuhBmhZqIuCWlz+c+RpDd2Do9YYf9sC+lcz9O0H4CMXipAjHiwvmUqEGo0nyTq8oiou6E4UgZvncT6yVMZUvQSGGmakqTqyWsVLkoXL5oJuPrnmZlrtp+5jvcKYRFTJLJtXkY26ZF1x1CgcXLra9qHbNFeAt8g5UUdGwLjKHY7OR3dNG5j6ikNdUG3E3HR+OxxoEOwyHLNTxwv28fKsIP80STSMWAx4nXe43GosDx2MwHR9ThgrH87Fdc7F3X3STS8+WGqJlrLhbxkLOsLF7bg1fO5IDY8DCzODcEnt3bSYqOQJRRq2wtuNlNsTnn+ogxl2gKF5DuKft+TCMwHJvUqOHV4QcjtUOpMR9qgxgemDHmhjLXSwSdeqjA4CrrziNaw9mJwv1yu65bSjkhQuzAPfvb6Ys91yTOPZeURRuBVVjyStAdDKtly0sFkzMBtbC9FQJx9fKYT0VIWyG3pjI5PssaGLcnVumnsiYZAnLXVO9jn6r+Vn+PT5zsRj6zlstwqbppL6MCAWNW+5iFhNvoi6EodFyD7JUMyz3rES4ZlmqQtzTr0nXAY96lja6ZcwwHDbllklZ7rpm4cr9S6iFTZ2H43MWKIoTLKhGdf4Fobh3uJgqXp8Wd575mrLc0wuqduOi9yARv2XesBvWY/rN5Ij7Zg1TOasrP/YN15zEVQv9jdLcM7+FN77+ywnh0jQztNwdz8dWxel5MbUZoipgmJkYXCCKwqsxPn2B17IRM5uZqTIWt80wY1UIlK5ZDUJouh4YOi+ulBkt4/k9+TXzBo8KefpiARsVOyhl3Pn7hKGoLcIh4zHugizLvam4xyx3QWSFZ4i7YaJQcxOJbUDzyI30YuBaqfEmlw4/rdteWLRMVfxEKORm1YSumdi7awM5XZSNHq64q6qDsumE483yuXcSBhm+X0bhtHjJi2b9S6uWC2WI4q6qPBt4emqwkTLABIn7mY0KpvKtmw8Pi/gUE+CROiIcb61sgQED8bnXbTcU1LgQG7qLJ85zC5hPBXkdbAbg/iAbdyoUd7OheFhUEbLLOPfgdZ7P4PkIE0q6gS+qbuGpC9tBZcHsQmPNCCOAWvTLXcqw3PXYgqqg1MSPrqo+8oaTsNyjfRu/M2FNr6e+57LZWEUyfjwhTGthPZe4Wyb5nVdtN6wFpGtuwue+UbHCfIqFvdy4Gbblrirc525l+NzzOd43NR6i3Mn7tbLcRUGy9NpL2ewtxr9XiHh+wPxMYznrfjM54r5Z6SibbRQYWlRfRjQO7rdbRlU81OILqjEXiqba4cUtwkSFBf/gqU1MGXbUSEO3G0IHo0STbi13fkw7zELsrSPS/GwBZ9ZrOL9Zg65197114pZZKvCyE/HxqQpfcI+vlYhIC11tfK+cUevCcuffbzrWvZLqwiQI/cU1Ie6NeRLpaJm67YU3eE11w1kBYwzbVSec0Vy5f4nv02UdpZ2iCZ97huU+P1vC9337VzE/27l1q6jJej2MsYS4A9mZvhWzMYt40LzulQ/gxdc9P/DjTIS4l00H21UXM2Mq7rpuo1Djqc/ptPF+IU7uyC0TjxvmF/J03gy3z0xVQcRQsVzkctH3Zmh2wloFerHchc+dX1jx/qm9sGuuAAaeTdys0FjzsfjQVa+lW2axUA/roscxdDfRxamZWwbg4h7vyBT53Jtb7mm/e9l0w36rcRos95IFINkgIyuJSfwOqmqjEown3ZVs764NvOolh3Bgb+9BBL2gqi6qFg8C4EXLkpmaOaO77HBuuUdCLppjx2eLmmo3tNqrDKkLU5yc0Z37uFcmQtzDov5dLMAME0Pn5WQrlhtGZvSandoMcXJHbpm45R5UMIxlxCmKj5kp4Y6IREnXbVguS4QxRhUGOzshubXEQh+oSFTppBZ8FruCmjeez7qKlBHwRtnNwycvblcT34FA16xEZqgQ1ywrN5+rh8W8AB5ypyrJ8E9BsyzVcpNM0XTDjrWyhbzhJgRRSfnckzX9o6JZ4iYnkvqIgIMLS0ONGOFjclGzfZiOD63HGV3i/RQPVkzcbU8YFLHZmGo3VIas2t7QLfdhMRHifiaMlBls3GiviGzY7aqDlaIZ1DDp7zRYnNxZQiyONTuVXJOYznOf5lRM2LLcGN10YQKicgjidZbbeKF1g6HbmMmLaJ7OY9wFum41LR4mZlNZdX5U1UpkFrey3POGiYrlhxZ72XSaRkMYhg1CY5ZqxXShZrh80guq62WzYQajKLyRSjyJKarp76JkJmvb9/I99hNN5YXO+GfeubgrqcJpjjjnYgaFoVtYTxVsS1fhnCQmQtzPbXYfBjlMwo5ANRsrJRNTObPvSRPi5M5qmSbS5dNJEzNBc+FECKDWWF+mW7cMEIh7IDRZVlS3zM7wWvs9iXvGIrGgUAuaXmQVcdOSFn+x7jQtSyFeL9xuJdNtegNXiCFvOGHUS/j+pp3poxeLgeLmslIyoeuN49VUP3TLVCwntOY11Q1vOr3kCgwC4TLarNp9yQ4V7yFmiVnnXM6wEueB7fK8hWG7ZYbFRIj7mY3uwyCHia5HVtNyMWpq3E/EZ+cXSzLjTojMTMpynw0WVadSbhk+1ri4d+eW4eOJMgYtZ+fiLlwzvVnudmarQyCKcZ/KEHe+VhJ9D6V6Y2clgSh/+9CpzXDfVvVaDMNsKPtbblEGIL4YyLsaNbr11Ji4x90ymuagYkXnBzB6cRfW8lbV6nktJk46cc5uYrlXrKheUNSoQ4r72HJ2s4J8bjzCILMwwhIEDpaL2RfmThHCK1LL40zl61DICxOYBPv3rOKaK84mSjYYGaGD9R4sdx6ambKiqPeLeE+Q4Tg91f2N0dBtbFedzG5EYRhkxg1X12yUTS+sS1+sOw1FwwSz02XMz5Twmcd5nxreqKO5gOp6Yy9VHi2T/R3zxUAHvs+wWXWyxT0WDli1XGgxy70adGMKi69po3XLiHNps2p3XEq6Fek1h0zLPTAMRBJYr+0FLxUmQtxPb1TGdjEViARzs2JhrWT1PVIGiMR9q9oo7gcXLuINr/1Gg7Vm6A5e/uJnEo0aorFmuGW6sLAUxY3cMjv0uQPA7rkCvue1X09k/naKoVlwPBZmbcbJinEX6LqTqEtTqNvQ1OaieHDhPJ5bLOHEahmleraLRcB7jKZCIS2vqbXPFwMdbNVseH4kVHFECQqARyqFlrvqwme8fMJGxYKuen3xc++EcKZZscNuSTt6v7AqZjJCKx4tIzpBbQTndtVudGFOEpe8uIswyG6y2YaNqrpQyMfJtQpcv/+RMvwY/OTeqFoNJ6tCLOz12Q5N5Yk0CcvdaUyMagdPL09Fy+wwKqLXNZVwkTgjHHIpWODOclOEC+E1UYrAbhkPfnBhEUQMdzyxiFKqF2qanG5iu+qGHbIsl6+ZZIVCAkEv3JoVZadmnEOiBAXAZ1tqGOceLfJuVTvvQTtI4g071B3M6AQiR8FsYVCIG6Jo6jHsLkzD5pIX9zAMcozFnQjIGS6OLHO/bJaVuFOUmOWu7CDjjgjI6Q62qtF7VC0XCrGuMkxVxUPNSiYx7cQtsxOibliN1q5oVJK1SJouQVAynYZGGnFyhoX9u1dxxxMXgpj11vsyRD7wcCG8yc1D17hbJkpgyrbca7YLz2ewXBbFuQc3mbLl8royXeYKDIK4AdIPn7uSqq3jZLhlRItD6Za5RIiqQY6vuAM8ZvrEKvd5D9LnXqg5O/ZhpuPCa0G2YzcRPqrqoeakxL0P8cy9kLVILFgtmU0XuKMSBIG415tHwAiuOnAB62UbtttYPTKOOAeEayYsGtbCVMWRFAAAGKZJREFUci+Zbqz0QLbPvWa7DTOt0Eo2XWxUzIauZKNAi52j/QiESNfWyVpQzQW/50bwHabLY08al7y4C8t9XEsPCDTNDBd5BulzB3Z+smqamRBCPsXvTpjjC6o7jXPfKeE6Qoa4r5XqTSNwhJBvVx1YrgfLZW3FfWHvKgytvUUYZqmWOrMiNY2HbC5uB+UrMqxvVfVQs6MZU1gZVBXdf1xsVq2Rx7gDSUHvS7RMyuduZVjuiuLD0Nywps+wuzANm0te3M9sVDGVs4aeYdctQmB4U+P+X1xKvNzADi8WXbMTfUd5o47uLgCegdi/BdWdYLToDbtZtZuKXTxyqFV2ahxV8XHF/ott902XIGhWlEwgbion1yswtOzEHxEtk046C90yphPUlRm9zz1ugPQjzj0dLeM0cQXmDEu6ZS4Vzm5UkO+iqP+oEP7bfJdVDTuln5Y7r+keiUzddqF0+Z68M1TKiuqx/MBOEWVv0x2meOcqPzPyBAgWl8FQqDlhHfBO2r5dfcU5AAzTGSUNBOKYop9uu8U9IfonVytNjQNFdONKRYGI91wqmIm6MqNE67O4h5Z7Ovw2VbNG0+rhDXXYzbGHTVtxJ6KPENEaET0X23YzET1ERM8S0Z1ENB9sN4jo9mD700T0fQMcO4AgDHJMyw7EERdUVoGqfpAU951a7hZKdTdM5eZFqLpbpFWD9HLX8zPLug4TvqDthCFwgnZt+4hE8bDOLXcA2DVbxPe/7qvYPb/VdB9FYZifKePh07z9Y6sqkkBkuZ/eqEBv0sVLVV2Yjt9QxVO8p8jkHge3DFEU4dLPJCbR2SkrFBIIGqUE+QVVK6j/Q435D5NAJ5b7RwH8cGrbhwC8lzH2SgCfB/Bbwfb/EwCC7W8G8N+JaGCzg4rlYqvqjnWMu0BcUMYA/O1AUtC7daGkMYK+o0LQ4qnsHY8nNk3uR/mBnWLo9YaMUCH2Rgs3maHzKpmt6so0e127Gdr+Pcs4dHYb21W7aXNsgTiu47GmMw1V8WC7LGzMkbbcz23xm4I+BuIO8JIKQO+loOOke8hG0TLJ89YwojpDFcsNxzCJtBVexth9ANImyEsA3Bc8vgvAjwePXwbgm8Hr1gAUANzSl5FmELXWG39xj9wygwlD66flni4eFk9l73w8QdlfO6rWNyq3DMDFfaWYvLGKqIlWlqyqWgnLvZ8F3w7sXYHPgLufX4s1x26WoRodt1m0VZjIFty0xHmgKAyq4ofBB+PglgFi3cL6GC2TTmJKW+U53UI1KEFQHWBj8HGgV6v6MIC3BY9/EsC1weOnAfwoEWlE9EIAr409l4CI3kVEh4jo0Pr6ek+DODCXw7/5TgW7eshaHDbighqUuBP5IPATeacnbDp0sGZ7XS/Sxlvt2R4vfTusDvNZ5Awz9G8Lwl6kLcRdD4qHhY06+iju87MF5A0Ldx1Z5eV+m5QITh+3mc9dfOfid4uHG+qai4vbQtzHw3IP4/D74JYRbh6xoGo16SEgZmnrZSuo5T7cJiXDpFdx/0UA7yaixwHMARCmwEcAXARwCMBfAHgQQOYvxxi7jTF2C2PsloWFhZ4GcWA+jze9Qu04+3KUiPDHQYVsijK7wM4vFlF3RIhfLZbt2CnxzkC260NVRuvXzBsmymayW09YRKuFW0YPGoYX66194r1AxF0z9xxfw1bFbukiiC/kGm0sd1EkLdGwRXXDBhbjYrmLZLt+rcWoih9LYuKfNT1bFCGk6xUu7jtJ+Bt3tF5exBg7BuAHAYCIXgLgrcF2F8BviP2I6EEAx3c+zEufmekqXveKB1ousu0UVfXheOqOV/+n8jXomovf+8Kz2D+bg+l42N2lH18kUtVsD5brjdQlA0RtDVdLJl6wbwYAt950zWvp8zU0G8s1J8hO9RqiL3bKgX0ruLh6Pb55bK3ljUNRGDTVg+upmTHuQMxyF26ZRKKQaBHY+vMOk7CZSL/EXfVblh8AolnLRtlqWYVzEujJcieiA8G/CoD3Afhg8P9pIpoJHr8ZgMsYO9KnsV7y7Nm1NVDXhLhIdnrC6pqLb3/F/bC8An76todgOqxry12LLXBxy33E4h5YuyuxJtYbFaulSwaIOlOtlkzoev+FYO+uDWiqx0s1t5kViIqRrUIhgWhGklhkV8UsZTysdiByH/ZN3GNVMW2Pt+9LX2+5WPGwiuX2dSY2bnQSCvlJAA8BuImILhLROwG8nYiOAzgGYAnA7cHuBwA8QURHAfw2gHcMZtiSLMLmDH24WOZmynj9q+7Fwt5l/p5dXgTxJtm229yXPCyEW2w11v1oo2JlNr2II3zd57dq0FqU8O0VVfGxb/cqf9zm/cVv0G5BdbNiNdT0F0LabYPxQRIuqPbp3IgXTnM8lhniaMSKh036gmpbtwxj7O1NnvrLjH3PArhph2OS9IiiJEPgdoqmubj5psewvn0F9nTpToqaZHuwXH9kMe6CsJZLzHJfK5ttFxeFr/vMRhXaADKLAWBh7wpWN69qKzSaZkFVppvuF2/YkvbfR+I+HoupQHym2Z9zQ4k1yW42W1QUBkN3sVGxULU8zMxfxqGQkkuHSNz7d8ISAQf2rnYdJSLC24RbhkZUEVKgqS401UtEzGxU2tdZEYuP5RZt83bKwp5VEFhbcdc1GzmjeYvGeMOWtKtDJF+NS6QMEN1w+nXjJ3JjTdmbzxZzuoXVkom641/elrvk0kFcJDtNYuoHQlxEKOSoxZ0IyBtWWIXR8XyU6h4W9ndmuQOdZaf2gqE7+LYbnsXcdKnlfjdccxy2azR9Pj5bmjeS54AQsXGJlAEGsaAa+dwdz2+6+K1pdZwPErom2ecuxX2CiNLNRz/V1GKhkKbjjdwtAwC6XgsXVEWnqXZF3OLiPijLHQCuO3i27T675ootn09WWnRSzwlxn1zLnVcijcpMN+sfkDOssFT4JEfLSHGfIMIqgGNwwhL5IGKo2e5YhEICPNZ9pcQttnZ1ZQSGHonkIMW9H8RFMl3TX5T9HSfLfWHPKurmdN8S+1TFS4RCNnPLGLoZZrJOsltG+twnCEXhFvIoM0EFIqmqbvPCYaOOlgF4rPtqyQZjLKzp3U7cFcWPml50UBFylLSqDCrK/o5LXRmANzv/thsO9+18VZSkW6ZZ57D4bE2Ku+SSYH6miF2zhVEPI0RTPNQdF5Y3+lBIgEfMOB4v4SvqyrSLcwci671V27xxQFFYOENK+7Gn81UQfMxcAnWYekVVvLDsQKt1nvgNfZLFXbplJojrDp7tyHc7LERnINv1oeijF/co1t3sqCKkgIcP5sfeLQPw2ZLtKg2itXuugO9//VfCRKhJRFVjPQRaRGjFb+jj4MIcFNJylwwM3rB5POLcgWg6vlI0sVnh3bs6WXzWgtjwS0Hc1Rb1hSZZ2AHulvF87pKx3eauQEO6ZSSSnSEyBschQxWIWe4lMyg90JkPXUTMDCoUsp/0OzHoUiIq+xucc8187tJyl0h2BrfcXR5zPAbRMsJyXy1ZWK9Y0JsU4EojLPZLwXLvd5bypYQwIHhWdAvL/TLxuUtxlwwMVXVRtVzYLhsLt4yi+MjpDlZKJtbLJowOxZ1nhfqXlriPwfc9bMRsxXL8YEE1W9wVhSGnu1CIjcWMclDIBVXJwFAVD2XTgc9G22IvTs6oY61kYr1iYWa2s7DAa688iz3zm2PzGVohxH2SLdJmxDN0bdeHmm9Rylk3wZAfi7DhQSEtd8nAUBUPhaDJxTi4ZQDew/bidg3FmttxtqahO9i7a3B1+PvJ5exzD90yovtXi3NO1+sTfwOUlrtkYKiqh6ol+niOh7jnDBOn1qvwWfvSA5ci6hjVFxo28QVVx2vtctk9t42KFHeJpDfii3rjIu75IJEJGK86K/1CUS9fy12Ie93x4LSIlgGAG19wbFjDGhnSLSMZGGqi1sl4iHu80UUn2amXGpez5S5ubKbjt7XcLwekuEsGRkLcR1zyVxAX90m03FVpuaNqufAZmkbLXC5IcZcMjGQJ2vG40EQiE9BZ6YFLjX710b0UEZ+9ZPKQ1XE550aFFHfJwIi7BsYhzh2ILHde7XHyBFB8pkn8bO0Q51ixLsUd6KxB9keIaI2Inottu5mIHiKiZ4noTiKaD7brRPSxYPtRIvqdQQ5eMt4kLPcxmSIbug2FfOQNZyJjnA8uXMCrXnJo4uvIZBFa7mMWfjsqOrHcPwrgh1PbPgTgvYyxVwL4PIDfCrb/JIBcsP21AP4vIrq+LyOVXHKM44IqEZDP2dC1evudL0Fyho2DC0ujHsZIEOeYdMtw2oo7Y+w+AOkMjpcAuC94fBeAHxe7A5ghIg3AFAAbQOvGkJKJJW65Z3WiHxVzM9uYnWndsk5y6UHEz7OScMtIy70nDgN4W/D4JwFcGzz+LIAqgGUA5wH8GWMsM7WPiN5FRIeI6ND6+nqPw5CMM0mf+/hcaDff9Bhe8eKnRz0MyQDQVE9a7gG9ivsvAng3ET0OYA7cQgeA1wHwAFwF4IUAfpOIbsh6A8bYbYyxWxhjtywsLPQ4DMk4E7fcxyksbRJ97RKOqvooSp87gB4zVBljxwD8IAAQ0UsAvDV46mcAfIUx5gBYI6JvAbgFwOk+jFVyiZHo6Tkm0TKSyUZRvNAtQ9Jy7x4iOhD8qwB4H4APBk+dB/DG4LkZAN8BYPLzfCWZjGP5Aclkoypu5Ja5zC33TkIhPwngIQA3EdFFInongLcT0XFw4V4CcHuw+18DmCWiwwAeA3A7Y+yZwQxdMu4kM1Qv7wtNMhyIXJTNwC1zmRsUbd0yjLG3N3nqLzP2rYAvsEokUBQGhXz4TBmbJCbJZKNIgyJEZqhKBooWNGwmYiMeieRyYBxzK0aFFHfJQFFVH6riywgVyVAYx2J1o0KKu2SgqIo7VglMkslGiYffKpf3bFGKu2SgqKoL5TK/yCTDQ1ruEVLcJQOFyJWLqZKhIX3uEVLcJQNFVd3LPmpBMjxktEyEFHfJQDF0G6o2eU0xJOPJODaIGRWyQbZkoNx0/WH4vrQhJMMh7pa53MNvpbhLBkpuAlvZScYXYa0rMvxWumUkEsnkEPaQlRFaUtwlEsnkIBZUL/fFVECKu0QimSDEgqrMrZDiLpFIJgjhlpG5FVLcJRLJBCHdMhFS3CUSycQgLPdxaus4KqS4SySSiSEUd+mWkeIukUgmB7GgKi13Ke4SiWSCiHzu0nLvpIfqR4hojYiei227mYgeIqJniehOIpoPtv8sET0V+/OJ6NWD/AASiUQiiKJlpOXeieX+UQA/nNr2IQDvZYy9EsDnAfwWADDGPsEYezVj7NUA3gHgDGPsqT6OVyKRSJpCxEDEZLQMOhB3xth9ALZSm18C4L7g8V0AfjzjpW8H8KkdjU4ikUi6gIhb71Lce/e5HwbwtuDxTwK4NmOffwPgkz2+v0QikfSEonjSLYPexf0XAbybiB4HMAfAjj9JRK8HUGOMPZf14mCfdxHRISI6tL6+3uMwJBKJJMkV+5axd9fGqIcxcnoq+csYOwbgBwGAiF4C4K2pXX4abax2xthtAG4DgFtuuUUWgpBIJH3hZS96ZtRDGAt6EnciOsAYWyMiBcD7AHww9pwC4KcAfE9/hiiRSCSSbukkFPKTAB4CcBMRXSSidwJ4OxEdB3AMwBKA22Mv+V4AFxhjpwcxYIlEIpG0p63lzhh7e5On/rLJ/vcA+I4djEkikUgkO0RmqEokEskEIsVdIpFIJhAp7hKJRDKBSHGXSCSSCUSKu0QikUwgUtwlEolkApHiLpFIJBOIFHeJRCKZQKS4SyQSyQQixV0ikUgmECnuEolEMoFIcZdIJJIJRIq7RCKRTCBS3CUSiWQCkeIukUgkE4gUd4lEIplApLhLJBLJBCLFXSKRSCYQKe4SiUQygXTSIPsjRLRGRM/Ftt1MRA8R0bNEdCcRzceee1Xw3OHg+fygBi+RSCSSbDqx3D8K4IdT2z4E4L2MsVcC+DyA3wLw/7d39zFyVWUcx7+/dlu0LdoiC9G+2CV2MVUCNBtTA9EWDClgrEZJbEgkoUnTQCK+RFJjjdH/TAxaE0PTFAqKVmNBrGhsaiVZ/8DKttTSlxVafGGx2EXejDG06OMf5zQZ1xl3OjvT65z5fZLJnHvunZnn9Nk+uXPmzhwk9QEPAOsj4l3ACuB0u4I1M7PmTFrcI2IYeHFC9yAwnNu7gY/m9nXAwYj4bX7sXyPin22K1czMmtTqnPthYHVu3wQszO1BICTtkrRf0p2NnkDSOkkjkkbGx8dbDMPMzOpptbjfCtwmaR9wPnAq9/cBVwM35/uPSLq23hNExJaIGIqIof7+/hbDMDOzevpaeVBEjJKmYJA0CNyYd40BwxHxQt73M2AZsGfqoZqZWbNaOnOXdFG+nwZsBDbnXbuAyyTNyh+uvh840o5Azcysec1cCrkdeAy4VNKYpLXAGklPAaPAn4FtABHxEnAX8DhwANgfET/tVPBmZlbfpNMyEbGmwa5NDY5/gHQ5pJmZVcTfUDUzK5CLu5lZgVzczcwK5OJuZlYgF3czswK5uJuZFcjF3cysQC7uZmYFcnE3MyuQi7uZWYFc3M3MCuTibmZWIBd3M7MCubibmRXIxd3MrEAu7mZmBXJxNzMrkIu7mVmBXNzNzArUzALZ90o6KelQTd/lkh6T9KSkn0h6U+5fLOkfkg7k2+ZOBm9mZvU1c+Z+H7BqQt9WYENEXAb8CPhczb7jEXFFvq1vT5hmZnY2+iY7ICKGJS2e0D0IDOf2bmAX8MW2RtakGdNmMGfmnCpe2sxsSmbPnN2x5560uDdwGFgNPAzcBCys2Tcg6QngVWBjRPyq3hNIWgesA1i0aFGLYcDKgZWsHFjZ8uPNzErU6geqtwK3SdoHnA+cyv0ngEURcSXwGeB7Z+bjJ4qILRExFBFD/f39LYZhZmb1tHTmHhGjwHUAkgaBG3P/a8Brub1P0nHSFM5IW6I1M7OmtHTmLumifD8N2Ahsztv9kqbn9iXAEuCZ9oRqZmbNmvTMXdJ2YAVwoaQx4EvAHEm350MeArbl9vuAr0g6DfwLWB8RL7Y9ajMz+5+auVpmTYNdm+oc+yDw4FSDMjOzqfE3VM3MCuTibmZWIBd3M7MCubibmRVIEVF1DEgaB/44hae4EHihTeF0i14cM/TmuD3m3nG24357RNT9Fuj/RXGfKkkjETFUdRznUi+OGXpz3B5z72jnuD0tY2ZWIBd3M7MClVLct1QdQAV6cczQm+P2mHtH28ZdxJy7mZn9p1LO3M3MrIaLu5lZgbq6uEtaJel3ko5J2lB1PJ0gaaGkRyUdkXRY0h25/wJJuyU9ne/nVR1rJ0iaLukJSY/k7QFJe3POfyBpZtUxtpOkuZJ2SBqVdFTSe3sh15I+nf++D0naLukNJeZa0r2STko6VNNXN79KvpnHf1DSsrN5ra4t7vl3478FXA8sBdZIWlptVB3xOvDZiFgKLAduz+PcAOyJiCXAnrxdojuAozXbXwW+HhHvAF4C1lYSVedsAn4eEe8ELieNvehcS5oPfBIYioh3A9OBj1Nmru8DVk3oa5Tf60lrYiwhLUl699m8UNcWd+A9wLGIeCYiTgHfJ63rWpSIOBER+3P7b6T/7PNJY70/H3Y/8OFqIuwcSQtIq3xtzdsCrgF25EOKGrekN5PWRLgHICJORcTL9ECuST8//kZJfcAs0pKdxeU6IoaBiWtcNMrvauDbkfwamCvprc2+VjcX9/nAszXbY7mvWJIWA1cCe4GLI+JE3vU8cHFFYXXSN4A7SQu/ALwFeDkiXs/bpeV8ABgHtuWpqK2SZlN4riPiOeBrwJ9IRf0VYB9l57pWo/xOqcZ1c3HvKZLmkBZC+VREvFq7L9L1rEVd0yrpg8DJiNhXdSznUB+wDLg7LzL/dyZMwRSa63mks9QB4G3AbP576qIntDO/3VzcnwMW1mwvyH3FkTSDVNi/GxEP5e6/nHmLlu9PVhVfh1wFfEjSH0hTbteQ5qPn5rfuUF7Ox4CxiNibt3eQin3puf4A8PuIGI+I06SlO6+i7FzXapTfKdW4bi7ujwNL8ifqM0kfwOysOKa2y/PM9wBHI+Kuml07gVty+xbgx+c6tk6KiM9HxIKIWEzK7S8j4mbgUeBj+bCixh0RzwPPSro0d10LHKHwXJOmY5ZLmpX/3s+Mu9hcT9AovzuBT+SrZpYDr9RM30wuIrr2BtwAPAUcB75QdTwdGuPVpLdpB4ED+XYDaf55D/A08Avggqpj7eC/wQrgkdy+BPgNcAz4IXBe1fG1eaxXACM53w8D83oh18CXgVHgEPAd4LwScw1sJ32ucJr0Tm1to/wCIl0ReBx4knQ1UdOv5Z8fMDMrUDdPy5iZWQMu7mZmBXJxNzMrkIu7mVmBXNzNzArk4m5mViAXdzOzAv0bSI/JoB2qxxkAAAAASUVORK5CYII=","text/plain":[""]},"metadata":{"needs_background":"light"},"output_type":"display_data"}],"source":["import numpy as np\n","from matplotlib import pyplot as plt\n","\n","ys = 200 + np.random.randn(100)\n","x = [x for x in range(len(ys))]\n","\n","plt.plot(x, ys, '-')\n","plt.fill_between(x, ys, 195, where=(ys > 195), facecolor='g', alpha=0.6)\n","\n","plt.title(\"Fills and Alpha Example\")\n","plt.show()"]},{"cell_type":"markdown","id":"65c30c87-c2e0-476a-8a4d-c6e722f7d2fd","metadata":{"id":"65c30c87-c2e0-476a-8a4d-c6e722f7d2fd"},"source":["## Automatic completions and exploring code\n","\n","Colab provides automatic completions to explore attributes of Python objects, as well as to quickly view documentation strings. As an example, first run the following cell to import the [`numpy`](http://www.numpy.org) module."]},{"cell_type":"code","execution_count":null,"id":"04d0e942-d2c6-476f-8293-a05fd6e61eb1","metadata":{"id":"04d0e942-d2c6-476f-8293-a05fd6e61eb1"},"outputs":[],"source":["import numpy as np"]},{"cell_type":"markdown","id":"6df5a9db-ab8e-4130-b995-28996230b7ce","metadata":{"id":"6df5a9db-ab8e-4130-b995-28996230b7ce"},"source":["If you now insert your cursor after `np` and press **Period**(`.`), you will see the list of available completions within the `np` module. Completions can be opened again by using **Ctrl+Space**."]},{"cell_type":"code","execution_count":null,"id":"de72e142-4a60-4564-8c95-903dd14e1bc4","metadata":{"id":"de72e142-4a60-4564-8c95-903dd14e1bc4"},"outputs":[],"source":["np."]},{"cell_type":"markdown","id":"3414f548-2833-4b48-85eb-1bc8838e4a03","metadata":{"id":"3414f548-2833-4b48-85eb-1bc8838e4a03"},"source":["If you type an open parenthesis after any function or class in the module, you will see a pop-up of its documentation string:"]},{"cell_type":"code","execution_count":null,"id":"faeedbc2-ae97-4ceb-be87-ad9d16cb94c7","metadata":{"id":"faeedbc2-ae97-4ceb-be87-ad9d16cb94c7"},"outputs":[],"source":["np.random()"]},{"cell_type":"markdown","id":"371f2dee-563f-4103-8d0c-598984c7fa2b","metadata":{"id":"371f2dee-563f-4103-8d0c-598984c7fa2b"},"source":["The documentation can be opened again using **Cmd/Ctrl+Shift+Space** or you can view the documentation for method by mouse hovering over the method name.\n","\n","When hovering over the method name the `Open in tab` link will open the documentation in a persistent pane. The `View source` link will navigate to the source code for the method."]},{"cell_type":"code","execution_count":null,"id":"67ba5e44-6f12-4a99-a26e-8694a31aaeda","metadata":{"id":"67ba5e44-6f12-4a99-a26e-8694a31aaeda"},"outputs":[],"source":["np.random.randint()"]},{"cell_type":"markdown","id":"66e67911-d0a6-49dc-9581-525e70400db1","metadata":{"id":"66e67911-d0a6-49dc-9581-525e70400db1"},"source":["---\n","\n","# Keyboard shortcuts\n","\n","You can access all the shortcuts by selecting \"Tools\" and then \"Keyboard Shortcuts\"\n"]},{"cell_type":"markdown","id":"8ZyzX7865dP4","metadata":{"id":"8ZyzX7865dP4"},"source":["---\n","\n","\n","# Importing a library that is not in Colaboratory\n","\n","To import a library that's not in Colaboratory by default, you can use `!pip install` or `!apt-get install`."]},{"cell_type":"code","execution_count":null,"id":"30fb497b-88d1-486d-97ee-74b8dae3c52e","metadata":{"id":"30fb497b-88d1-486d-97ee-74b8dae3c52e"},"outputs":[],"source":["# https://scikit-learn.org/stable/install.html\n","!pip install -U scikit-learn"]},{"cell_type":"markdown","id":"vVrDaeoLra7b","metadata":{"id":"vVrDaeoLra7b"},"source":["To see more examples, check out Colab documentation: https://colab.research.google.com/notebooks/snippets/importing_libraries.ipynb"]},{"cell_type":"markdown","id":"zoDQ2ov-4RsT","metadata":{"id":"zoDQ2ov-4RsT"},"source":["---\n","\n","# Loading and saving data from external sources:"]},{"cell_type":"markdown","id":"e6e4069b-43ee-46e8-af3b-e64d2de7c786","metadata":{"id":"e6e4069b-43ee-46e8-af3b-e64d2de7c786"},"source":["\n","## Uploading files from your local file system\n","\n","`files.upload` returns a dictionary of the files which were uploaded.\n","The dictionary is keyed by the file name and values are the data which were uploaded."]},{"cell_type":"code","execution_count":null,"id":"d288b6a7-6d23-4e75-89a8-6ddd3ace3a7f","metadata":{"id":"d288b6a7-6d23-4e75-89a8-6ddd3ace3a7f"},"outputs":[],"source":["from google.colab import files\n","uploaded = files.upload()\n"]},{"cell_type":"markdown","id":"aab29e8a-6370-4797-ac05-68c1834dd549","metadata":{"id":"aab29e8a-6370-4797-ac05-68c1834dd549"},"source":["Reminder: the uploaded files will be removed after each VM reconnect!"]},{"cell_type":"markdown","id":"dfc6cfa3-fd71-4469-8e13-2299f00bb12a","metadata":{"id":"dfc6cfa3-fd71-4469-8e13-2299f00bb12a"},"source":["## Downloading files to your local file system\n","\n","`files.download` will invoke a browser download of the file to your local computer."]},{"cell_type":"code","execution_count":null,"id":"d168e70c-c77b-43c4-a640-d6952e54ca59","metadata":{"id":"d168e70c-c77b-43c4-a640-d6952e54ca59"},"outputs":[],"source":["from google.colab import files\n","files.download('file_path')"]},{"cell_type":"markdown","id":"8da9c423-32d9-412b-b6cb-e0958325937a","metadata":{"id":"8da9c423-32d9-412b-b6cb-e0958325937a"},"source":["---\n","# Google Drive\n","\n","You can access files in Drive in a number of ways, including:\n","- Mounting your Google Drive in the runtime's virtual machine\n","- Using a wrapper around the API such as [PyDrive](https://pythonhosted.org/PyDrive/)\n","- Using the [native REST API](https://developers.google.com/drive/v3/web/about-sdk)\n","\n","\n","we will cover the first way here, for the other methods, visit: https://colab.research.google.com/notebooks/io.ipynb#scrollTo=D78AM1fFt2ty"]},{"cell_type":"markdown","id":"9b677d0e-d0c5-4b41-b17a-6b2694bf2916","metadata":{"id":"9b677d0e-d0c5-4b41-b17a-6b2694bf2916"},"source":["## Mounting Google Drive locally\n","\n","The example below shows how to mount your Google Drive on your runtime using an authorization code, and how to write and read files there. Once executed, you will be able to see the new file (`foo.txt`) at [https://drive.google.com/](https://drive.google.com/).\n","\n","This only supports reading, writing, and moving files; to programmatically modify sharing settings or other metadata, use one of the other options below.\n","\n","**Note:** When using the 'Mount Drive' button in the file browser, no authentication codes are necessary for notebooks that have only been edited by the current user."]},{"cell_type":"code","execution_count":null,"id":"51a85251-d562-4677-87e2-7441b5036cd5","metadata":{"id":"51a85251-d562-4677-87e2-7441b5036cd5"},"outputs":[],"source":["from google.colab import drive\n","drive.mount('/content/drive')"]},{"cell_type":"code","execution_count":null,"id":"daecfed8-56e7-4ce7-962b-eeb67f519a6b","metadata":{"id":"daecfed8-56e7-4ce7-962b-eeb67f519a6b"},"outputs":[],"source":["drive.flush_and_unmount()\n","print('All changes made in this colab session should now be visible in Drive.')"]},{"cell_type":"markdown","id":"7db627a8-28b9-4b80-9773-0e7d1e576c29","metadata":{"id":"7db627a8-28b9-4b80-9773-0e7d1e576c29"},"source":["---\n","# Open files from GitHub\n","\n","To open a file from GitHub, you can clone the repo or fetch the file directly.\n","\n","\n","If you are trying to access files from a private repo, you must use a [GitHub access token](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line)."]},{"cell_type":"code","execution_count":null,"id":"59eb5d6b-51df-4f41-8ee8-aab0584dc236","metadata":{"id":"59eb5d6b-51df-4f41-8ee8-aab0584dc236"},"outputs":[],"source":["# Clone main repo.\n","!git clone https://github.com/PJalgotrader/Machine_Learning-USU.git ML_USU"]},{"cell_type":"code","execution_count":null,"id":"38b8dd93-994d-4aa3-8b86-daf901fa61d8","metadata":{"id":"38b8dd93-994d-4aa3-8b86-daf901fa61d8"},"outputs":[],"source":["# Clone specific branch\n","!git clone -b fall22 https://github.com/PJalgotrader/Machine_Learning-USU.git ML_USU"]},{"cell_type":"code","execution_count":null,"id":"c0e6cb34-8abc-41fb-82f9-0886833cc8de","metadata":{"id":"c0e6cb34-8abc-41fb-82f9-0886833cc8de"},"outputs":[],"source":["import pandas as pd"]},{"cell_type":"code","execution_count":null,"id":"61055cf7-ff2f-41ec-b385-3bc98ad1e12c","metadata":{"id":"61055cf7-ff2f-41ec-b385-3bc98ad1e12c"},"outputs":[],"source":["df = pd.read_csv(\"/content/ML_USU/data/wage.csv\")\n","df.head()"]},{"cell_type":"code","execution_count":null,"id":"6c24ffc9-b26e-46f8-a44c-f9731ffb500e","metadata":{"id":"6c24ffc9-b26e-46f8-a44c-f9731ffb500e"},"outputs":[],"source":["# Fetch a single file using the raw GitHub URL: \n","!wget -nc https://raw.githubusercontent.com/PJalgotrader/Machine_Learning-USU/fall22/data/wage.csv"]},{"cell_type":"markdown","id":"d517d2f8-f71b-4c19-8640-5e9dfa62202d","metadata":{"id":"d517d2f8-f71b-4c19-8640-5e9dfa62202d"},"source":["# Resources\n","\n","1. Google Colab documentation\n"," * https://colab.research.google.com/notebooks/basic_features_overview.ipynb#scrollTo=d-S-3nYLQSHb\n"," * https://colab.research.google.com/notebooks/io.ipynb#scrollTo=D78AM1fFt2ty\n"," * https://colab.research.google.com/notebooks/snippets/accessing_files.ipynb#scrollTo=Zg2cF_2-gI67\n"," * https://colab.research.google.com/notebooks/snippets/importing_libraries.ipynb"]}],"metadata":{"colab":{"collapsed_sections":[],"name":"Copy of google_colab_jumpstart.ipynb","provenance":[{"file_id":"https://github.com/PJalgotrader/Machine_Learning-USU/blob/fall22/Lectures/Class3-Python_Crash_Course/google_colab_jumpstart.ipynb","timestamp":1661839407825}],"toc_visible":true},"kernelspec":{"display_name":"Python 3 (ipykernel)","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.9.7"}},"nbformat":4,"nbformat_minor":5}
2 |
--------------------------------------------------------------------------------
/Platforms and tools/PyCaret/PyCaret_PedramJahangiry.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/Platforms and tools/PyCaret/PyCaret_PedramJahangiry.pdf
--------------------------------------------------------------------------------
/Platforms and tools/PyCaret/README.md:
--------------------------------------------------------------------------------
1 | Here is the link to my YouTube playlist for PyCaret! https://youtube.com/playlist?list=PL2GWo47BFyUOqCAj_16yeNspfeM0nfA6q
2 |
3 | **Topics**:
4 | 1. PyCaret introduction
5 | 2. PyCaret regression
6 | 3. PyCaret classification
7 | 4. PyCaret timeseries
8 |
9 |
10 |
11 | ## 🔗 Links
12 |
13 | [](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)
14 |
15 | [](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)
16 |
17 | [](https://twitter.com/PedramJahangiry)
18 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 |
4 | # Deep Learning (2025-2026)
5 |
6 | Repository for deep learning courses owned and maintained by prof. Jahangiry
7 |
8 | * The main branch contains some general contents including **Python crash course**, data, Google Colab tutorials, **PyCaret**, and etc.
9 | * You can find the latest lecture slides and Python notebooks in the **New slides** folder under Lectures.
10 |
11 |
12 |
13 | # 🚀 About Me
14 |
15 | Pedram Jahangiry, CFA, is a Professional Practice Assistant Professor of Data Analytics and Information Systems in the [Huntsman School of Business at Utah State University](https://huntsman.usu.edu/directory/jahangiry-pedram). Prior to joining the Huntsman School in 2018, Pedram was a research associate within Financial Modeling Group at BlackRock NYC. His current research is involved in machine learning, deep learning and time series forecasting.
16 | Pedram is one of the project mentors at the [Analytics Solutions Center](https://huntsman.usu.edu/asc/index) where they provide significant experiential learning opportunities for students from across USU’s Logan and Statewide campuses by working with corporate partners on analytics projects.
17 |
18 |
19 |
20 |
21 | ## 🔗 Links
22 |
23 | [](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)
24 |
25 | [](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)
26 |
27 | [](https://twitter.com/PedramJahangiry)
28 |
29 |
30 |
31 |
32 |
33 | ## 🎲 Topics covered (Spring 2025)
34 |
35 | | **Deep Learning** |
36 | |--------------------------------------------------------------------------------------------------|
37 | |Module 1- Introduction to Deep Learning |
38 | |Module 2- Setting up Deep Learning Environment|
39 | |Module 3- Machine Learning review (ML fundamentals + models)|
40 | |Module 4- Deep Neural Networks (NN and DNN)|
41 | |Module 5- Deep Computer Vision (CNN, R-CNN, YOLO, FCN)|
42 | |Module 6- Deep Sequence Modeling (RNN, LSTM)|
43 | |Module 7- Transformers (Attention is all you need!)|
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/data/spam.csv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/data/spam.csv
--------------------------------------------------------------------------------
/images/Jahangirylogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PJalgotrader/Deep_Learning-USU/e834c954dc49306aaed5e906d8a02f6d37d7ac44/images/Jahangirylogo.png
--------------------------------------------------------------------------------