├── 2-layer MLP with Pytorch.ipynb ├── Getting started with Pytorch.ipynb └── CNN for CIFAR-10.ipynb /2-layer MLP with Pytorch.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Adapted from tutorials at pytorch.org" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# Autograd: Automatic differentiation" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 2, 20 | "metadata": { 21 | "collapsed": true 22 | }, 23 | "outputs": [], 24 | "source": [ 25 | "from torch.autograd import Variable\n", 26 | "import torch\n", 27 | "import numpy as np" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 3, 33 | "metadata": { 34 | "collapsed": false 35 | }, 36 | "outputs": [], 37 | "source": [ 38 | "a = Variable(torch.randn(2,3), requires_grad=True)" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | ".data , .grad, .grad_fn" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 4, 51 | "metadata": { 52 | "collapsed": false 53 | }, 54 | "outputs": [ 55 | { 56 | "data": { 57 | "text/plain": [ 58 | "Variable containing:\n", 59 | " 0.8333 -0.7631 0.6214\n", 60 | "-0.8634 0.6053 -0.9941\n", 61 | "[torch.FloatTensor of size 2x3]" 62 | ] 63 | }, 64 | "execution_count": 4, 65 | "metadata": {}, 66 | "output_type": "execute_result" 67 | } 68 | ], 69 | "source": [ 70 | "a" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 5, 76 | "metadata": { 77 | "collapsed": false 78 | }, 79 | "outputs": [ 80 | { 81 | "data": { 82 | "text/plain": [ 83 | "\n", 84 | " 0.8333 -0.7631 0.6214\n", 85 | "-0.8634 0.6053 -0.9941\n", 86 | "[torch.FloatTensor of size 2x3]" 87 | ] 88 | }, 89 | "execution_count": 5, 90 | "metadata": {}, 91 | "output_type": "execute_result" 92 | } 93 | ], 94 | "source": [ 95 | "a.data" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 6, 101 | "metadata": { 102 | "collapsed": false 103 | }, 104 | "outputs": [ 105 | { 106 | "name": "stdout", 107 | "output_type": "stream", 108 | "text": [ 109 | "None\n" 110 | ] 111 | } 112 | ], 113 | "source": [ 114 | "print(a.grad)" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 7, 120 | "metadata": { 121 | "collapsed": true 122 | }, 123 | "outputs": [], 124 | "source": [ 125 | "b = a*a" 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "execution_count": 8, 131 | "metadata": { 132 | "collapsed": true 133 | }, 134 | "outputs": [], 135 | "source": [ 136 | "c = b.mean()" 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": {}, 142 | "source": [ 143 | "If you want to compute the derivatives, you can call .backward() on a Variable. \n", 144 | "\n", 145 | "If Variable is a scalar (i.e. it holds a one element tensor), you don’t need to specify any arguments to backward(), however if it has more elements, you need to specify a grad_output argument that is a tensor of matching shape." 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 9, 151 | "metadata": { 152 | "collapsed": true 153 | }, 154 | "outputs": [], 155 | "source": [ 156 | "c.backward()" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 10, 162 | "metadata": { 163 | "collapsed": false 164 | }, 165 | "outputs": [ 166 | { 167 | "data": { 168 | "text/plain": [ 169 | "Variable containing:\n", 170 | " 0.6272\n", 171 | "[torch.FloatTensor of size 1]" 172 | ] 173 | }, 174 | "execution_count": 10, 175 | "metadata": {}, 176 | "output_type": "execute_result" 177 | } 178 | ], 179 | "source": [ 180 | "c" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 12, 186 | "metadata": { 187 | "collapsed": false 188 | }, 189 | "outputs": [ 190 | { 191 | "data": { 192 | "text/plain": [ 193 | "Variable containing:\n", 194 | " 0.2778 -0.2544 0.2071\n", 195 | "-0.2878 0.2018 -0.3314\n", 196 | "[torch.FloatTensor of size 2x3]" 197 | ] 198 | }, 199 | "execution_count": 12, 200 | "metadata": {}, 201 | "output_type": "execute_result" 202 | } 203 | ], 204 | "source": [ 205 | "a.grad" 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": 51, 211 | "metadata": { 212 | "collapsed": false 213 | }, 214 | "outputs": [ 215 | { 216 | "name": "stdout", 217 | "output_type": "stream", 218 | "text": [ 219 | "Variable containing:\n", 220 | " 6 6\n", 221 | " 6 6\n", 222 | "[torch.FloatTensor of size 2x2]\n", 223 | "\n" 224 | ] 225 | } 226 | ], 227 | "source": [ 228 | "x = Variable(torch.ones(2, 2), requires_grad=True)\n", 229 | "y = x + 2\n", 230 | "z = y * y\n", 231 | "z.backward(torch.ones(2, 2), retain_graph=True)\n", 232 | "# the retain_variables flag will prevent the internal buffers from being freed\n", 233 | "print(x.grad)" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": 57, 239 | "metadata": { 240 | "collapsed": false 241 | }, 242 | "outputs": [ 243 | { 244 | "name": "stdout", 245 | "output_type": "stream", 246 | "text": [ 247 | "Variable containing:\n", 248 | " 9.1141 10.4848\n", 249 | " 6.7608 10.2028\n", 250 | "[torch.FloatTensor of size 2x2]\n", 251 | "\n" 252 | ] 253 | } 254 | ], 255 | "source": [ 256 | "y = x + 2\n", 257 | "\n", 258 | "gradient = torch.randn(2, 2)\n", 259 | "\n", 260 | "# this would fail if we didn't specify\n", 261 | "# that we want to retain variables\n", 262 | "y.backward(gradient)\n", 263 | "\n", 264 | "print(x.grad)" 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": 58, 270 | "metadata": { 271 | "collapsed": false 272 | }, 273 | "outputs": [ 274 | { 275 | "name": "stdout", 276 | "output_type": "stream", 277 | "text": [ 278 | "Variable containing:\n", 279 | " 10.1141 11.4848\n", 280 | " 7.7608 11.2028\n", 281 | "[torch.FloatTensor of size 2x2]\n", 282 | "\n" 283 | ] 284 | } 285 | ], 286 | "source": [ 287 | "y.backward(torch.ones(2, 2))\n", 288 | "print(x.grad)" 289 | ] 290 | }, 291 | { 292 | "cell_type": "markdown", 293 | "metadata": {}, 294 | "source": [ 295 | "# 2 - Layer Network MLP" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 115, 301 | "metadata": { 302 | "collapsed": true 303 | }, 304 | "outputs": [], 305 | "source": [ 306 | "N, D_in, H, D_out = 64, 1000, 100, 10" 307 | ] 308 | }, 309 | { 310 | "cell_type": "code", 311 | "execution_count": 116, 312 | "metadata": { 313 | "collapsed": true 314 | }, 315 | "outputs": [], 316 | "source": [ 317 | "x = Variable(torch.randn(N, D_in), requires_grad= False)\n", 318 | "y = Variable(torch.randn(N, D_out), requires_grad= False)" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": 117, 324 | "metadata": { 325 | "collapsed": true 326 | }, 327 | "outputs": [], 328 | "source": [ 329 | "w1 = Variable(torch.randn(D_in, H), requires_grad=True)\n", 330 | "w2 = Variable(torch.randn(H, D_out ), requires_grad=True)" 331 | ] 332 | }, 333 | { 334 | "cell_type": "code", 335 | "execution_count": 120, 336 | "metadata": { 337 | "collapsed": false 338 | }, 339 | "outputs": [ 340 | { 341 | "data": { 342 | "text/plain": [ 343 | "\n", 344 | "-1.0402e+00 2.7434e-01 -9.8606e-01 ... -1.6858e+00 6.5415e-01 8.6206e-01\n", 345 | " 1.6614e+00 7.0503e-01 -2.1643e+00 ... -4.9011e-01 -8.0367e-04 7.8051e-01\n", 346 | "-3.6560e-01 2.1856e+00 6.9547e-01 ... 6.2659e-01 1.4984e-01 1.1572e+00\n", 347 | " ... ⋱ ... \n", 348 | " 1.4684e-01 9.9845e-01 1.2135e+00 ... 1.0289e-01 7.8113e-01 -4.4499e-01\n", 349 | " 9.0211e-01 1.4462e+00 -8.0597e-01 ... -2.3426e-01 2.9448e-01 -5.9979e-01\n", 350 | " 4.4465e-01 1.4254e+00 5.1383e-01 ... -3.9099e-01 1.9480e+00 9.8071e-01\n", 351 | "[torch.FloatTensor of size 1000x100]" 352 | ] 353 | }, 354 | "execution_count": 120, 355 | "metadata": {}, 356 | "output_type": "execute_result" 357 | } 358 | ], 359 | "source": [ 360 | "w1.data" 361 | ] 362 | }, 363 | { 364 | "cell_type": "code", 365 | "execution_count": 119, 366 | "metadata": { 367 | "collapsed": false 368 | }, 369 | "outputs": [ 370 | { 371 | "name": "stdout", 372 | "output_type": "stream", 373 | "text": [ 374 | "None\n" 375 | ] 376 | } 377 | ], 378 | "source": [ 379 | "print(w1.grad)" 380 | ] 381 | }, 382 | { 383 | "cell_type": "markdown", 384 | "metadata": {}, 385 | "source": [ 386 | "Forward pass" 387 | ] 388 | }, 389 | { 390 | "cell_type": "code", 391 | "execution_count": 121, 392 | "metadata": { 393 | "collapsed": true 394 | }, 395 | "outputs": [], 396 | "source": [ 397 | "h_out = x.mm(w1)" 398 | ] 399 | }, 400 | { 401 | "cell_type": "code", 402 | "execution_count": 122, 403 | "metadata": { 404 | "collapsed": true 405 | }, 406 | "outputs": [], 407 | "source": [ 408 | "h_out_relu = h_out.clamp(min=0)" 409 | ] 410 | }, 411 | { 412 | "cell_type": "code", 413 | "execution_count": 123, 414 | "metadata": { 415 | "collapsed": true 416 | }, 417 | "outputs": [], 418 | "source": [ 419 | "y_pred = h_out_relu.mm(w2)" 420 | ] 421 | }, 422 | { 423 | "cell_type": "markdown", 424 | "metadata": {}, 425 | "source": [ 426 | "MSE loss calculation" 427 | ] 428 | }, 429 | { 430 | "cell_type": "code", 431 | "execution_count": 124, 432 | "metadata": { 433 | "collapsed": false 434 | }, 435 | "outputs": [ 436 | { 437 | "data": { 438 | "text/plain": [ 439 | "Variable containing:\n", 440 | " 49703.0195\n", 441 | "[torch.FloatTensor of size 1]" 442 | ] 443 | }, 444 | "execution_count": 124, 445 | "metadata": {}, 446 | "output_type": "execute_result" 447 | } 448 | ], 449 | "source": [ 450 | "(y - y_pred).pow(2).mean()" 451 | ] 452 | }, 453 | { 454 | "cell_type": "code", 455 | "execution_count": 125, 456 | "metadata": { 457 | "collapsed": false 458 | }, 459 | "outputs": [], 460 | "source": [ 461 | "loss = (y-y_pred).pow(2).mean()" 462 | ] 463 | }, 464 | { 465 | "cell_type": "markdown", 466 | "metadata": {}, 467 | "source": [ 468 | "Backward pass" 469 | ] 470 | }, 471 | { 472 | "cell_type": "code", 473 | "execution_count": 126, 474 | "metadata": { 475 | "collapsed": true 476 | }, 477 | "outputs": [], 478 | "source": [ 479 | "loss.backward()" 480 | ] 481 | }, 482 | { 483 | "cell_type": "markdown", 484 | "metadata": {}, 485 | "source": [ 486 | "SGD Learning rule : Parameter update" 487 | ] 488 | }, 489 | { 490 | "cell_type": "code", 491 | "execution_count": 127, 492 | "metadata": { 493 | "collapsed": true 494 | }, 495 | "outputs": [], 496 | "source": [ 497 | "learning_rate = 1e-5" 498 | ] 499 | }, 500 | { 501 | "cell_type": "code", 502 | "execution_count": 128, 503 | "metadata": { 504 | "collapsed": true 505 | }, 506 | "outputs": [], 507 | "source": [ 508 | "w1.data -= learning_rate*w1.grad.data" 509 | ] 510 | }, 511 | { 512 | "cell_type": "code", 513 | "execution_count": 129, 514 | "metadata": { 515 | "collapsed": true 516 | }, 517 | "outputs": [], 518 | "source": [ 519 | "w2.data -= learning_rate*w2.grad.data" 520 | ] 521 | }, 522 | { 523 | "cell_type": "code", 524 | "execution_count": 130, 525 | "metadata": { 526 | "collapsed": false 527 | }, 528 | "outputs": [ 529 | { 530 | "data": { 531 | "text/plain": [ 532 | "Variable containing:\n", 533 | "-6.5523e+00 -5.8850e+00 7.1335e+00 ... -9.2303e+00 9.0762e+00 -2.5260e+00\n", 534 | "-4.3329e+00 -4.3050e+00 1.4226e+01 ... 1.1594e+01 -3.8298e+00 -1.3600e+01\n", 535 | "-3.1369e+00 2.3575e+00 1.6431e+01 ... -2.9896e+00 1.1508e+01 1.9873e+00\n", 536 | " ... ⋱ ... \n", 537 | " 3.4611e+01 -4.2962e+00 1.2984e+01 ... -7.5931e+00 -4.2852e+00 3.5785e+00\n", 538 | "-1.2022e+01 -2.4825e+01 -6.1322e+00 ... 3.0110e+01 -2.5653e+01 -2.5324e+00\n", 539 | " 1.6616e+00 5.5213e-01 -7.8417e+00 ... -1.5453e+01 -2.2512e+00 8.5819e+00\n", 540 | "[torch.FloatTensor of size 1000x100]" 541 | ] 542 | }, 543 | "execution_count": 130, 544 | "metadata": {}, 545 | "output_type": "execute_result" 546 | } 547 | ], 548 | "source": [ 549 | "w1.grad" 550 | ] 551 | }, 552 | { 553 | "cell_type": "code", 554 | "execution_count": 131, 555 | "metadata": { 556 | "collapsed": false 557 | }, 558 | "outputs": [ 559 | { 560 | "data": { 561 | "text/plain": [ 562 | "Variable containing:\n", 563 | " -165.3033 509.7229 1023.4786 ... 320.2248 -324.8032 -106.2662\n", 564 | " -534.9585 296.9145 897.2170 ... 29.8218 -577.4785 -234.4964\n", 565 | " -300.4757 -33.3462 640.7281 ... 156.2877 -89.6661 69.2354\n", 566 | " ... ⋱ ... \n", 567 | " -109.2193 85.5342 642.8596 ... 121.7496 -116.1697 -135.5347\n", 568 | " -142.9786 237.6744 755.4649 ... 22.7992 -367.2899 -55.7950\n", 569 | " -195.6143 76.7552 518.6180 ... 198.4615 5.4108 -93.4247\n", 570 | "[torch.FloatTensor of size 100x10]" 571 | ] 572 | }, 573 | "execution_count": 131, 574 | "metadata": {}, 575 | "output_type": "execute_result" 576 | } 577 | ], 578 | "source": [ 579 | "w2.grad" 580 | ] 581 | }, 582 | { 583 | "cell_type": "markdown", 584 | "metadata": {}, 585 | "source": [ 586 | "Set w1.grad and w2.grad to zero after updating w1 and w2" 587 | ] 588 | }, 589 | { 590 | "cell_type": "code", 591 | "execution_count": 133, 592 | "metadata": { 593 | "collapsed": false 594 | }, 595 | "outputs": [], 596 | "source": [ 597 | "w1.grad.data.zero_()\n", 598 | "w2.grad.data.zero_();" 599 | ] 600 | }, 601 | { 602 | "cell_type": "code", 603 | "execution_count": 73, 604 | "metadata": { 605 | "collapsed": false 606 | }, 607 | "outputs": [ 608 | { 609 | "name": "stdout", 610 | "output_type": "stream", 611 | "text": [ 612 | "0 2349.51220703125\n", 613 | "10 2107.16650390625\n", 614 | "20 1894.9832763671875\n", 615 | "30 1709.343505859375\n", 616 | "40 1547.046630859375\n", 617 | "50 1402.998291015625\n", 618 | "60 1275.3468017578125\n", 619 | "70 1162.5869140625\n", 620 | "80 1063.0400390625\n", 621 | "90 973.5719604492188\n" 622 | ] 623 | } 624 | ], 625 | "source": [ 626 | "for i in range(100):\n", 627 | " h_out = x.mm(w1)\n", 628 | " h_out_relu = h_out.clamp(min=0)\n", 629 | " y_pred = h_out_relu.mm(w2)\n", 630 | " \n", 631 | " loss = (y-y_pred).pow(2).mean()\n", 632 | " if i%10==0:\n", 633 | " print(i, loss.data[0])\n", 634 | "# print(i, loss)\n", 635 | " \n", 636 | " \n", 637 | " loss.backward()\n", 638 | " \n", 639 | " w1.data -= learning_rate*w1.grad.data\n", 640 | " w2.data -= learning_rate*w2.grad.data\n", 641 | " \n", 642 | " w1.grad.data.zero_()\n", 643 | " w2.grad.data.zero_()" 644 | ] 645 | }, 646 | { 647 | "cell_type": "markdown", 648 | "metadata": {}, 649 | "source": [ 650 | "# Using torch.nn" 651 | ] 652 | }, 653 | { 654 | "cell_type": "code", 655 | "execution_count": 77, 656 | "metadata": { 657 | "collapsed": true 658 | }, 659 | "outputs": [], 660 | "source": [ 661 | "N, D_in, H, D_out = 64, 1000, 100, 10" 662 | ] 663 | }, 664 | { 665 | "cell_type": "code", 666 | "execution_count": 78, 667 | "metadata": { 668 | "collapsed": true 669 | }, 670 | "outputs": [], 671 | "source": [ 672 | "x = Variable(torch.randn(N, D_in), requires_grad= False)\n", 673 | "y = Variable(torch.randn(N, D_out), requires_grad= False)" 674 | ] 675 | }, 676 | { 677 | "cell_type": "code", 678 | "execution_count": 79, 679 | "metadata": { 680 | "collapsed": true 681 | }, 682 | "outputs": [], 683 | "source": [ 684 | "w1 = Variable(torch.randn(D_in, H), requires_grad=True)\n", 685 | "w2 = Variable(torch.randn(H, D_out ), requires_grad=True)" 686 | ] 687 | }, 688 | { 689 | "cell_type": "code", 690 | "execution_count": 80, 691 | "metadata": { 692 | "collapsed": true 693 | }, 694 | "outputs": [], 695 | "source": [ 696 | "import torch.nn as nn" 697 | ] 698 | }, 699 | { 700 | "cell_type": "code", 701 | "execution_count": 81, 702 | "metadata": { 703 | "collapsed": true 704 | }, 705 | "outputs": [], 706 | "source": [ 707 | "model = nn.Sequential(\n", 708 | " nn.Linear(D_in, H),\n", 709 | " nn.ReLU(),\n", 710 | " nn.Linear(H, D_out)\n", 711 | ")" 712 | ] 713 | }, 714 | { 715 | "cell_type": "markdown", 716 | "metadata": {}, 717 | "source": [ 718 | "Forward pass" 719 | ] 720 | }, 721 | { 722 | "cell_type": "code", 723 | "execution_count": 82, 724 | "metadata": { 725 | "collapsed": true 726 | }, 727 | "outputs": [], 728 | "source": [ 729 | "y_pred = model(x)" 730 | ] 731 | }, 732 | { 733 | "cell_type": "code", 734 | "execution_count": 83, 735 | "metadata": { 736 | "collapsed": true 737 | }, 738 | "outputs": [], 739 | "source": [ 740 | "loss_fn = nn.MSELoss()" 741 | ] 742 | }, 743 | { 744 | "cell_type": "markdown", 745 | "metadata": {}, 746 | "source": [ 747 | "Loss calculation" 748 | ] 749 | }, 750 | { 751 | "cell_type": "code", 752 | "execution_count": 84, 753 | "metadata": { 754 | "collapsed": false 755 | }, 756 | "outputs": [ 757 | { 758 | "data": { 759 | "text/plain": [ 760 | "Variable containing:\n", 761 | " 1.0958\n", 762 | "[torch.FloatTensor of size 1]" 763 | ] 764 | }, 765 | "execution_count": 84, 766 | "metadata": {}, 767 | "output_type": "execute_result" 768 | } 769 | ], 770 | "source": [ 771 | "loss_fn(y_pred, y)" 772 | ] 773 | }, 774 | { 775 | "cell_type": "code", 776 | "execution_count": 85, 777 | "metadata": { 778 | "collapsed": true 779 | }, 780 | "outputs": [], 781 | "source": [ 782 | "loss = loss_fn(y_pred, y)" 783 | ] 784 | }, 785 | { 786 | "cell_type": "markdown", 787 | "metadata": {}, 788 | "source": [ 789 | "Backward pass" 790 | ] 791 | }, 792 | { 793 | "cell_type": "code", 794 | "execution_count": 86, 795 | "metadata": { 796 | "collapsed": true 797 | }, 798 | "outputs": [], 799 | "source": [ 800 | "loss.backward()" 801 | ] 802 | }, 803 | { 804 | "cell_type": "markdown", 805 | "metadata": {}, 806 | "source": [ 807 | "Paramter update" 808 | ] 809 | }, 810 | { 811 | "cell_type": "code", 812 | "execution_count": 87, 813 | "metadata": { 814 | "collapsed": false 815 | }, 816 | "outputs": [], 817 | "source": [ 818 | "for param in model.parameters():\n", 819 | " param.data -= learning_rate*param.grad.data" 820 | ] 821 | }, 822 | { 823 | "cell_type": "markdown", 824 | "metadata": {}, 825 | "source": [ 826 | "Make gradients zero after updating to avoid accumulation of gradients " 827 | ] 828 | }, 829 | { 830 | "cell_type": "code", 831 | "execution_count": 89, 832 | "metadata": { 833 | "collapsed": true 834 | }, 835 | "outputs": [], 836 | "source": [ 837 | "model.zero_grad()" 838 | ] 839 | }, 840 | { 841 | "cell_type": "markdown", 842 | "metadata": { 843 | "collapsed": true 844 | }, 845 | "source": [ 846 | "# Using optim for learning rule" 847 | ] 848 | }, 849 | { 850 | "cell_type": "code", 851 | "execution_count": 108, 852 | "metadata": { 853 | "collapsed": true 854 | }, 855 | "outputs": [], 856 | "source": [ 857 | "N, D_in, H, D_out = 64, 1000, 100, 10" 858 | ] 859 | }, 860 | { 861 | "cell_type": "code", 862 | "execution_count": 109, 863 | "metadata": { 864 | "collapsed": true 865 | }, 866 | "outputs": [], 867 | "source": [ 868 | "x = Variable(torch.randn(N, D_in), requires_grad= False)\n", 869 | "y = Variable(torch.randn(N, D_out), requires_grad= False)" 870 | ] 871 | }, 872 | { 873 | "cell_type": "code", 874 | "execution_count": 110, 875 | "metadata": { 876 | "collapsed": true 877 | }, 878 | "outputs": [], 879 | "source": [ 880 | "w1 = Variable(torch.randn(D_in, H), requires_grad=True)\n", 881 | "w2 = Variable(torch.randn(H, D_out ), requires_grad=True)" 882 | ] 883 | }, 884 | { 885 | "cell_type": "code", 886 | "execution_count": 111, 887 | "metadata": { 888 | "collapsed": true 889 | }, 890 | "outputs": [], 891 | "source": [ 892 | "model = nn.Sequential(\n", 893 | " nn.Linear(D_in, H),\n", 894 | " nn.ReLU(),\n", 895 | " nn.Linear(H, D_out)\n", 896 | ")" 897 | ] 898 | }, 899 | { 900 | "cell_type": "code", 901 | "execution_count": 112, 902 | "metadata": { 903 | "collapsed": true 904 | }, 905 | "outputs": [], 906 | "source": [ 907 | "optimizer = torch.optim.Adam(model.parameters())" 908 | ] 909 | }, 910 | { 911 | "cell_type": "code", 912 | "execution_count": 113, 913 | "metadata": { 914 | "collapsed": true 915 | }, 916 | "outputs": [], 917 | "source": [ 918 | "loss_fn = nn.MSELoss()" 919 | ] 920 | }, 921 | { 922 | "cell_type": "code", 923 | "execution_count": 114, 924 | "metadata": { 925 | "collapsed": false 926 | }, 927 | "outputs": [ 928 | { 929 | "name": "stdout", 930 | "output_type": "stream", 931 | "text": [ 932 | "0 1.0697293281555176\n", 933 | "10 0.10139219462871552\n", 934 | "20 0.030052784830331802\n", 935 | "30 0.009489026851952076\n", 936 | "40 0.003732791170477867\n", 937 | "50 0.001254924340173602\n", 938 | "60 0.00047503304085694253\n", 939 | "70 0.00016581712407059968\n", 940 | "80 6.223517993930727e-05\n", 941 | "90 2.1776450012112036e-05\n" 942 | ] 943 | } 944 | ], 945 | "source": [ 946 | "for i in range(100):\n", 947 | " # Forward pass without torch.nn\n", 948 | "# h_out = x.mm(w1)\n", 949 | "# h_out_relu = h_out.clamp(min=0)\n", 950 | "# y_pred = h_out_relu.mm(w2)\n", 951 | "\n", 952 | " # Forward pass using torch.nn model\n", 953 | " y_pred = model(x)\n", 954 | " \n", 955 | " # Loss calculation from basics\n", 956 | "# loss = (y-y_pred).pow(2).mean()\n", 957 | "\n", 958 | " # Loss calculation using torch.nn Loss function \n", 959 | " loss = loss_fn(y_pred, y)\n", 960 | " if i%10==0:\n", 961 | " print(i, loss.data[0])\n", 962 | " \n", 963 | " # Backward pass\n", 964 | " loss.backward()\n", 965 | " \n", 966 | " # Using Learning rule with optim \n", 967 | " optimizer.step()\n", 968 | " \n", 969 | " # SGD learning rule without optim \n", 970 | "# for param in model.parameters():\n", 971 | "# param.data -= learning_rate*param.grad.data\n", 972 | " \n", 973 | "# w1.data -= learning_rate*w1.grad.data\n", 974 | "# w2.data -= learning_rate*w2.grad.data\n", 975 | " \n", 976 | " # Setting gradient to zero\n", 977 | " model.zero_grad()" 978 | ] 979 | }, 980 | { 981 | "cell_type": "code", 982 | "execution_count": null, 983 | "metadata": { 984 | "collapsed": true 985 | }, 986 | "outputs": [], 987 | "source": [] 988 | }, 989 | { 990 | "cell_type": "code", 991 | "execution_count": null, 992 | "metadata": { 993 | "collapsed": true 994 | }, 995 | "outputs": [], 996 | "source": [] 997 | }, 998 | { 999 | "cell_type": "code", 1000 | "execution_count": null, 1001 | "metadata": { 1002 | "collapsed": true 1003 | }, 1004 | "outputs": [], 1005 | "source": [] 1006 | }, 1007 | { 1008 | "cell_type": "code", 1009 | "execution_count": null, 1010 | "metadata": { 1011 | "collapsed": true 1012 | }, 1013 | "outputs": [], 1014 | "source": [] 1015 | }, 1016 | { 1017 | "cell_type": "code", 1018 | "execution_count": null, 1019 | "metadata": { 1020 | "collapsed": true 1021 | }, 1022 | "outputs": [], 1023 | "source": [] 1024 | }, 1025 | { 1026 | "cell_type": "markdown", 1027 | "metadata": {}, 1028 | "source": [ 1029 | "# NN + Optim " 1030 | ] 1031 | }, 1032 | { 1033 | "cell_type": "markdown", 1034 | "metadata": {}, 1035 | "source": [ 1036 | "The nn package defines a set of Modules, which are roughly equivalent to neural network layers. \n", 1037 | "\n", 1038 | "A Module receives input Variables and computes output Variables, but may also hold internal state such as Variables containing learnable parameters. \n", 1039 | "\n", 1040 | "The nn package also defines a set of useful loss functions that are commonly used when training neural networks." 1041 | ] 1042 | }, 1043 | { 1044 | "cell_type": "code", 1045 | "execution_count": 26, 1046 | "metadata": { 1047 | "collapsed": true 1048 | }, 1049 | "outputs": [], 1050 | "source": [ 1051 | "from torch.autograd import Variable" 1052 | ] 1053 | }, 1054 | { 1055 | "cell_type": "code", 1056 | "execution_count": 27, 1057 | "metadata": { 1058 | "collapsed": true 1059 | }, 1060 | "outputs": [], 1061 | "source": [ 1062 | "N, D_in, H, D_out = 64, 1000, 100, 10" 1063 | ] 1064 | }, 1065 | { 1066 | "cell_type": "code", 1067 | "execution_count": 37, 1068 | "metadata": { 1069 | "collapsed": true 1070 | }, 1071 | "outputs": [], 1072 | "source": [ 1073 | "x = Variable(torch.randn(N, D_in), requires_grad=False)\n", 1074 | "y = Variable(torch.randn(N, D_out), requires_grad=False)" 1075 | ] 1076 | }, 1077 | { 1078 | "cell_type": "code", 1079 | "execution_count": 38, 1080 | "metadata": { 1081 | "collapsed": true 1082 | }, 1083 | "outputs": [], 1084 | "source": [ 1085 | "model = torch.nn.Sequential(\n", 1086 | " torch.nn.Linear(D_in, H),\n", 1087 | " torch.nn.ReLU(),\n", 1088 | " torch.nn.Linear(H, D_out),\n", 1089 | ")" 1090 | ] 1091 | }, 1092 | { 1093 | "cell_type": "code", 1094 | "execution_count": 39, 1095 | "metadata": { 1096 | "collapsed": false 1097 | }, 1098 | "outputs": [], 1099 | "source": [ 1100 | "# list(model.parameters())" 1101 | ] 1102 | }, 1103 | { 1104 | "cell_type": "code", 1105 | "execution_count": 40, 1106 | "metadata": { 1107 | "collapsed": true 1108 | }, 1109 | "outputs": [], 1110 | "source": [ 1111 | "loss_fn = torch.nn.MSELoss(size_average=False)" 1112 | ] 1113 | }, 1114 | { 1115 | "cell_type": "markdown", 1116 | "metadata": {}, 1117 | "source": [ 1118 | "Forward pass" 1119 | ] 1120 | }, 1121 | { 1122 | "cell_type": "code", 1123 | "execution_count": 41, 1124 | "metadata": { 1125 | "collapsed": true 1126 | }, 1127 | "outputs": [], 1128 | "source": [ 1129 | "y_pred = model(x)" 1130 | ] 1131 | }, 1132 | { 1133 | "cell_type": "code", 1134 | "execution_count": 44, 1135 | "metadata": { 1136 | "collapsed": false 1137 | }, 1138 | "outputs": [], 1139 | "source": [ 1140 | "loss = loss_fn(y_pred, y)" 1141 | ] 1142 | }, 1143 | { 1144 | "cell_type": "code", 1145 | "execution_count": 45, 1146 | "metadata": { 1147 | "collapsed": true 1148 | }, 1149 | "outputs": [], 1150 | "source": [ 1151 | "loss.backward()" 1152 | ] 1153 | }, 1154 | { 1155 | "cell_type": "code", 1156 | "execution_count": null, 1157 | "metadata": { 1158 | "collapsed": true 1159 | }, 1160 | "outputs": [], 1161 | "source": [] 1162 | }, 1163 | { 1164 | "cell_type": "code", 1165 | "execution_count": null, 1166 | "metadata": { 1167 | "collapsed": true 1168 | }, 1169 | "outputs": [], 1170 | "source": [ 1171 | "for param in model.parameters():\n", 1172 | " param.data -= learning_rate * param.grad.data" 1173 | ] 1174 | }, 1175 | { 1176 | "cell_type": "code", 1177 | "execution_count": null, 1178 | "metadata": { 1179 | "collapsed": true 1180 | }, 1181 | "outputs": [], 1182 | "source": [] 1183 | }, 1184 | { 1185 | "cell_type": "code", 1186 | "execution_count": null, 1187 | "metadata": { 1188 | "collapsed": true 1189 | }, 1190 | "outputs": [], 1191 | "source": [] 1192 | }, 1193 | { 1194 | "cell_type": "code", 1195 | "execution_count": 58, 1196 | "metadata": { 1197 | "collapsed": true 1198 | }, 1199 | "outputs": [], 1200 | "source": [ 1201 | "loss_fn = torch.nn.MSELoss(size_average=False)" 1202 | ] 1203 | }, 1204 | { 1205 | "cell_type": "code", 1206 | "execution_count": 59, 1207 | "metadata": { 1208 | "collapsed": true 1209 | }, 1210 | "outputs": [], 1211 | "source": [ 1212 | "learning_rate = 1e-4" 1213 | ] 1214 | }, 1215 | { 1216 | "cell_type": "markdown", 1217 | "metadata": {}, 1218 | "source": [ 1219 | "Forward pass" 1220 | ] 1221 | }, 1222 | { 1223 | "cell_type": "code", 1224 | "execution_count": 60, 1225 | "metadata": { 1226 | "collapsed": true 1227 | }, 1228 | "outputs": [], 1229 | "source": [ 1230 | "y_pred = model(x)" 1231 | ] 1232 | }, 1233 | { 1234 | "cell_type": "code", 1235 | "execution_count": 61, 1236 | "metadata": { 1237 | "collapsed": true 1238 | }, 1239 | "outputs": [], 1240 | "source": [ 1241 | "loss = loss_fn(y_pred, y)" 1242 | ] 1243 | }, 1244 | { 1245 | "cell_type": "code", 1246 | "execution_count": 62, 1247 | "metadata": { 1248 | "collapsed": false 1249 | }, 1250 | "outputs": [ 1251 | { 1252 | "data": { 1253 | "text/plain": [ 1254 | "Variable containing:\n", 1255 | " 686.5364\n", 1256 | "[torch.FloatTensor of size 1]" 1257 | ] 1258 | }, 1259 | "execution_count": 62, 1260 | "metadata": {}, 1261 | "output_type": "execute_result" 1262 | } 1263 | ], 1264 | "source": [ 1265 | "loss" 1266 | ] 1267 | }, 1268 | { 1269 | "cell_type": "markdown", 1270 | "metadata": {}, 1271 | "source": [ 1272 | " Important \n", 1273 | "\n", 1274 | "Zero the gradients before running the backward pass." 1275 | ] 1276 | }, 1277 | { 1278 | "cell_type": "code", 1279 | "execution_count": 43, 1280 | "metadata": { 1281 | "collapsed": true 1282 | }, 1283 | "outputs": [], 1284 | "source": [ 1285 | "model.zero_grad()" 1286 | ] 1287 | }, 1288 | { 1289 | "cell_type": "markdown", 1290 | "metadata": {}, 1291 | "source": [ 1292 | "Backward pass" 1293 | ] 1294 | }, 1295 | { 1296 | "cell_type": "code", 1297 | "execution_count": 44, 1298 | "metadata": { 1299 | "collapsed": true 1300 | }, 1301 | "outputs": [], 1302 | "source": [ 1303 | "loss.backward()" 1304 | ] 1305 | }, 1306 | { 1307 | "cell_type": "code", 1308 | "execution_count": 48, 1309 | "metadata": { 1310 | "collapsed": false 1311 | }, 1312 | "outputs": [], 1313 | "source": [ 1314 | "for param in model.parameters():\n", 1315 | " param.data -= learning_rate * param.grad.data" 1316 | ] 1317 | }, 1318 | { 1319 | "cell_type": "markdown", 1320 | "metadata": {}, 1321 | "source": [ 1322 | "# Using optim : Advanced optimization functions" 1323 | ] 1324 | }, 1325 | { 1326 | "cell_type": "code", 1327 | "execution_count": 48, 1328 | "metadata": { 1329 | "collapsed": false 1330 | }, 1331 | "outputs": [], 1332 | "source": [ 1333 | "optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)" 1334 | ] 1335 | }, 1336 | { 1337 | "cell_type": "markdown", 1338 | "metadata": {}, 1339 | "source": [ 1340 | "Make gradients zero as before" 1341 | ] 1342 | }, 1343 | { 1344 | "cell_type": "code", 1345 | "execution_count": 49, 1346 | "metadata": { 1347 | "collapsed": true 1348 | }, 1349 | "outputs": [], 1350 | "source": [ 1351 | " optimizer.zero_grad()" 1352 | ] 1353 | }, 1354 | { 1355 | "cell_type": "markdown", 1356 | "metadata": {}, 1357 | "source": [ 1358 | "Backward pass" 1359 | ] 1360 | }, 1361 | { 1362 | "cell_type": "code", 1363 | "execution_count": 65, 1364 | "metadata": { 1365 | "collapsed": false 1366 | }, 1367 | "outputs": [], 1368 | "source": [ 1369 | "loss.backward()" 1370 | ] 1371 | }, 1372 | { 1373 | "cell_type": "markdown", 1374 | "metadata": {}, 1375 | "source": [ 1376 | " Update parameters of learning algorithm " 1377 | ] 1378 | }, 1379 | { 1380 | "cell_type": "code", 1381 | "execution_count": 50, 1382 | "metadata": { 1383 | "collapsed": true 1384 | }, 1385 | "outputs": [], 1386 | "source": [ 1387 | " optimizer.step()" 1388 | ] 1389 | }, 1390 | { 1391 | "cell_type": "code", 1392 | "execution_count": 51, 1393 | "metadata": { 1394 | "collapsed": true 1395 | }, 1396 | "outputs": [], 1397 | "source": [ 1398 | "N, D_in, H, D_out = 64, 1000, 100, 10\n", 1399 | "\n", 1400 | "x = Variable(torch.randn(N, D_in), requires_grad=False)\n", 1401 | "y = Variable(torch.randn(N, D_out), requires_grad=False)\n", 1402 | "\n", 1403 | "model = torch.nn.Sequential(\n", 1404 | " torch.nn.Linear(D_in, H),\n", 1405 | " torch.nn.ReLU(),\n", 1406 | " torch.nn.Linear(H, D_out),\n", 1407 | ")\n", 1408 | "\n", 1409 | "loss_fn = torch.nn.MSELoss(size_average=False)\n", 1410 | "\n", 1411 | "optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)\n", 1412 | "\n", 1413 | "for i in range(500):\n", 1414 | " # Forward pass\n", 1415 | " y_pred = model(x)\n", 1416 | " \n", 1417 | " # Calculate loss\n", 1418 | " loss = loss_fn(y_pred, y)\n", 1419 | " \n", 1420 | " optimizer.zero_grad()\n", 1421 | " \n", 1422 | " # Backward pass\n", 1423 | " loss.backward()\n", 1424 | " \n", 1425 | " # Learning rule to update my parameters\n", 1426 | " optimizer.step()" 1427 | ] 1428 | }, 1429 | { 1430 | "cell_type": "code", 1431 | "execution_count": null, 1432 | "metadata": { 1433 | "collapsed": true 1434 | }, 1435 | "outputs": [], 1436 | "source": [] 1437 | }, 1438 | { 1439 | "cell_type": "code", 1440 | "execution_count": null, 1441 | "metadata": { 1442 | "collapsed": true 1443 | }, 1444 | "outputs": [], 1445 | "source": [] 1446 | } 1447 | ], 1448 | "metadata": { 1449 | "anaconda-cloud": {}, 1450 | "kernelspec": { 1451 | "display_name": "Python [conda root]", 1452 | "language": "python", 1453 | "name": "conda-root-py" 1454 | }, 1455 | "language_info": { 1456 | "codemirror_mode": { 1457 | "name": "ipython", 1458 | "version": 3 1459 | }, 1460 | "file_extension": ".py", 1461 | "mimetype": "text/x-python", 1462 | "name": "python", 1463 | "nbconvert_exporter": "python", 1464 | "pygments_lexer": "ipython3", 1465 | "version": "3.5.2" 1466 | } 1467 | }, 1468 | "nbformat": 4, 1469 | "nbformat_minor": 2 1470 | } 1471 | -------------------------------------------------------------------------------- /Getting started with Pytorch.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | " Installing Pytorch " 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 3, 13 | "metadata": { 14 | "collapsed": true 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "# !conda install -c soumith pytorch -y" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 1, 24 | "metadata": { 25 | "collapsed": true 26 | }, 27 | "outputs": [], 28 | "source": [ 29 | "import torch\n", 30 | "import numpy as np" 31 | ] 32 | }, 33 | { 34 | "cell_type": "markdown", 35 | "metadata": {}, 36 | "source": [ 37 | "# Tensors" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": {}, 43 | "source": [ 44 | "Create a tensor of size (4 x 6) :" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 2, 50 | "metadata": { 51 | "collapsed": false 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "a_np = np.ones((4,6))" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 3, 61 | "metadata": { 62 | "collapsed": false 63 | }, 64 | "outputs": [ 65 | { 66 | "data": { 67 | "text/plain": [ 68 | "\n", 69 | " 1 1 1 1 1 1\n", 70 | " 1 1 1 1 1 1\n", 71 | " 1 1 1 1 1 1\n", 72 | " 1 1 1 1 1 1\n", 73 | "[torch.FloatTensor of size 4x6]" 74 | ] 75 | }, 76 | "execution_count": 3, 77 | "metadata": {}, 78 | "output_type": "execute_result" 79 | } 80 | ], 81 | "source": [ 82 | "torch.ones(4,6)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 4, 88 | "metadata": { 89 | "collapsed": false 90 | }, 91 | "outputs": [ 92 | { 93 | "data": { 94 | "text/plain": [ 95 | "\n", 96 | " 0 0 0 0 0 0\n", 97 | " 0 0 0 0 0 0\n", 98 | " 0 0 0 0 0 0\n", 99 | " 0 0 0 0 0 0\n", 100 | "[torch.FloatTensor of size 4x6]" 101 | ] 102 | }, 103 | "execution_count": 4, 104 | "metadata": {}, 105 | "output_type": "execute_result" 106 | } 107 | ], 108 | "source": [ 109 | "torch.zeros(4,6)" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": 5, 115 | "metadata": { 116 | "collapsed": true 117 | }, 118 | "outputs": [], 119 | "source": [ 120 | "a = torch.FloatTensor(3,5)" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 6, 126 | "metadata": { 127 | "collapsed": false 128 | }, 129 | "outputs": [ 130 | { 131 | "data": { 132 | "text/plain": [ 133 | "\n", 134 | " 5 5 5 5 5\n", 135 | " 5 5 5 5 5\n", 136 | " 5 5 5 5 5\n", 137 | "[torch.FloatTensor of size 3x5]" 138 | ] 139 | }, 140 | "execution_count": 6, 141 | "metadata": {}, 142 | "output_type": "execute_result" 143 | } 144 | ], 145 | "source": [ 146 | "a.fill_(5.)" 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 7, 152 | "metadata": { 153 | "collapsed": false 154 | }, 155 | "outputs": [ 156 | { 157 | "data": { 158 | "text/plain": [ 159 | "\n", 160 | " 6 6 6 6 6 6\n", 161 | " 6 6 6 6 6 6\n", 162 | " 6 6 6 6 6 6\n", 163 | " 6 6 6 6 6 6\n", 164 | "[torch.FloatTensor of size 4x6]" 165 | ] 166 | }, 167 | "execution_count": 7, 168 | "metadata": {}, 169 | "output_type": "execute_result" 170 | } 171 | ], 172 | "source": [ 173 | "b = torch.zeros(4,6)\n", 174 | "b.fill_(6)" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 8, 180 | "metadata": { 181 | "collapsed": false 182 | }, 183 | "outputs": [ 184 | { 185 | "data": { 186 | "text/plain": [ 187 | "\n", 188 | " 6 6 6 6 6 6\n", 189 | " 6 6 6 6 6 6\n", 190 | " 6 6 6 6 6 6\n", 191 | " 6 6 6 6 6 6\n", 192 | "[torch.FloatTensor of size 4x6]" 193 | ] 194 | }, 195 | "execution_count": 8, 196 | "metadata": {}, 197 | "output_type": "execute_result" 198 | } 199 | ], 200 | "source": [ 201 | "b" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": 9, 207 | "metadata": { 208 | "collapsed": false 209 | }, 210 | "outputs": [ 211 | { 212 | "data": { 213 | "text/plain": [ 214 | "array([[ 2., 2., 2., 2., 2., 2.],\n", 215 | " [ 2., 2., 2., 2., 2., 2.],\n", 216 | " [ 2., 2., 2., 2., 2., 2.],\n", 217 | " [ 2., 2., 2., 2., 2., 2.]])" 218 | ] 219 | }, 220 | "execution_count": 9, 221 | "metadata": {}, 222 | "output_type": "execute_result" 223 | } 224 | ], 225 | "source": [ 226 | "a_np + 1" 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": {}, 232 | "source": [ 233 | " In-place/ out-of-place operations " 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": 10, 239 | "metadata": { 240 | "collapsed": false 241 | }, 242 | "outputs": [ 243 | { 244 | "data": { 245 | "text/plain": [ 246 | "\n", 247 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 248 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 249 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 250 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 251 | "[torch.FloatTensor of size 4x6]" 252 | ] 253 | }, 254 | "execution_count": 10, 255 | "metadata": {}, 256 | "output_type": "execute_result" 257 | } 258 | ], 259 | "source": [ 260 | "b.div(7)" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": 11, 266 | "metadata": { 267 | "collapsed": false 268 | }, 269 | "outputs": [ 270 | { 271 | "data": { 272 | "text/plain": [ 273 | "\n", 274 | " 6 6 6 6 6 6\n", 275 | " 6 6 6 6 6 6\n", 276 | " 6 6 6 6 6 6\n", 277 | " 6 6 6 6 6 6\n", 278 | "[torch.FloatTensor of size 4x6]" 279 | ] 280 | }, 281 | "execution_count": 11, 282 | "metadata": {}, 283 | "output_type": "execute_result" 284 | } 285 | ], 286 | "source": [ 287 | "b" 288 | ] 289 | }, 290 | { 291 | "cell_type": "code", 292 | "execution_count": 12, 293 | "metadata": { 294 | "collapsed": false 295 | }, 296 | "outputs": [ 297 | { 298 | "data": { 299 | "text/plain": [ 300 | "\n", 301 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 302 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 303 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 304 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 305 | "[torch.FloatTensor of size 4x6]" 306 | ] 307 | }, 308 | "execution_count": 12, 309 | "metadata": {}, 310 | "output_type": "execute_result" 311 | } 312 | ], 313 | "source": [ 314 | "b.div_(7)" 315 | ] 316 | }, 317 | { 318 | "cell_type": "code", 319 | "execution_count": 13, 320 | "metadata": { 321 | "collapsed": false 322 | }, 323 | "outputs": [ 324 | { 325 | "data": { 326 | "text/plain": [ 327 | "\n", 328 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 329 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 330 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 331 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 332 | "[torch.FloatTensor of size 4x6]" 333 | ] 334 | }, 335 | "execution_count": 13, 336 | "metadata": {}, 337 | "output_type": "execute_result" 338 | } 339 | ], 340 | "source": [ 341 | "b" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": 14, 347 | "metadata": { 348 | "collapsed": false 349 | }, 350 | "outputs": [ 351 | { 352 | "data": { 353 | "text/plain": [ 354 | "\n", 355 | " 2.5714 2.5714 2.5714 2.5714 2.5714 2.5714\n", 356 | " 2.5714 2.5714 2.5714 2.5714 2.5714 2.5714\n", 357 | " 2.5714 2.5714 2.5714 2.5714 2.5714 2.5714\n", 358 | " 2.5714 2.5714 2.5714 2.5714 2.5714 2.5714\n", 359 | "[torch.FloatTensor of size 4x6]" 360 | ] 361 | }, 362 | "execution_count": 14, 363 | "metadata": {}, 364 | "output_type": "execute_result" 365 | } 366 | ], 367 | "source": [ 368 | "b.mul(3)" 369 | ] 370 | }, 371 | { 372 | "cell_type": "code", 373 | "execution_count": 15, 374 | "metadata": { 375 | "collapsed": false 376 | }, 377 | "outputs": [ 378 | { 379 | "data": { 380 | "text/plain": [ 381 | "\n", 382 | " 11.3571 11.3571 11.3571 11.3571 11.3571 11.3571\n", 383 | " 11.3571 11.3571 11.3571 11.3571 11.3571 11.3571\n", 384 | " 11.3571 11.3571 11.3571 11.3571 11.3571 11.3571\n", 385 | " 11.3571 11.3571 11.3571 11.3571 11.3571 11.3571\n", 386 | "[torch.FloatTensor of size 4x6]" 387 | ] 388 | }, 389 | "execution_count": 15, 390 | "metadata": {}, 391 | "output_type": "execute_result" 392 | } 393 | ], 394 | "source": [ 395 | "b.add(10.5)" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "execution_count": 16, 401 | "metadata": { 402 | "collapsed": false 403 | }, 404 | "outputs": [ 405 | { 406 | "data": { 407 | "text/plain": [ 408 | "\n", 409 | "-1.1429 -1.1429 -1.1429 -1.1429 -1.1429 -1.1429\n", 410 | "-1.1429 -1.1429 -1.1429 -1.1429 -1.1429 -1.1429\n", 411 | "-1.1429 -1.1429 -1.1429 -1.1429 -1.1429 -1.1429\n", 412 | "-1.1429 -1.1429 -1.1429 -1.1429 -1.1429 -1.1429\n", 413 | "[torch.FloatTensor of size 4x6]" 414 | ] 415 | }, 416 | "execution_count": 16, 417 | "metadata": {}, 418 | "output_type": "execute_result" 419 | } 420 | ], 421 | "source": [ 422 | "b.sub(2)" 423 | ] 424 | }, 425 | { 426 | "cell_type": "code", 427 | "execution_count": 17, 428 | "metadata": { 429 | "collapsed": false 430 | }, 431 | "outputs": [ 432 | { 433 | "data": { 434 | "text/plain": [ 435 | "\n", 436 | " 0.8571 0.8571 0.8571 0.8571\n", 437 | " 0.8571 0.8571 0.8571 0.8571\n", 438 | " 0.8571 0.8571 0.8571 0.8571\n", 439 | " 0.8571 0.8571 0.8571 0.8571\n", 440 | " 0.8571 0.8571 0.8571 0.8571\n", 441 | " 0.8571 0.8571 0.8571 0.8571\n", 442 | "[torch.FloatTensor of size 6x4]" 443 | ] 444 | }, 445 | "execution_count": 17, 446 | "metadata": {}, 447 | "output_type": "execute_result" 448 | } 449 | ], 450 | "source": [ 451 | "b.transpose(0,1)" 452 | ] 453 | }, 454 | { 455 | "cell_type": "code", 456 | "execution_count": 18, 457 | "metadata": { 458 | "collapsed": true 459 | }, 460 | "outputs": [], 461 | "source": [ 462 | "c = torch.rand(3,4)" 463 | ] 464 | }, 465 | { 466 | "cell_type": "code", 467 | "execution_count": 19, 468 | "metadata": { 469 | "collapsed": false 470 | }, 471 | "outputs": [ 472 | { 473 | "data": { 474 | "text/plain": [ 475 | "\n", 476 | " 0.0874 0.9883 0.3925 0.4450\n", 477 | " 0.9754 0.7935 0.2538 0.9031\n", 478 | " 0.5353 0.5305 0.5907 0.2758\n", 479 | "[torch.FloatTensor of size 3x4]" 480 | ] 481 | }, 482 | "execution_count": 19, 483 | "metadata": {}, 484 | "output_type": "execute_result" 485 | } 486 | ], 487 | "source": [ 488 | "c" 489 | ] 490 | }, 491 | { 492 | "cell_type": "code", 493 | "execution_count": 20, 494 | "metadata": { 495 | "collapsed": false 496 | }, 497 | "outputs": [ 498 | { 499 | "data": { 500 | "text/plain": [ 501 | "0.0873919129371643" 502 | ] 503 | }, 504 | "execution_count": 20, 505 | "metadata": {}, 506 | "output_type": "execute_result" 507 | } 508 | ], 509 | "source": [ 510 | "c.min()" 511 | ] 512 | }, 513 | { 514 | "cell_type": "code", 515 | "execution_count": 21, 516 | "metadata": { 517 | "collapsed": false 518 | }, 519 | "outputs": [ 520 | { 521 | "data": { 522 | "text/plain": [ 523 | "0.9883310794830322" 524 | ] 525 | }, 526 | "execution_count": 21, 527 | "metadata": {}, 528 | "output_type": "execute_result" 529 | } 530 | ], 531 | "source": [ 532 | "c.max()" 533 | ] 534 | }, 535 | { 536 | "cell_type": "code", 537 | "execution_count": 22, 538 | "metadata": { 539 | "collapsed": false 540 | }, 541 | "outputs": [ 542 | { 543 | "data": { 544 | "text/plain": [ 545 | "0.5642791489760081" 546 | ] 547 | }, 548 | "execution_count": 22, 549 | "metadata": {}, 550 | "output_type": "execute_result" 551 | } 552 | ], 553 | "source": [ 554 | "c.mean()" 555 | ] 556 | }, 557 | { 558 | "cell_type": "code", 559 | "execution_count": 23, 560 | "metadata": { 561 | "collapsed": false 562 | }, 563 | "outputs": [ 564 | { 565 | "data": { 566 | "text/plain": [ 567 | "6.771349787712097" 568 | ] 569 | }, 570 | "execution_count": 23, 571 | "metadata": {}, 572 | "output_type": "execute_result" 573 | } 574 | ], 575 | "source": [ 576 | "c.sum()" 577 | ] 578 | }, 579 | { 580 | "cell_type": "code", 581 | "execution_count": 24, 582 | "metadata": { 583 | "collapsed": false 584 | }, 585 | "outputs": [ 586 | { 587 | "data": { 588 | "text/plain": [ 589 | "\n", 590 | " 1.5981\n", 591 | " 2.3124\n", 592 | " 1.2370\n", 593 | " 1.6239\n", 594 | "[torch.FloatTensor of size 4]" 595 | ] 596 | }, 597 | "execution_count": 24, 598 | "metadata": {}, 599 | "output_type": "execute_result" 600 | } 601 | ], 602 | "source": [ 603 | "c.sum(0)" 604 | ] 605 | }, 606 | { 607 | "cell_type": "code", 608 | "execution_count": 25, 609 | "metadata": { 610 | "collapsed": false 611 | }, 612 | "outputs": [ 613 | { 614 | "data": { 615 | "text/plain": [ 616 | "\n", 617 | " 1.9132\n", 618 | " 2.9258\n", 619 | " 1.9323\n", 620 | "[torch.FloatTensor of size 3]" 621 | ] 622 | }, 623 | "execution_count": 25, 624 | "metadata": {}, 625 | "output_type": "execute_result" 626 | } 627 | ], 628 | "source": [ 629 | "c.sum(1)" 630 | ] 631 | }, 632 | { 633 | "cell_type": "markdown", 634 | "metadata": {}, 635 | "source": [ 636 | " Passing by reference/value " 637 | ] 638 | }, 639 | { 640 | "cell_type": "code", 641 | "execution_count": 26, 642 | "metadata": { 643 | "collapsed": true 644 | }, 645 | "outputs": [], 646 | "source": [ 647 | "a = b" 648 | ] 649 | }, 650 | { 651 | "cell_type": "code", 652 | "execution_count": 27, 653 | "metadata": { 654 | "collapsed": false 655 | }, 656 | "outputs": [ 657 | { 658 | "data": { 659 | "text/plain": [ 660 | "\n", 661 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 662 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 663 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 664 | " 0.8571 0.8571 0.8571 0.8571 0.8571 0.8571\n", 665 | "[torch.FloatTensor of size 4x6]" 666 | ] 667 | }, 668 | "execution_count": 27, 669 | "metadata": {}, 670 | "output_type": "execute_result" 671 | } 672 | ], 673 | "source": [ 674 | "a" 675 | ] 676 | }, 677 | { 678 | "cell_type": "code", 679 | "execution_count": 28, 680 | "metadata": { 681 | "collapsed": false 682 | }, 683 | "outputs": [ 684 | { 685 | "data": { 686 | "text/plain": [ 687 | "\n", 688 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 689 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 690 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 691 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 692 | "[torch.FloatTensor of size 4x6]" 693 | ] 694 | }, 695 | "execution_count": 28, 696 | "metadata": {}, 697 | "output_type": "execute_result" 698 | } 699 | ], 700 | "source": [ 701 | "a.add_(2)" 702 | ] 703 | }, 704 | { 705 | "cell_type": "code", 706 | "execution_count": 29, 707 | "metadata": { 708 | "collapsed": false 709 | }, 710 | "outputs": [ 711 | { 712 | "data": { 713 | "text/plain": [ 714 | "\n", 715 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 716 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 717 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 718 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 719 | "[torch.FloatTensor of size 4x6]" 720 | ] 721 | }, 722 | "execution_count": 29, 723 | "metadata": {}, 724 | "output_type": "execute_result" 725 | } 726 | ], 727 | "source": [ 728 | "b" 729 | ] 730 | }, 731 | { 732 | "cell_type": "code", 733 | "execution_count": 30, 734 | "metadata": { 735 | "collapsed": true 736 | }, 737 | "outputs": [], 738 | "source": [ 739 | "a = a.add(2)" 740 | ] 741 | }, 742 | { 743 | "cell_type": "code", 744 | "execution_count": 31, 745 | "metadata": { 746 | "collapsed": false 747 | }, 748 | "outputs": [ 749 | { 750 | "data": { 751 | "text/plain": [ 752 | "\n", 753 | " 4.8571 4.8571 4.8571 4.8571 4.8571 4.8571\n", 754 | " 4.8571 4.8571 4.8571 4.8571 4.8571 4.8571\n", 755 | " 4.8571 4.8571 4.8571 4.8571 4.8571 4.8571\n", 756 | " 4.8571 4.8571 4.8571 4.8571 4.8571 4.8571\n", 757 | "[torch.FloatTensor of size 4x6]" 758 | ] 759 | }, 760 | "execution_count": 31, 761 | "metadata": {}, 762 | "output_type": "execute_result" 763 | } 764 | ], 765 | "source": [ 766 | "a" 767 | ] 768 | }, 769 | { 770 | "cell_type": "code", 771 | "execution_count": 32, 772 | "metadata": { 773 | "collapsed": false 774 | }, 775 | "outputs": [ 776 | { 777 | "data": { 778 | "text/plain": [ 779 | "\n", 780 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 781 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 782 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 783 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 784 | "[torch.FloatTensor of size 4x6]" 785 | ] 786 | }, 787 | "execution_count": 32, 788 | "metadata": {}, 789 | "output_type": "execute_result" 790 | } 791 | ], 792 | "source": [ 793 | "b" 794 | ] 795 | }, 796 | { 797 | "cell_type": "code", 798 | "execution_count": 33, 799 | "metadata": { 800 | "collapsed": true 801 | }, 802 | "outputs": [], 803 | "source": [ 804 | "c = torch.FloatTensor(4,6)" 805 | ] 806 | }, 807 | { 808 | "cell_type": "code", 809 | "execution_count": 34, 810 | "metadata": { 811 | "collapsed": false 812 | }, 813 | "outputs": [ 814 | { 815 | "data": { 816 | "text/plain": [ 817 | "\n", 818 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 819 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 820 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 821 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 822 | "[torch.FloatTensor of size 4x6]" 823 | ] 824 | }, 825 | "execution_count": 34, 826 | "metadata": {}, 827 | "output_type": "execute_result" 828 | } 829 | ], 830 | "source": [ 831 | "c.copy_(b)" 832 | ] 833 | }, 834 | { 835 | "cell_type": "code", 836 | "execution_count": 35, 837 | "metadata": { 838 | "collapsed": false 839 | }, 840 | "outputs": [ 841 | { 842 | "data": { 843 | "text/plain": [ 844 | "\n", 845 | " 65.7143 65.7143 65.7143 65.7143 65.7143 65.7143\n", 846 | " 65.7143 65.7143 65.7143 65.7143 65.7143 65.7143\n", 847 | " 65.7143 65.7143 65.7143 65.7143 65.7143 65.7143\n", 848 | " 65.7143 65.7143 65.7143 65.7143 65.7143 65.7143\n", 849 | "[torch.FloatTensor of size 4x6]" 850 | ] 851 | }, 852 | "execution_count": 35, 853 | "metadata": {}, 854 | "output_type": "execute_result" 855 | } 856 | ], 857 | "source": [ 858 | "c.mul_(23)" 859 | ] 860 | }, 861 | { 862 | "cell_type": "code", 863 | "execution_count": 36, 864 | "metadata": { 865 | "collapsed": false 866 | }, 867 | "outputs": [ 868 | { 869 | "data": { 870 | "text/plain": [ 871 | "\n", 872 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 873 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 874 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 875 | " 2.8571 2.8571 2.8571 2.8571 2.8571 2.8571\n", 876 | "[torch.FloatTensor of size 4x6]" 877 | ] 878 | }, 879 | "execution_count": 36, 880 | "metadata": {}, 881 | "output_type": "execute_result" 882 | } 883 | ], 884 | "source": [ 885 | "b" 886 | ] 887 | }, 888 | { 889 | "cell_type": "markdown", 890 | "metadata": {}, 891 | "source": [ 892 | " Indexing and slicing " 893 | ] 894 | }, 895 | { 896 | "cell_type": "code", 897 | "execution_count": 37, 898 | "metadata": { 899 | "collapsed": false 900 | }, 901 | "outputs": [ 902 | { 903 | "data": { 904 | "text/plain": [ 905 | "2.857142925262451" 906 | ] 907 | }, 908 | "execution_count": 37, 909 | "metadata": {}, 910 | "output_type": "execute_result" 911 | } 912 | ], 913 | "source": [ 914 | "b[0,2]" 915 | ] 916 | }, 917 | { 918 | "cell_type": "code", 919 | "execution_count": 38, 920 | "metadata": { 921 | "collapsed": false 922 | }, 923 | "outputs": [], 924 | "source": [ 925 | "b[:,1] = 5" 926 | ] 927 | }, 928 | { 929 | "cell_type": "code", 930 | "execution_count": 39, 931 | "metadata": { 932 | "collapsed": false 933 | }, 934 | "outputs": [ 935 | { 936 | "data": { 937 | "text/plain": [ 938 | "\n", 939 | " 2.8571 5.0000 2.8571 2.8571 2.8571 2.8571\n", 940 | " 2.8571 5.0000 2.8571 2.8571 2.8571 2.8571\n", 941 | " 2.8571 5.0000 2.8571 2.8571 2.8571 2.8571\n", 942 | " 2.8571 5.0000 2.8571 2.8571 2.8571 2.8571\n", 943 | "[torch.FloatTensor of size 4x6]" 944 | ] 945 | }, 946 | "execution_count": 39, 947 | "metadata": {}, 948 | "output_type": "execute_result" 949 | } 950 | ], 951 | "source": [ 952 | "b" 953 | ] 954 | }, 955 | { 956 | "cell_type": "code", 957 | "execution_count": 40, 958 | "metadata": { 959 | "collapsed": true 960 | }, 961 | "outputs": [], 962 | "source": [ 963 | "b[1:3,2:4] = 10" 964 | ] 965 | }, 966 | { 967 | "cell_type": "code", 968 | "execution_count": 41, 969 | "metadata": { 970 | "collapsed": false 971 | }, 972 | "outputs": [ 973 | { 974 | "data": { 975 | "text/plain": [ 976 | "\n", 977 | " 2.8571 5.0000 2.8571 2.8571 2.8571 2.8571\n", 978 | " 2.8571 5.0000 10.0000 10.0000 2.8571 2.8571\n", 979 | " 2.8571 5.0000 10.0000 10.0000 2.8571 2.8571\n", 980 | " 2.8571 5.0000 2.8571 2.8571 2.8571 2.8571\n", 981 | "[torch.FloatTensor of size 4x6]" 982 | ] 983 | }, 984 | "execution_count": 41, 985 | "metadata": {}, 986 | "output_type": "execute_result" 987 | } 988 | ], 989 | "source": [ 990 | "b" 991 | ] 992 | }, 993 | { 994 | "cell_type": "markdown", 995 | "metadata": {}, 996 | "source": [ 997 | " Numpy array <-> Torch tensor " 998 | ] 999 | }, 1000 | { 1001 | "cell_type": "code", 1002 | "execution_count": 42, 1003 | "metadata": { 1004 | "collapsed": false 1005 | }, 1006 | "outputs": [ 1007 | { 1008 | "data": { 1009 | "text/plain": [ 1010 | "torch.FloatTensor" 1011 | ] 1012 | }, 1013 | "execution_count": 42, 1014 | "metadata": {}, 1015 | "output_type": "execute_result" 1016 | } 1017 | ], 1018 | "source": [ 1019 | "type(b)" 1020 | ] 1021 | }, 1022 | { 1023 | "cell_type": "code", 1024 | "execution_count": 43, 1025 | "metadata": { 1026 | "collapsed": false 1027 | }, 1028 | "outputs": [], 1029 | "source": [ 1030 | "b_np = b.numpy()" 1031 | ] 1032 | }, 1033 | { 1034 | "cell_type": "code", 1035 | "execution_count": 44, 1036 | "metadata": { 1037 | "collapsed": false 1038 | }, 1039 | "outputs": [ 1040 | { 1041 | "data": { 1042 | "text/plain": [ 1043 | "array([[ 2.85714293, 5. , 2.85714293, 2.85714293,\n", 1044 | " 2.85714293, 2.85714293],\n", 1045 | " [ 2.85714293, 5. , 10. , 10. ,\n", 1046 | " 2.85714293, 2.85714293],\n", 1047 | " [ 2.85714293, 5. , 10. , 10. ,\n", 1048 | " 2.85714293, 2.85714293],\n", 1049 | " [ 2.85714293, 5. , 2.85714293, 2.85714293,\n", 1050 | " 2.85714293, 2.85714293]], dtype=float32)" 1051 | ] 1052 | }, 1053 | "execution_count": 44, 1054 | "metadata": {}, 1055 | "output_type": "execute_result" 1056 | } 1057 | ], 1058 | "source": [ 1059 | "b_np" 1060 | ] 1061 | }, 1062 | { 1063 | "cell_type": "code", 1064 | "execution_count": 45, 1065 | "metadata": { 1066 | "collapsed": false 1067 | }, 1068 | "outputs": [ 1069 | { 1070 | "data": { 1071 | "text/plain": [ 1072 | "\n", 1073 | " 1 1 1 1 1 1\n", 1074 | " 1 1 1 1 1 1\n", 1075 | " 1 1 1 1 1 1\n", 1076 | " 1 1 1 1 1 1\n", 1077 | "[torch.DoubleTensor of size 4x6]" 1078 | ] 1079 | }, 1080 | "execution_count": 45, 1081 | "metadata": {}, 1082 | "output_type": "execute_result" 1083 | } 1084 | ], 1085 | "source": [ 1086 | "torch.from_numpy(a_np)" 1087 | ] 1088 | }, 1089 | { 1090 | "cell_type": "code", 1091 | "execution_count": 46, 1092 | "metadata": { 1093 | "collapsed": false 1094 | }, 1095 | "outputs": [ 1096 | { 1097 | "data": { 1098 | "text/plain": [ 1099 | "4" 1100 | ] 1101 | }, 1102 | "execution_count": 46, 1103 | "metadata": {}, 1104 | "output_type": "execute_result" 1105 | } 1106 | ], 1107 | "source": [ 1108 | "a_np.shape[0]" 1109 | ] 1110 | }, 1111 | { 1112 | "cell_type": "code", 1113 | "execution_count": 47, 1114 | "metadata": { 1115 | "collapsed": false 1116 | }, 1117 | "outputs": [ 1118 | { 1119 | "data": { 1120 | "text/plain": [ 1121 | "4" 1122 | ] 1123 | }, 1124 | "execution_count": 47, 1125 | "metadata": {}, 1126 | "output_type": "execute_result" 1127 | } 1128 | ], 1129 | "source": [ 1130 | "a.size()[0]" 1131 | ] 1132 | }, 1133 | { 1134 | "cell_type": "markdown", 1135 | "metadata": {}, 1136 | "source": [ 1137 | " Matrix multiplication " 1138 | ] 1139 | }, 1140 | { 1141 | "cell_type": "code", 1142 | "execution_count": 48, 1143 | "metadata": { 1144 | "collapsed": true 1145 | }, 1146 | "outputs": [], 1147 | "source": [ 1148 | "a = torch.ones(4,6)\n", 1149 | "b = torch.ones(6,5)" 1150 | ] 1151 | }, 1152 | { 1153 | "cell_type": "code", 1154 | "execution_count": 49, 1155 | "metadata": { 1156 | "collapsed": false 1157 | }, 1158 | "outputs": [ 1159 | { 1160 | "data": { 1161 | "text/plain": [ 1162 | "\n", 1163 | " 6 6 6 6 6\n", 1164 | " 6 6 6 6 6\n", 1165 | " 6 6 6 6 6\n", 1166 | " 6 6 6 6 6\n", 1167 | "[torch.FloatTensor of size 4x5]" 1168 | ] 1169 | }, 1170 | "execution_count": 49, 1171 | "metadata": {}, 1172 | "output_type": "execute_result" 1173 | } 1174 | ], 1175 | "source": [ 1176 | "a.mm(b)" 1177 | ] 1178 | }, 1179 | { 1180 | "cell_type": "code", 1181 | "execution_count": 50, 1182 | "metadata": { 1183 | "collapsed": true 1184 | }, 1185 | "outputs": [], 1186 | "source": [ 1187 | "a_np = a.numpy()\n", 1188 | "b_np = b.numpy()" 1189 | ] 1190 | }, 1191 | { 1192 | "cell_type": "code", 1193 | "execution_count": 51, 1194 | "metadata": { 1195 | "collapsed": false 1196 | }, 1197 | "outputs": [ 1198 | { 1199 | "data": { 1200 | "text/plain": [ 1201 | "array([[ 6., 6., 6., 6., 6.],\n", 1202 | " [ 6., 6., 6., 6., 6.],\n", 1203 | " [ 6., 6., 6., 6., 6.],\n", 1204 | " [ 6., 6., 6., 6., 6.]], dtype=float32)" 1205 | ] 1206 | }, 1207 | "execution_count": 51, 1208 | "metadata": {}, 1209 | "output_type": "execute_result" 1210 | } 1211 | ], 1212 | "source": [ 1213 | "a_np.dot(b_np)" 1214 | ] 1215 | }, 1216 | { 1217 | "cell_type": "markdown", 1218 | "metadata": {}, 1219 | "source": [ 1220 | " Element-wise matrix operations " 1221 | ] 1222 | }, 1223 | { 1224 | "cell_type": "code", 1225 | "execution_count": 52, 1226 | "metadata": { 1227 | "collapsed": true 1228 | }, 1229 | "outputs": [], 1230 | "source": [ 1231 | "a = torch.ones(4,6)\n", 1232 | "b = torch.ones(4,6)" 1233 | ] 1234 | }, 1235 | { 1236 | "cell_type": "code", 1237 | "execution_count": 53, 1238 | "metadata": { 1239 | "collapsed": false 1240 | }, 1241 | "outputs": [ 1242 | { 1243 | "data": { 1244 | "text/plain": [ 1245 | "\n", 1246 | " 2 2 2 2 2 2\n", 1247 | " 2 2 2 2 2 2\n", 1248 | " 2 2 2 2 2 2\n", 1249 | " 2 2 2 2 2 2\n", 1250 | "[torch.FloatTensor of size 4x6]" 1251 | ] 1252 | }, 1253 | "execution_count": 53, 1254 | "metadata": {}, 1255 | "output_type": "execute_result" 1256 | } 1257 | ], 1258 | "source": [ 1259 | "a.fill_(5)\n", 1260 | "b.fill_(2)" 1261 | ] 1262 | }, 1263 | { 1264 | "cell_type": "code", 1265 | "execution_count": 54, 1266 | "metadata": { 1267 | "collapsed": false 1268 | }, 1269 | "outputs": [ 1270 | { 1271 | "data": { 1272 | "text/plain": [ 1273 | "\n", 1274 | " 7 7 7 7 7 7\n", 1275 | " 7 7 7 7 7 7\n", 1276 | " 7 7 7 7 7 7\n", 1277 | " 7 7 7 7 7 7\n", 1278 | "[torch.FloatTensor of size 4x6]" 1279 | ] 1280 | }, 1281 | "execution_count": 54, 1282 | "metadata": {}, 1283 | "output_type": "execute_result" 1284 | } 1285 | ], 1286 | "source": [ 1287 | "a + b" 1288 | ] 1289 | }, 1290 | { 1291 | "cell_type": "code", 1292 | "execution_count": 55, 1293 | "metadata": { 1294 | "collapsed": false 1295 | }, 1296 | "outputs": [ 1297 | { 1298 | "data": { 1299 | "text/plain": [ 1300 | "\n", 1301 | " 3 3 3 3 3 3\n", 1302 | " 3 3 3 3 3 3\n", 1303 | " 3 3 3 3 3 3\n", 1304 | " 3 3 3 3 3 3\n", 1305 | "[torch.FloatTensor of size 4x6]" 1306 | ] 1307 | }, 1308 | "execution_count": 55, 1309 | "metadata": {}, 1310 | "output_type": "execute_result" 1311 | } 1312 | ], 1313 | "source": [ 1314 | "a - b" 1315 | ] 1316 | }, 1317 | { 1318 | "cell_type": "code", 1319 | "execution_count": 56, 1320 | "metadata": { 1321 | "collapsed": false 1322 | }, 1323 | "outputs": [ 1324 | { 1325 | "data": { 1326 | "text/plain": [ 1327 | "\n", 1328 | " 10 10 10 10 10 10\n", 1329 | " 10 10 10 10 10 10\n", 1330 | " 10 10 10 10 10 10\n", 1331 | " 10 10 10 10 10 10\n", 1332 | "[torch.FloatTensor of size 4x6]" 1333 | ] 1334 | }, 1335 | "execution_count": 56, 1336 | "metadata": {}, 1337 | "output_type": "execute_result" 1338 | } 1339 | ], 1340 | "source": [ 1341 | "a * b" 1342 | ] 1343 | }, 1344 | { 1345 | "cell_type": "code", 1346 | "execution_count": 57, 1347 | "metadata": { 1348 | "collapsed": false 1349 | }, 1350 | "outputs": [ 1351 | { 1352 | "data": { 1353 | "text/plain": [ 1354 | "\n", 1355 | " 2.5000 2.5000 2.5000 2.5000 2.5000 2.5000\n", 1356 | " 2.5000 2.5000 2.5000 2.5000 2.5000 2.5000\n", 1357 | " 2.5000 2.5000 2.5000 2.5000 2.5000 2.5000\n", 1358 | " 2.5000 2.5000 2.5000 2.5000 2.5000 2.5000\n", 1359 | "[torch.FloatTensor of size 4x6]" 1360 | ] 1361 | }, 1362 | "execution_count": 57, 1363 | "metadata": {}, 1364 | "output_type": "execute_result" 1365 | } 1366 | ], 1367 | "source": [ 1368 | "a / b " 1369 | ] 1370 | }, 1371 | { 1372 | "cell_type": "code", 1373 | "execution_count": null, 1374 | "metadata": { 1375 | "collapsed": true 1376 | }, 1377 | "outputs": [], 1378 | "source": [] 1379 | }, 1380 | { 1381 | "cell_type": "markdown", 1382 | "metadata": {}, 1383 | "source": [ 1384 | " View function " 1385 | ] 1386 | }, 1387 | { 1388 | "cell_type": "code", 1389 | "execution_count": 58, 1390 | "metadata": { 1391 | "collapsed": false 1392 | }, 1393 | "outputs": [ 1394 | { 1395 | "name": "stderr", 1396 | "output_type": "stream", 1397 | "text": [ 1398 | "/Users/A/Softwares/anaconda3/lib/python3.5/site-packages/ipykernel/__main__.py:1: UserWarning: torch.range is deprecated in favor of torch.arange and will be removed in 0.3. Note that arange generates values in [start; end), not [start; end].\n", 1399 | " if __name__ == '__main__':\n" 1400 | ] 1401 | }, 1402 | { 1403 | "data": { 1404 | "text/plain": [ 1405 | "\n", 1406 | " 1 2 3 4 5 6\n", 1407 | " 7 8 9 10 11 12\n", 1408 | "[torch.FloatTensor of size 2x6]" 1409 | ] 1410 | }, 1411 | "execution_count": 58, 1412 | "metadata": {}, 1413 | "output_type": "execute_result" 1414 | } 1415 | ], 1416 | "source": [ 1417 | "a = torch.range(1,12)\n", 1418 | "a.view(2, 6)" 1419 | ] 1420 | }, 1421 | { 1422 | "cell_type": "code", 1423 | "execution_count": 59, 1424 | "metadata": { 1425 | "collapsed": false 1426 | }, 1427 | "outputs": [ 1428 | { 1429 | "name": "stderr", 1430 | "output_type": "stream", 1431 | "text": [ 1432 | "/Users/A/Softwares/anaconda3/lib/python3.5/site-packages/ipykernel/__main__.py:1: UserWarning: torch.range is deprecated in favor of torch.arange and will be removed in 0.3. Note that arange generates values in [start; end), not [start; end].\n", 1433 | " if __name__ == '__main__':\n" 1434 | ] 1435 | }, 1436 | { 1437 | "data": { 1438 | "text/plain": [ 1439 | "\n", 1440 | " 1 2 3 4 5 6\n", 1441 | " 7 8 9 10 11 12\n", 1442 | "[torch.FloatTensor of size 2x6]" 1443 | ] 1444 | }, 1445 | "execution_count": 59, 1446 | "metadata": {}, 1447 | "output_type": "execute_result" 1448 | } 1449 | ], 1450 | "source": [ 1451 | "torch.range(1,12).view(2,6)" 1452 | ] 1453 | }, 1454 | { 1455 | "cell_type": "code", 1456 | "execution_count": 60, 1457 | "metadata": { 1458 | "collapsed": false 1459 | }, 1460 | "outputs": [ 1461 | { 1462 | "data": { 1463 | "text/plain": [ 1464 | "\n", 1465 | " 1\n", 1466 | " 2\n", 1467 | " 3\n", 1468 | " 4\n", 1469 | " 5\n", 1470 | " 6\n", 1471 | " 7\n", 1472 | " 8\n", 1473 | " 9\n", 1474 | " 10\n", 1475 | " 11\n", 1476 | " 12\n", 1477 | "[torch.FloatTensor of size 12]" 1478 | ] 1479 | }, 1480 | "execution_count": 60, 1481 | "metadata": {}, 1482 | "output_type": "execute_result" 1483 | } 1484 | ], 1485 | "source": [ 1486 | "a" 1487 | ] 1488 | }, 1489 | { 1490 | "cell_type": "code", 1491 | "execution_count": 61, 1492 | "metadata": { 1493 | "collapsed": false 1494 | }, 1495 | "outputs": [ 1496 | { 1497 | "data": { 1498 | "text/plain": [ 1499 | "\n", 1500 | " 1 2 3\n", 1501 | " 4 5 6\n", 1502 | " 7 8 9\n", 1503 | " 10 11 12\n", 1504 | "[torch.FloatTensor of size 4x3]" 1505 | ] 1506 | }, 1507 | "execution_count": 61, 1508 | "metadata": {}, 1509 | "output_type": "execute_result" 1510 | } 1511 | ], 1512 | "source": [ 1513 | "a.view(4, 3)" 1514 | ] 1515 | }, 1516 | { 1517 | "cell_type": "code", 1518 | "execution_count": 62, 1519 | "metadata": { 1520 | "collapsed": false 1521 | }, 1522 | "outputs": [ 1523 | { 1524 | "data": { 1525 | "text/plain": [ 1526 | "\n", 1527 | " 1 2 3 4\n", 1528 | " 5 6 7 8\n", 1529 | " 9 10 11 12\n", 1530 | "[torch.FloatTensor of size 3x4]" 1531 | ] 1532 | }, 1533 | "execution_count": 62, 1534 | "metadata": {}, 1535 | "output_type": "execute_result" 1536 | } 1537 | ], 1538 | "source": [ 1539 | "a.view(3, -1)" 1540 | ] 1541 | }, 1542 | { 1543 | "cell_type": "code", 1544 | "execution_count": 63, 1545 | "metadata": { 1546 | "collapsed": false 1547 | }, 1548 | "outputs": [ 1549 | { 1550 | "data": { 1551 | "text/plain": [ 1552 | "\n", 1553 | " 1 2 3 4\n", 1554 | " 5 6 7 8\n", 1555 | " 9 10 11 12\n", 1556 | "[torch.FloatTensor of size 3x4]" 1557 | ] 1558 | }, 1559 | "execution_count": 63, 1560 | "metadata": {}, 1561 | "output_type": "execute_result" 1562 | } 1563 | ], 1564 | "source": [ 1565 | "a.view(-1,4)" 1566 | ] 1567 | }, 1568 | { 1569 | "cell_type": "code", 1570 | "execution_count": 64, 1571 | "metadata": { 1572 | "collapsed": false 1573 | }, 1574 | "outputs": [ 1575 | { 1576 | "data": { 1577 | "text/plain": [ 1578 | "torch.Size([12])" 1579 | ] 1580 | }, 1581 | "execution_count": 64, 1582 | "metadata": {}, 1583 | "output_type": "execute_result" 1584 | } 1585 | ], 1586 | "source": [ 1587 | "a.size()" 1588 | ] 1589 | }, 1590 | { 1591 | "cell_type": "code", 1592 | "execution_count": 65, 1593 | "metadata": { 1594 | "collapsed": false 1595 | }, 1596 | "outputs": [ 1597 | { 1598 | "data": { 1599 | "text/plain": [ 1600 | "\n", 1601 | " 1\n", 1602 | " 2\n", 1603 | " 3\n", 1604 | " 4\n", 1605 | " 5\n", 1606 | " 6\n", 1607 | " 7\n", 1608 | " 8\n", 1609 | " 9\n", 1610 | " 10\n", 1611 | " 11\n", 1612 | " 12\n", 1613 | "[torch.FloatTensor of size 12]" 1614 | ] 1615 | }, 1616 | "execution_count": 65, 1617 | "metadata": {}, 1618 | "output_type": "execute_result" 1619 | } 1620 | ], 1621 | "source": [ 1622 | "a" 1623 | ] 1624 | }, 1625 | { 1626 | "cell_type": "code", 1627 | "execution_count": 66, 1628 | "metadata": { 1629 | "collapsed": false 1630 | }, 1631 | "outputs": [ 1632 | { 1633 | "data": { 1634 | "text/plain": [ 1635 | "\n", 1636 | " 1 2 3 4 5 6 7 8 9 10 11 12\n", 1637 | "[torch.FloatTensor of size 1x12]" 1638 | ] 1639 | }, 1640 | "execution_count": 66, 1641 | "metadata": {}, 1642 | "output_type": "execute_result" 1643 | } 1644 | ], 1645 | "source": [ 1646 | "a.unsqueeze(0) # reshape()" 1647 | ] 1648 | }, 1649 | { 1650 | "cell_type": "code", 1651 | "execution_count": 67, 1652 | "metadata": { 1653 | "collapsed": false 1654 | }, 1655 | "outputs": [ 1656 | { 1657 | "data": { 1658 | "text/plain": [ 1659 | "\n", 1660 | " 1\n", 1661 | " 2\n", 1662 | " 3\n", 1663 | " 4\n", 1664 | " 5\n", 1665 | " 6\n", 1666 | " 7\n", 1667 | " 8\n", 1668 | " 9\n", 1669 | " 10\n", 1670 | " 11\n", 1671 | " 12\n", 1672 | "[torch.FloatTensor of size 12x1]" 1673 | ] 1674 | }, 1675 | "execution_count": 67, 1676 | "metadata": {}, 1677 | "output_type": "execute_result" 1678 | } 1679 | ], 1680 | "source": [ 1681 | "a.unsqueeze(1)" 1682 | ] 1683 | }, 1684 | { 1685 | "cell_type": "code", 1686 | "execution_count": 68, 1687 | "metadata": { 1688 | "collapsed": false 1689 | }, 1690 | "outputs": [], 1691 | "source": [ 1692 | "b = a.unsqueeze(0)" 1693 | ] 1694 | }, 1695 | { 1696 | "cell_type": "code", 1697 | "execution_count": 69, 1698 | "metadata": { 1699 | "collapsed": false 1700 | }, 1701 | "outputs": [ 1702 | { 1703 | "data": { 1704 | "text/plain": [ 1705 | "\n", 1706 | " 1 2 3 4 5 6 7 8 9 10 11 12\n", 1707 | "[torch.FloatTensor of size 1x12]" 1708 | ] 1709 | }, 1710 | "execution_count": 69, 1711 | "metadata": {}, 1712 | "output_type": "execute_result" 1713 | } 1714 | ], 1715 | "source": [ 1716 | "b" 1717 | ] 1718 | }, 1719 | { 1720 | "cell_type": "code", 1721 | "execution_count": 70, 1722 | "metadata": { 1723 | "collapsed": false 1724 | }, 1725 | "outputs": [ 1726 | { 1727 | "data": { 1728 | "text/plain": [ 1729 | "\n", 1730 | " 1\n", 1731 | " 2\n", 1732 | " 3\n", 1733 | " 4\n", 1734 | " 5\n", 1735 | " 6\n", 1736 | " 7\n", 1737 | " 8\n", 1738 | " 9\n", 1739 | " 10\n", 1740 | " 11\n", 1741 | " 12\n", 1742 | "[torch.FloatTensor of size 12]" 1743 | ] 1744 | }, 1745 | "execution_count": 70, 1746 | "metadata": {}, 1747 | "output_type": "execute_result" 1748 | } 1749 | ], 1750 | "source": [ 1751 | "b.squeeze()" 1752 | ] 1753 | } 1754 | ], 1755 | "metadata": { 1756 | "anaconda-cloud": {}, 1757 | "kernelspec": { 1758 | "display_name": "Python [conda root]", 1759 | "language": "python", 1760 | "name": "conda-root-py" 1761 | }, 1762 | "language_info": { 1763 | "codemirror_mode": { 1764 | "name": "ipython", 1765 | "version": 3 1766 | }, 1767 | "file_extension": ".py", 1768 | "mimetype": "text/x-python", 1769 | "name": "python", 1770 | "nbconvert_exporter": "python", 1771 | "pygments_lexer": "ipython3", 1772 | "version": "3.5.2" 1773 | } 1774 | }, 1775 | "nbformat": 4, 1776 | "nbformat_minor": 2 1777 | } 1778 | -------------------------------------------------------------------------------- /CNN for CIFAR-10.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Adapted from tutorials at pytorch.org" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 8, 13 | "metadata": { 14 | "collapsed": true 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "import torch\n", 19 | "import torchvision\n", 20 | "import torchvision.transforms as transforms\n", 21 | "import torch.optim as optim" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "

Data loading

" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 2, 34 | "metadata": { 35 | "collapsed": false 36 | }, 37 | "outputs": [ 38 | { 39 | "name": "stdout", 40 | "output_type": "stream", 41 | "text": [ 42 | "Files already downloaded and verified\n", 43 | "Files already downloaded and verified\n" 44 | ] 45 | } 46 | ], 47 | "source": [ 48 | "transform = transforms.Compose(\n", 49 | " [transforms.ToTensor(),\n", 50 | " transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])\n", 51 | "\n", 52 | "trainset = torchvision.datasets.CIFAR10(root='data', train=True,\n", 53 | " download=True, transform=transform)\n", 54 | "trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,\n", 55 | " shuffle=True, num_workers=2)\n", 56 | "\n", 57 | "testset = torchvision.datasets.CIFAR10(root='data', train=False,\n", 58 | " download=True, transform=transform)\n", 59 | "testloader = torch.utils.data.DataLoader(testset, batch_size=4,\n", 60 | " shuffle=False, num_workers=2)\n", 61 | "\n", 62 | "classes = ('plane', 'car', 'bird', 'cat',\n", 63 | " 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 3, 69 | "metadata": { 70 | "collapsed": false 71 | }, 72 | "outputs": [], 73 | "source": [ 74 | "import matplotlib.pyplot as plt\n", 75 | "import numpy as np\n", 76 | "\n", 77 | "# functions to show an image\n", 78 | "\n", 79 | "def imshow(img):\n", 80 | " img = img / 2 + 0.5 # unnormalize\n", 81 | " npimg = img.numpy()\n", 82 | " plt.imshow(np.transpose(npimg, (1, 2, 0)))" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 4, 88 | "metadata": { 89 | "collapsed": true 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "%matplotlib inline" 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": [ 100 | "

Define network

" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 49, 106 | "metadata": { 107 | "collapsed": true 108 | }, 109 | "outputs": [], 110 | "source": [ 111 | "import torch.nn as nn\n", 112 | "import torch.nn.functional as F\n", 113 | "\n", 114 | "\n", 115 | "class Net(nn.Module):\n", 116 | "\n", 117 | " def __init__(self):\n", 118 | " super(Net, self).__init__()\n", 119 | " self.conv1 = nn.Conv2d(3, 6, 5)\n", 120 | " self.conv2 = nn.Conv2d(6, 16, 5)\n", 121 | " self.fc1 = nn.Linear(16 * 5 * 5, 120)\n", 122 | " self.fc2 = nn.Linear(120, 84)\n", 123 | " self.fc3 = nn.Linear(84, 10)\n", 124 | "\n", 125 | " def forward(self, x):\n", 126 | " x = self.conv1(x)\n", 127 | " x = F.relu(x)\n", 128 | " x = F.max_pool2d(x, (2, 2))\n", 129 | " x = self.conv2(x)\n", 130 | " x = F.relu(x)\n", 131 | " x = F.max_pool2d(x, (2, 2))\n", 132 | " x = x.view(-1, self.num_flat_features(x))\n", 133 | " x = self.fc1(x)\n", 134 | " x = F.relu(x)\n", 135 | " x = self.fc2(x)\n", 136 | " x = F.relu(x)\n", 137 | " x = self.fc3(x)\n", 138 | " return x\n", 139 | "\n", 140 | " def num_flat_features(self, x):\n", 141 | " size = x.size()[1:] # all dimensions except the batch dimension\n", 142 | " num_features = 1\n", 143 | " for s in size:\n", 144 | " num_features *= s\n", 145 | " return num_features" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 6, 151 | "metadata": { 152 | "collapsed": true 153 | }, 154 | "outputs": [], 155 | "source": [ 156 | "net = Net()" 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 7, 162 | "metadata": { 163 | "collapsed": false 164 | }, 165 | "outputs": [ 166 | { 167 | "data": { 168 | "text/plain": [ 169 | "Net(\n", 170 | " (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\n", 171 | " (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\n", 172 | " (fc1): Linear(in_features=400, out_features=120, bias=True)\n", 173 | " (fc2): Linear(in_features=120, out_features=84, bias=True)\n", 174 | " (fc3): Linear(in_features=84, out_features=10, bias=True)\n", 175 | ")" 176 | ] 177 | }, 178 | "execution_count": 7, 179 | "metadata": {}, 180 | "output_type": "execute_result" 181 | } 182 | ], 183 | "source": [ 184 | "net" 185 | ] 186 | }, 187 | { 188 | "cell_type": "markdown", 189 | "metadata": {}, 190 | "source": [ 191 | "

Define loss and learning rule

" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": 10, 197 | "metadata": { 198 | "collapsed": true 199 | }, 200 | "outputs": [], 201 | "source": [ 202 | "criterion = nn.CrossEntropyLoss()\n", 203 | "optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": {}, 209 | "source": [ 210 | "

Training

" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 12, 216 | "metadata": { 217 | "collapsed": false 218 | }, 219 | "outputs": [ 220 | { 221 | "name": "stdout", 222 | "output_type": "stream", 223 | "text": [ 224 | "[1, 1000] loss: 1.916\n", 225 | "[1, 2000] loss: 1.765\n", 226 | "[1, 3000] loss: 1.705\n", 227 | "[1, 4000] loss: 1.651\n", 228 | "[1, 5000] loss: 1.616\n", 229 | "[1, 6000] loss: 1.566\n", 230 | "[1, 7000] loss: 1.561\n", 231 | "[1, 8000] loss: 1.510\n", 232 | "[1, 9000] loss: 1.487\n", 233 | "[1, 10000] loss: 1.484\n", 234 | "[1, 11000] loss: 1.455\n", 235 | "[1, 12000] loss: 1.417\n", 236 | "[2, 1000] loss: 1.360\n", 237 | "[2, 2000] loss: 1.355\n", 238 | "[2, 3000] loss: 1.327\n", 239 | "[2, 4000] loss: 1.356\n", 240 | "[2, 5000] loss: 1.301\n", 241 | "[2, 6000] loss: 1.310\n", 242 | "[2, 7000] loss: 1.293\n", 243 | "[2, 8000] loss: 1.293\n", 244 | "[2, 9000] loss: 1.296\n", 245 | "[2, 10000] loss: 1.255\n", 246 | "[2, 11000] loss: 1.264\n", 247 | "[2, 12000] loss: 1.266\n", 248 | "Finished Training\n" 249 | ] 250 | } 251 | ], 252 | "source": [ 253 | "for epoch in range(2): # loop over the dataset multiple times\n", 254 | "\n", 255 | " running_loss = 0.0\n", 256 | " for i, data in enumerate(trainloader, 0):\n", 257 | " # get the inputs\n", 258 | " inputs, labels = data\n", 259 | "\n", 260 | " # zero the parameter gradients\n", 261 | " optimizer.zero_grad()\n", 262 | "\n", 263 | " # forward \n", 264 | " outputs = net(inputs)\n", 265 | " \n", 266 | " # Calculate loss \n", 267 | " loss = criterion(outputs, labels)\n", 268 | " \n", 269 | " # Backpropagation \n", 270 | " loss.backward()\n", 271 | " \n", 272 | " # Learning rule update \n", 273 | " optimizer.step()\n", 274 | "\n", 275 | " # print statistics\n", 276 | " running_loss += loss.item()\n", 277 | " if i % 1000 == 999: # print every 1000 mini-batches\n", 278 | " print('[%d, %5d] loss: %.3f' %\n", 279 | " (epoch + 1, i + 1, running_loss / 1000))\n", 280 | " running_loss = 0.0\n", 281 | "\n", 282 | "print('Finished Training')" 283 | ] 284 | }, 285 | { 286 | "cell_type": "markdown", 287 | "metadata": {}, 288 | "source": [ 289 | "

Evaluation

" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 13, 295 | "metadata": { 296 | "collapsed": true 297 | }, 298 | "outputs": [], 299 | "source": [ 300 | "dataiter = iter(testloader)\n", 301 | "images, labels = dataiter.next()\n" 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": 14, 307 | "metadata": { 308 | "collapsed": false 309 | }, 310 | "outputs": [ 311 | { 312 | "data": { 313 | "image/png": "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\nAXsWkjHgoKKpAAAAAElFTkSuQmCC\n", 314 | "text/plain": [ 315 | "" 316 | ] 317 | }, 318 | "metadata": {}, 319 | "output_type": "display_data" 320 | } 321 | ], 322 | "source": [ 323 | "imshow(torchvision.utils.make_grid(images))" 324 | ] 325 | }, 326 | { 327 | "cell_type": "code", 328 | "execution_count": 15, 329 | "metadata": { 330 | "collapsed": true 331 | }, 332 | "outputs": [], 333 | "source": [ 334 | "%matplotlib inline " 335 | ] 336 | }, 337 | { 338 | "cell_type": "code", 339 | "execution_count": 16, 340 | "metadata": { 341 | "collapsed": false 342 | }, 343 | "outputs": [ 344 | { 345 | "data": { 346 | "text/plain": [ 347 | "tensor([ 3, 8, 8, 0])" 348 | ] 349 | }, 350 | "execution_count": 16, 351 | "metadata": {}, 352 | "output_type": "execute_result" 353 | } 354 | ], 355 | "source": [ 356 | "labels" 357 | ] 358 | }, 359 | { 360 | "cell_type": "code", 361 | "execution_count": 17, 362 | "metadata": { 363 | "collapsed": true 364 | }, 365 | "outputs": [], 366 | "source": [ 367 | "output = net(images)" 368 | ] 369 | }, 370 | { 371 | "cell_type": "code", 372 | "execution_count": 18, 373 | "metadata": { 374 | "collapsed": false 375 | }, 376 | "outputs": [ 377 | { 378 | "data": { 379 | "text/plain": [ 380 | "tensor([[-0.8710, -0.9211, 0.5718, 1.6469, 0.7467, 0.9546, 0.4832,\n", 381 | " -0.2425, -1.0657, -0.8620],\n", 382 | " [ 4.5516, 6.6529, -1.6684, -1.7333, -4.0701, -4.9548, -3.7885,\n", 383 | " -4.9120, 6.8348, 3.7834],\n", 384 | " [ 1.4411, 3.3441, -0.7426, -1.1734, -1.6670, -1.6830, -2.1650,\n", 385 | " -1.4455, 2.8334, 1.9109],\n", 386 | " [ 3.5701, 2.5817, -0.4750, -1.7329, -0.7938, -3.4097, -2.1578,\n", 387 | " -3.2498, 3.7924, 1.3184]])" 388 | ] 389 | }, 390 | "execution_count": 18, 391 | "metadata": {}, 392 | "output_type": "execute_result" 393 | } 394 | ], 395 | "source": [ 396 | "output" 397 | ] 398 | }, 399 | { 400 | "cell_type": "code", 401 | "execution_count": 19, 402 | "metadata": { 403 | "collapsed": true 404 | }, 405 | "outputs": [], 406 | "source": [ 407 | "_, preds = torch.max(output, 1)" 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": 20, 413 | "metadata": { 414 | "collapsed": false 415 | }, 416 | "outputs": [ 417 | { 418 | "data": { 419 | "text/plain": [ 420 | "tensor([ 3, 8, 1, 8])" 421 | ] 422 | }, 423 | "execution_count": 20, 424 | "metadata": {}, 425 | "output_type": "execute_result" 426 | } 427 | ], 428 | "source": [ 429 | "preds" 430 | ] 431 | }, 432 | { 433 | "cell_type": "code", 434 | "execution_count": 21, 435 | "metadata": { 436 | "collapsed": false 437 | }, 438 | "outputs": [ 439 | { 440 | "data": { 441 | "text/plain": [ 442 | "2" 443 | ] 444 | }, 445 | "execution_count": 21, 446 | "metadata": {}, 447 | "output_type": "execute_result" 448 | } 449 | ], 450 | "source": [ 451 | "(labels==preds).sum().item()" 452 | ] 453 | }, 454 | { 455 | "cell_type": "code", 456 | "execution_count": 22, 457 | "metadata": { 458 | "collapsed": true 459 | }, 460 | "outputs": [], 461 | "source": [ 462 | "with torch.no_grad():\n", 463 | " correct_examples = 0\n", 464 | " total_examples = 0\n", 465 | " for i, data in enumerate(testloader, 0):\n", 466 | " images, labels = data\n", 467 | " output = net(images)\n", 468 | " _, preds = torch.max(output, 1)\n", 469 | " corr = (labels==preds).sum().item()\n", 470 | " correct_examples+=corr \n", 471 | " total_examples += 4" 472 | ] 473 | }, 474 | { 475 | "cell_type": "code", 476 | "execution_count": 23, 477 | "metadata": { 478 | "collapsed": false 479 | }, 480 | "outputs": [ 481 | { 482 | "data": { 483 | "text/plain": [ 484 | "0.553" 485 | ] 486 | }, 487 | "execution_count": 23, 488 | "metadata": {}, 489 | "output_type": "execute_result" 490 | } 491 | ], 492 | "source": [ 493 | "correct_examples/total_examples" 494 | ] 495 | }, 496 | { 497 | "cell_type": "markdown", 498 | "metadata": {}, 499 | "source": [ 500 | " Accuracy per class " 501 | ] 502 | }, 503 | { 504 | "cell_type": "code", 505 | "execution_count": 36, 506 | "metadata": { 507 | "collapsed": true 508 | }, 509 | "outputs": [], 510 | "source": [ 511 | "class_correct = list(0 for i in range(10))\n", 512 | "class_total = list(0 for i in range(10))" 513 | ] 514 | }, 515 | { 516 | "cell_type": "code", 517 | "execution_count": 37, 518 | "metadata": { 519 | "collapsed": false 520 | }, 521 | "outputs": [ 522 | { 523 | "data": { 524 | "text/plain": [ 525 | "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]" 526 | ] 527 | }, 528 | "execution_count": 37, 529 | "metadata": {}, 530 | "output_type": "execute_result" 531 | } 532 | ], 533 | "source": [ 534 | "class_correct" 535 | ] 536 | }, 537 | { 538 | "cell_type": "code", 539 | "execution_count": 38, 540 | "metadata": { 541 | "collapsed": true 542 | }, 543 | "outputs": [], 544 | "source": [ 545 | "dataiter = iter(testloader)\n", 546 | "images, labels = dataiter.next()" 547 | ] 548 | }, 549 | { 550 | "cell_type": "code", 551 | "execution_count": 39, 552 | "metadata": { 553 | "collapsed": true 554 | }, 555 | "outputs": [], 556 | "source": [ 557 | "outputs = net(images)" 558 | ] 559 | }, 560 | { 561 | "cell_type": "code", 562 | "execution_count": 40, 563 | "metadata": { 564 | "collapsed": true 565 | }, 566 | "outputs": [], 567 | "source": [ 568 | "_, predicted = torch.max(outputs, 1)" 569 | ] 570 | }, 571 | { 572 | "cell_type": "code", 573 | "execution_count": 41, 574 | "metadata": { 575 | "collapsed": false 576 | }, 577 | "outputs": [ 578 | { 579 | "data": { 580 | "text/plain": [ 581 | "tensor([ 3, 8, 1, 8])" 582 | ] 583 | }, 584 | "execution_count": 41, 585 | "metadata": {}, 586 | "output_type": "execute_result" 587 | } 588 | ], 589 | "source": [ 590 | "predicted" 591 | ] 592 | }, 593 | { 594 | "cell_type": "code", 595 | "execution_count": 42, 596 | "metadata": { 597 | "collapsed": false 598 | }, 599 | "outputs": [ 600 | { 601 | "data": { 602 | "text/plain": [ 603 | "tensor([ 3, 8, 8, 0])" 604 | ] 605 | }, 606 | "execution_count": 42, 607 | "metadata": {}, 608 | "output_type": "execute_result" 609 | } 610 | ], 611 | "source": [ 612 | "labels" 613 | ] 614 | }, 615 | { 616 | "cell_type": "code", 617 | "execution_count": 43, 618 | "metadata": { 619 | "collapsed": false 620 | }, 621 | "outputs": [ 622 | { 623 | "data": { 624 | "text/plain": [ 625 | "tensor([ 1, 1, 0, 0], dtype=torch.uint8)" 626 | ] 627 | }, 628 | "execution_count": 43, 629 | "metadata": {}, 630 | "output_type": "execute_result" 631 | } 632 | ], 633 | "source": [ 634 | "predicted==labels" 635 | ] 636 | }, 637 | { 638 | "cell_type": "code", 639 | "execution_count": 44, 640 | "metadata": { 641 | "collapsed": false 642 | }, 643 | "outputs": [ 644 | { 645 | "data": { 646 | "text/plain": [ 647 | "tensor(2)" 648 | ] 649 | }, 650 | "execution_count": 44, 651 | "metadata": {}, 652 | "output_type": "execute_result" 653 | } 654 | ], 655 | "source": [ 656 | "(predicted==labels).sum()" 657 | ] 658 | }, 659 | { 660 | "cell_type": "code", 661 | "execution_count": 45, 662 | "metadata": { 663 | "collapsed": false 664 | }, 665 | "outputs": [ 666 | { 667 | "data": { 668 | "text/plain": [ 669 | "tensor(1, dtype=torch.uint8)" 670 | ] 671 | }, 672 | "execution_count": 45, 673 | "metadata": {}, 674 | "output_type": "execute_result" 675 | } 676 | ], 677 | "source": [ 678 | "(predicted==labels)[0]" 679 | ] 680 | }, 681 | { 682 | "cell_type": "markdown", 683 | "metadata": {}, 684 | "source": [ 685 | "Convert 1-tensor to Python scalar" 686 | ] 687 | }, 688 | { 689 | "cell_type": "code", 690 | "execution_count": 46, 691 | "metadata": { 692 | "collapsed": false 693 | }, 694 | "outputs": [ 695 | { 696 | "data": { 697 | "text/plain": [ 698 | "1" 699 | ] 700 | }, 701 | "execution_count": 46, 702 | "metadata": {}, 703 | "output_type": "execute_result" 704 | } 705 | ], 706 | "source": [ 707 | "(predicted==labels)[0].item()" 708 | ] 709 | }, 710 | { 711 | "cell_type": "code", 712 | "execution_count": 48, 713 | "metadata": { 714 | "collapsed": false 715 | }, 716 | "outputs": [ 717 | { 718 | "name": "stdout", 719 | "output_type": "stream", 720 | "text": [ 721 | "Accuracies: \n", 722 | "Class plane : 49.6\n", 723 | "Class car : 83.9\n", 724 | "Class bird : 47.2\n", 725 | "Class cat : 22.5\n", 726 | "Class deer : 52.1\n", 727 | "Class dog : 57.3\n", 728 | "Class frog : 63.0\n", 729 | "Class horse : 56.8\n", 730 | "Class ship : 67.1\n", 731 | "Class truck : 53.5\n" 732 | ] 733 | } 734 | ], 735 | "source": [ 736 | "with torch.no_grad():\n", 737 | " for data in testloader:\n", 738 | " images, labels = data\n", 739 | " outputs = net(images)\n", 740 | " _, predicted = torch.max(outputs, 1)\n", 741 | " c = (predicted == labels).squeeze()\n", 742 | " for i in range(4):\n", 743 | " label = labels[i]\n", 744 | " class_correct[label] += c[i].item()\n", 745 | " class_total[label] += 1\n", 746 | "\n", 747 | "\n", 748 | "print(\"Accuracies: \")\n", 749 | "for i in range(10):\n", 750 | " print('Class' , classes[i] , ' : ', 100 * class_correct[i] / class_total[i])" 751 | ] 752 | }, 753 | { 754 | "cell_type": "code", 755 | "execution_count": null, 756 | "metadata": { 757 | "collapsed": true 758 | }, 759 | "outputs": [], 760 | "source": [] 761 | } 762 | ], 763 | "metadata": { 764 | "anaconda-cloud": {}, 765 | "kernelspec": { 766 | "display_name": "Python [conda root]", 767 | "language": "python", 768 | "name": "conda-root-py" 769 | }, 770 | "language_info": { 771 | "codemirror_mode": { 772 | "name": "ipython", 773 | "version": 3 774 | }, 775 | "file_extension": ".py", 776 | "mimetype": "text/x-python", 777 | "name": "python", 778 | "nbconvert_exporter": "python", 779 | "pygments_lexer": "ipython3", 780 | "version": "3.5.2" 781 | } 782 | }, 783 | "nbformat": 4, 784 | "nbformat_minor": 2 785 | } 786 | --------------------------------------------------------------------------------