├── 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 | "\"Open \n", 11 | "\n", 12 | "\n", 13 | "\n", 14 | "![logo](https://upload.wikimedia.org/wikipedia/commons/4/44/Huntsman-Wordmark-with-USU-Blue.gif#center) \n", 15 | "\n", 16 | "\n", 17 | "## 🔗 Links\n", 18 | "\n", 19 | "[![linkedin](https://img.shields.io/badge/LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)\n", 20 | "\n", 21 | "[![Youtube](https://img.shields.io/badge/youtube_channel-1DA1F2?style=for-the-badge&logo=youtube&logoColor=white&color=FF0000)](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)\n", 22 | "\n", 23 | "[![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/PedramJahangiry.svg?style=social&label=Follow%20%40PedramJahangiry)](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 | "\"Open \n", 11 | "\n", 12 | "\n", 13 | "\n", 14 | "![logo](https://upload.wikimedia.org/wikipedia/commons/4/44/Huntsman-Wordmark-with-USU-Blue.gif#center) \n", 15 | "\n", 16 | "\n", 17 | "\n", 18 | "## 🔗 Links\n", 19 | "\n", 20 | "[![linkedin](https://img.shields.io/badge/LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)\n", 21 | "\n", 22 | "[![Youtube](https://img.shields.io/badge/youtube_channel-1DA1F2?style=for-the-badge&logo=youtube&logoColor=white&color=FF0000)](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)\n", 23 | "\n", 24 | "[![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/PedramJahangiry.svg?style=social&label=Follow%20%40PedramJahangiry)](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 | [![linkedin](https://img.shields.io/badge/LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a) 20 | 21 | [![Youtube](https://img.shields.io/badge/youtube_channel-1DA1F2?style=for-the-badge&logo=youtube&logoColor=white&color=FF0000)](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ) 22 | 23 | [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/PedramJahangiry.svg?style=social&label=Follow%20%40PedramJahangiry)](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 | [![linkedin](https://img.shields.io/badge/LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a) 12 | 13 | [![Youtube](https://img.shields.io/badge/youtube_channel-1DA1F2?style=for-the-badge&logo=youtube&logoColor=white&color=FF0000)](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ) 14 | 15 | [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/PedramJahangiry.svg?style=social&label=Follow%20%40PedramJahangiry)](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","\"Open \n","\n","\n","\n","![logo](https://upload.wikimedia.org/wikipedia/commons/4/44/Huntsman-Wordmark-with-USU-Blue.gif#center) \n","\n","\n","## 🔗 Links\n","\n","[![linkedin](https://img.shields.io/badge/LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a)\n","\n","[![Youtube](https://img.shields.io/badge/youtube_channel-1DA1F2?style=for-the-badge&logo=youtube&logoColor=white&color=FF0000)](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ)\n","\n","[![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/PedramJahangiry.svg?style=social&label=Follow%20%40PedramJahangiry)](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":"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","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 | [![linkedin](https://img.shields.io/badge/LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a) 14 | 15 | [![Youtube](https://img.shields.io/badge/youtube_channel-1DA1F2?style=for-the-badge&logo=youtube&logoColor=white&color=FF0000)](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ) 16 | 17 | [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/PedramJahangiry.svg?style=social&label=Follow%20%40PedramJahangiry)](https://twitter.com/PedramJahangiry) 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![DL cover](https://user-images.githubusercontent.com/19335954/210499958-e1230059-4b9c-4ea4-a5af-9901bd02ba18.png) 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 | [![linkedin](https://img.shields.io/badge/LinkedIn-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/pedram-jahangiry-cfa-5778015a) 24 | 25 | [![Youtube](https://img.shields.io/badge/youtube_channel-1DA1F2?style=for-the-badge&logo=youtube&logoColor=white&color=FF0000)](https://www.youtube.com/channel/UCNDElcuuyX-2pSatVBDpJJQ) 26 | 27 | [![X URL](https://img.shields.io/twitter/url/https/twitter.com/PedramJahangiry.svg?style=social&label=Follow%20%40PedramJahangiry)](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 --------------------------------------------------------------------------------