├── 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 |
--------------------------------------------------------------------------------