├── .gitattributes ├── README.md ├── assignments └── README.md ├── notebooks ├── CEC.ipynb ├── Convolution.ipynb ├── Dropout.ipynb ├── Linear.ipynb ├── MNIST_GAN.ipynb ├── Max-Pool.ipynb ├── NN.ipynb ├── ReLU.ipynb ├── Transposed Convolution.ipynb ├── WeightInit.ipynb ├── cifar10 │ ├── te_data.bin │ └── te_labels.bin └── mnist │ ├── test_32x32.t7 │ └── train_32x32.t7 └── projects ├── glyphs_sample.png └── readme.md /.gitattributes: -------------------------------------------------------------------------------- 1 | *.t7 filter=lfs diff=lfs merge=lfs -text 2 | *.pdf filter=lfs diff=lfs merge=lfs -text 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

Computer Vision (CS 763) - Spring 2018

3 | 4 |

Course Information

5 | 12 | 13 |

Please note that CS663 is a hard prerequisite for this course.

14 | 15 |

Topics to be covered (tentative)

16 | 36 | 37 |

Learning materials and textbooks

38 | 45 | 46 |

Grading Policy

47 | 56 | 57 |

Other Policies

58 | 63 | 64 |

Course Projects

65 | 66 | [02/02/2018] Course projects have now been finalized. 67 | 68 | Go to this link for the finalized list. 69 | 70 |

Assignments

71 | 79 | 80 |

Lecture Schedule:

81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 97 | 98 | 99 | 100 | 101 | 102 | 110 | 111 | 113 | 114 | 115 | 116 | 117 | 123 | 124 | 126 | 127 | 128 | 129 | 130 | 131 | 138 | 139 | 141 | 142 | 143 | 144 | 145 | 146 | 158 | 162 | 163 | 164 | 165 | 166 | 167 | 185 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 203 | 206 | 207 | 208 | 209 | 210 | 211 | 217 | 220 | 221 | 222 | 223 | 224 | 225 | 242 | 246 | 247 | 249 | 250 | 251 | 252 | 260 | 263 | 264 | 268 | 269 | 270 | 271 | 277 | 280 | 283 | 284 | 285 | 286 | 287 | 292 | 295 | 299 | 301 | 302 | 303 | 304 | 310 | 313 | 316 | 317 | 318 | 319 | 324 | 327 | 330 | 331 | 332 | 333 | 334 | 339 | 342 | 344 | 345 | 346 | 347 | 348 | 355 | 358 | 360 | 361 | 362 | 363 | 364 | 365 | 373 | 377 | 379 | 380 | 381 | 382 | 383 | 387 | 390 | 391 | 392 | 393 | 394 | 395 | 402 | 405 | 406 | 407 | 408 | 409 | 410 | 416 | 419 | 420 | 421 | 422 | 423 | 424 | 431 | 434 | 435 | 436 | 437 | 438 | 439 | 446 | 449 | 450 | 451 | 452 | 453 | 454 | 460 | 464 | 465 | 466 | 467 | 468 | 469 | 474 | 477 | 478 | 479 | 480 | 481 | 482 | 487 | 490 | 491 | 492 | 493 | 494 | 495 | 499 | 502 | 503 | 504 | 505 | 506 |
DateTopicsSlidesiTorch NotebooksExtra Reading
4th Jan. 2018
  • Introduction to computer vision, applications and course overview
    Slides -- 96 | --
    5th Jan. 2018 103 | Camera Geometry 104 |
      105 |
    • Homogeneous coordinates and projective geometry 106 |
    • Vanishing points, ideal line, point line duality in P2 107 |
    • Important 2D and 3D transformations using homogeneous coordinates 108 |
    • Introduction to the pin-hole camera model 109 |
    Slides -- 112 | Homogeneous Representations of Points, Lines and Planes
    12th Jan. 2018
      118 |
    • Modeling the pinhole camera analytically, intinsic and extrinsic parameters 119 |
    • World, camera, image plane and sensor plane coordinate systems and transformations between them 120 |
    • Linear and non-linear (lens distortion) errors 121 |
    • Homography, planar world and pure rotation of the camera 122 |
    Slides -- 125 | --
    13th Jan. 2018
      132 |
    • Iterative solutions for dealing with with non-linear (lens distortion) errors 133 |
    • Normalized, ideal, euclidian, affine and general camera models 134 |
    • Orthographic and weak-perspective camera models 135 |
    • Cross ratios and its applications 136 |
    • Camera calibration using DLT (known 3D control points) 137 |
    Slides -- 140 | Resource on SVD, how/why it can be used to solve eq. sytems of type Ax=0, |x|=1
    18th Jan. 2018
      147 |
    • Zhang's camera calibration method, mention of a few DL based calibration methods 148 |
    149 | Image Alignment 150 |
      151 |
    • Image alignment: problem statement, physically and digitally corresponding points 152 |
    • Motion models and degrees of freedom; non-rigid/deformable/non-parametric image alignment 153 |
    • Control point based image alignment using least squares - derivation for pseudo-inverse 154 |
    • Introduction to the SIFT algorithm 155 |
    • Forward and reverse image warping - bilinear and nearest-neighbor interpolation 156 |
    • Mention of DL based image patch descriptors 157 |
    159 | Slides(1)
    160 | Slides(2) 161 |
    -- --
    19th Jan. 2018
      168 |
    • Image alignment using image similarity measures: mean squared error, normalized cross-correlation 169 |
    • Concept of field of view in image alignment using image similarity measures 170 |
    • Monomodal and multimodal image alignment 171 |
    • Concept of joint histograms and behaviour of joint histograms in multi-modal image alignment 172 |
    • Concept of entropy and joint entropy, algorithm for multimodal registration by minimizing joint entropy 173 |
    • Aspects of image registration: 2D/3D, motion model, monomodal or multimodal 174 |
    • Application scenarios for image alignment: template matching, video stabilization, panorama generation, face recognition, 3D to 2D alignment 175 |
    176 | Robust Methods in Computer Vision 177 |
      178 |
    • Least squares problems and their relation to the Gaussian distribution on the noise 179 |
    • Examples of outliers in computer vision 180 |
    • Explanation of why the Gaussian distribution is unsuited to handling outliers 181 |
    • Introduction to the Laplacian distribution 182 |
    • The importance of heavy-tailed distributions in robust statistics 183 |
    • RANSAC (random sample consensus) algorithm 184 |
    186 | Slides(1)
    187 | Slides(2) 188 |
    -- --
    25th Jan. 2018 196 | Recognizing images, objects, scenes (Prof. Suyash P. Awate) 197 |
      198 |
    • Texture modeling and classification 199 |
    • Image classification, challenges 200 |
    • Bag of words model, dictionary learning 201 |
    • Defining image similarity, pyramid match kernel (PMK) 202 |
    204 | Slides
    205 |
    -- --
    1st Feb. 2018 212 | Recognizing images, objects, scenes (Prof. Suyash P. Awate) 213 |
      214 |
    • Pyramid match kernel (PMK) 215 |
    • Kernel coding, local coding, vector quantization, sparse coding, LcLC 216 |
    218 | Slides
    219 |
    -- --
    2nd Feb. 2018 226 | Robust Methods in Computer Vision 227 |
      228 |
    • RANSAC: time complexity and expected no. of iterations 229 |
    • Using RANSAC for Homography estimation 230 |
    • Introduction to the Laplacian distribution 231 |
    • Mean versus median: L2 fit versus L1 fit 232 |
    • LMeds: Least Median of Squares 233 |
    234 | Deep Learning for Computer Vision 235 |
      236 |
    • History, introduction 237 |
    • Data driven paradigm 238 |
    • K-NN on CIFAR 10 239 |
    • Hyperparameters, choice of loss function, cross-validation 240 |
    241 |
    243 | Slides(1)
    244 | Slides(2)
    245 |
    KNN Matrix calculus reminder 248 |
    8th Feb. 2018 253 |
      254 |
    • Softmax classifier, cross-entropy loss function, regularization 255 |
    • Optimization: vanilla gradient descent, stochastic gradient descent 256 |
    • Vanilla momentum, Nesterov momentum, AdaGrad, RMSProp, ADAM 257 |
    • Second order optimization methods, it's issues with deep learning 258 |
    • Good learning rate, learning rate decay 259 |
    261 | Slides
    262 |
    Gradient Check ADAM, 265 | Nesterov
    266 | DL optimization algorithms overview 267 |
    9th Feb. 2018 272 |
      273 |
    • Feed forward, back-propagation 274 |
    • Fully connected layer 275 |
    • Activation functions: sigmoid, tanh, ReLU, LeakyReLU, ELU, etc. 276 |
    278 | Slides
    279 |
    Linear Layer, 281 | ReLU 282 | --
    15th Feb. 2018 288 |
      289 |
    • Convolutions: transposed, dilated, fully-connected as convolution, sliding window as convolution 290 |
    • Max-pooling, Dropout 291 |
    293 | Slides
    294 |
    MaxPool, 296 | Convolution, 297 | Transposed convolution, Dropout 298 | Convolution arithmetic for deep 300 | learning
    16th Feb. 2018 305 |
      306 |
    • SoftMax, Cross Entropy 307 |
    • Data Augmentation, hyperparamter selection 308 |
    • Weight initialization 309 |
    311 | Slides
    312 |
    Cross Entropy, 314 | Weight Initialization 315 | --
    22nd Feb. 2018 320 |
      321 |
    • ConvNet applications 322 |
    • ConvNet case studies 323 |
    325 | Slides
    326 |
    328 | -- 329 | --
    23rd Feb. 2018 335 |
      336 |
    • RNNs, LSTMS 337 |
    • Visualizing and understanding ConvNets 338 |
    340 | Slides
    341 |
    -- 343 | --
    8th March 2018 349 |
      350 |
    • Visualizing and understanding ConvNets 351 |
    • Images that maximize ConvNet class scores, reconstructing images from ConvNet codes 352 |
    • Deep Dream, Neural Art, Adversarial Examples 353 |
    • Dimentionality reduction: siamese and triplet networks 354 |
    356 | Slides
    357 |
    -- 359 | --
    9th March 2018 366 |
      367 |
    • Other vision tasks: semantic segmentation, object localization, object detection, instance segmentation 368 |
    • R-CNN, Mask R-CNN, 369 |
    • Autoencoders 370 |
    • Generative modeling: VAEs, GANs 371 |
    • Case studies: pix2pix, CycleGAN, UNIT 372 |
    374 | Slides
    375 | Slides
    376 |
    MNIST Vanilla GAN 378 | --
    15th March 2018 384 |
      385 |
    • Deep Reinforcement Learning (Prof. Shivaram Kalyanakrishnan) 386 |
    388 | Slides 389 | -- --
    16th March 2018 396 | Structure from Motion 397 |
      398 |
    • Motion as a cue to inference of 3D structure from images 399 |
    • Motion factorization algorithm by Tomasi and Kanade for inference of (sparse) 3D structure of a fixed object being observed by a moving orthographic camera (or a rigidly moving object, being observed by a fixed orthographic camera) 400 |
    • Aspects of the above algorithm: Rank theorem, metric constraints for inference of motion parameters and 3D structure 401 |
    403 | Slides
    404 |
    -- --
    22nd March 2018 411 | Kanade-Lucas-Tomasi Feature Tracking (KLT) 412 |
      413 |
    • Tracking feature-points from a template by estimating motion parameters. 414 |
    • Finding good features to track. 415 |
    417 | Slides
    418 |
    -- Lucas-Kanade 20 Years On: A Unifying Framework
    23rd March 2018 425 | Geometric Stereo 426 |
      427 |
    • Orientation parameters for the camera pair and relative orientation. 428 |
    • Coplanarity constraint for corresponding points 429 |
    • Derivation and key properties of the Fundamental matrix 430 |
    432 | Slides
    433 |
    -- --
    5th April 2018 440 |
      441 |
    • Introduction to epipolar geometry 442 |
    • Essential matrix 443 |
    • Popular parameterizations for the relative orientation 444 |
    • Generating the normalized stereo case from arbitrary views 445 |
    447 | Slides
    448 |
    -- --
    6th April 2018 455 |
      456 |
    • Direct Solutions for Computing Fundamental and Essential Matrix 457 |
    • 8-point algorithm 458 |
    • Triangulation 459 |
    461 | Slides(1)
    462 | Slides(2)
    463 |
    -- --
    12th April 2018 470 |
      471 |
    • Absolute Orientation 472 |
    • Multi-View Geometry and Bundle Adjustment 473 |
    475 | Slides
    476 |
    -- --
    19th April 2018 483 |
      484 |
    • Shape from Shading: Introduction 485 |
    • Reflectance Models 486 |
    488 | Slides
    489 |
    -- --
    20th April 2018 496 |
      497 |
    • Photometric Stereo 498 |
    500 | Slides
    501 |
    -- --
    507 | 508 | 509 | -------------------------------------------------------------------------------- /assignments/README.md: -------------------------------------------------------------------------------- 1 |

    Computer Vision (CS 763) - Spring 2018 Assignment Information

    2 |

    Updates

    3 |
      4 | 5 |
    1. [12-Jan-18] Assignment 1 on Camera Geometry has been released. Due date: January 26, 2018. 6 |
    2. [27-Jan-18] Assignment 2 on Image Alignment and Robust Methods has been released. Due date: February 4, 2018. 7 |
    3. [9-Feb-18] Assignment 3 on Neural Networks has been released. Due date: February 21, 2018. Corresponding kaggle competition link 8 |
    4. [06-Mar-18] Assignment 4 on RNNs has been released. The due date for submission is Monday, March 19, 2018. Corresponding kaggle competition link 9 |
    5. [24-March-18] Assignment 5 on Tracking has been released. Due date: April 2, 2018. Download the necessary files from here 10 |
    6. [11-April-18] Assignment 6 on Multiview Geometry has been released. Due date: April 19, 2018. 11 |
    12 | -------------------------------------------------------------------------------- /notebooks/CEC.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "deletable": true, 7 | "editable": true 8 | }, 9 | "source": [ 10 | "# Cross-Entropy Criterion Layer\n", 11 | "In this notebook, we will look into the forward and the backward the the ```nn.CrossEntropyCriterion``` layer. We will also see how to compute the gradient of the loss respect to the output of the network $\\frac{\\partial L}{\\partial O}$." 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": { 17 | "deletable": true, 18 | "editable": true 19 | }, 20 | "source": [ 21 | "#### Input\n", 22 | "We explicitly initialize the output values to be as bellow:" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 1, 28 | "metadata": { 29 | "collapsed": false, 30 | "deletable": true, 31 | "editable": true 32 | }, 33 | "outputs": [ 34 | { 35 | "data": { 36 | "text/plain": [ 37 | " 3.2000\n", 38 | " 5.1000\n", 39 | "-1.7000\n", 40 | "[torch.DoubleTensor of size 3]\n", 41 | "\n" 42 | ] 43 | }, 44 | "execution_count": 1, 45 | "metadata": {}, 46 | "output_type": "execute_result" 47 | } 48 | ], 49 | "source": [ 50 | "o = torch.Tensor({3.2, 5.1, -1.7}) \n", 51 | "print(o)" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": { 57 | "deletable": true, 58 | "editable": true 59 | }, 60 | "source": [ 61 | "#### Target\n", 62 | "Assume that the target should have been the $1^{st}$ class" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 2, 68 | "metadata": { 69 | "collapsed": false, 70 | "deletable": true, 71 | "editable": true 72 | }, 73 | "outputs": [ 74 | { 75 | "data": { 76 | "text/plain": [ 77 | " 1\n", 78 | "[torch.DoubleTensor of size 1]\n", 79 | "\n" 80 | ] 81 | }, 82 | "execution_count": 2, 83 | "metadata": {}, 84 | "output_type": "execute_result" 85 | } 86 | ], 87 | "source": [ 88 | "t = torch.Tensor({1})\n", 89 | "print(t)" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": { 95 | "deletable": true, 96 | "editable": true 97 | }, 98 | "source": [ 99 | "#### Calcuate the Loss\n", 100 | "We verify that the loss is equaly to the value that we manually calcuated in class." 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 3, 106 | "metadata": { 107 | "collapsed": false, 108 | "deletable": true, 109 | "editable": true 110 | }, 111 | "outputs": [ 112 | { 113 | "data": { 114 | "text/plain": [ 115 | "2.0403551528002\t\n" 116 | ] 117 | }, 118 | "execution_count": 3, 119 | "metadata": {}, 120 | "output_type": "execute_result" 121 | } 122 | ], 123 | "source": [ 124 | "require 'nn';\n", 125 | "cec = nn.CrossEntropyCriterion()\n", 126 | "err = cec:forward(o, t)\n", 127 | "print(err)" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": { 133 | "deletable": true, 134 | "editable": true 135 | }, 136 | "source": [ 137 | "#### Gradient of Loss with respect to Output\n", 138 | "Now, let us look into the gradient of the loss respect to the output of the network $\\frac{\\partial L}{\\partial O}$. We know that loss is equal to:\n", 139 | "\"Cross-Entropy\n", 140 | "As we saw in the class, the error is equal to $\\hat{o}-[1, 0, 0]^{T}$, where $\\hat{o}=SoftMax(o)$. So, let us know use torch to calcuate gradient of the loss respect to the output and then also do the same manually." 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": 4, 146 | "metadata": { 147 | "collapsed": false, 148 | "deletable": true, 149 | "editable": true 150 | }, 151 | "outputs": [ 152 | { 153 | "data": { 154 | "text/plain": [ 155 | " 0.1300\n", 156 | " 0.8690\n", 157 | " 0.0010\n", 158 | "[torch.DoubleTensor of size 3]\n", 159 | "\n" 160 | ] 161 | }, 162 | "execution_count": 4, 163 | "metadata": {}, 164 | "output_type": "execute_result" 165 | } 166 | ], 167 | "source": [ 168 | "ohat = nn.SoftMax():forward(o)\n", 169 | "print(ohat)" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 5, 175 | "metadata": { 176 | "collapsed": false, 177 | "deletable": true, 178 | "editable": true 179 | }, 180 | "outputs": [ 181 | { 182 | "data": { 183 | "text/plain": [ 184 | "-0.8700\n", 185 | " 0.8690\n", 186 | " 0.0010\n", 187 | "[torch.DoubleTensor of size 3]\n", 188 | "\n" 189 | ] 190 | }, 191 | "execution_count": 5, 192 | "metadata": {}, 193 | "output_type": "execute_result" 194 | } 195 | ], 196 | "source": [ 197 | "dl_do = cec:backward(o, t)\n", 198 | "print(dl_do)" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": 6, 204 | "metadata": { 205 | "collapsed": false, 206 | "deletable": true, 207 | "editable": true 208 | }, 209 | "outputs": [ 210 | { 211 | "data": { 212 | "text/plain": [ 213 | "-0.8700\n", 214 | " 0.8690\n", 215 | " 0.0010\n", 216 | "[torch.DoubleTensor of size 3]\n", 217 | "\n" 218 | ] 219 | }, 220 | "execution_count": 6, 221 | "metadata": {}, 222 | "output_type": "execute_result" 223 | } 224 | ], 225 | "source": [ 226 | "target = torch.Tensor({1, 0, 0})\n", 227 | "dl_do_manual = ohat - target\n", 228 | "print(dl_do_manual)" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": { 234 | "deletable": true, 235 | "editable": true 236 | }, 237 | "source": [ 238 | "Note how ```dl_do``` and ```dl_do_manual``` are exactly the same." 239 | ] 240 | } 241 | ], 242 | "metadata": { 243 | "kernelspec": { 244 | "display_name": "iTorch", 245 | "language": "lua", 246 | "name": "itorch" 247 | }, 248 | "language_info": { 249 | "name": "lua", 250 | "version": "5.1" 251 | } 252 | }, 253 | "nbformat": 4, 254 | "nbformat_minor": 2 255 | } 256 | -------------------------------------------------------------------------------- /notebooks/Convolution.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Convolution Layer\n", 8 | "In this notebook, we will look into the forward and the backward the the ```nn.SpatialConvolution``` layer. We will also see how to compute the gradient of the loss with respect to the weights $\\frac{\\partial L}{\\partial W}$ for this layer. I leave gradient of the loss with respect to the input $\\frac{\\partial L}{\\partial I}$ as an excercise." 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### Input\n", 16 | "Similar to the example we used in the class, let us have the input $n$ of size $1 \\times 4$." 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [ 24 | { 25 | "data": { 26 | "text/plain": [ 27 | "(1,.,.) = \n", 28 | " 0.9741 0.6880 0.2478 0.5842\n", 29 | "[torch.DoubleTensor of size 1x1x4]\n", 30 | "\n" 31 | ] 32 | }, 33 | "execution_count": 1, 34 | "metadata": {}, 35 | "output_type": "execute_result" 36 | } 37 | ], 38 | "source": [ 39 | "require 'nn';\n", 40 | "n = torch.rand(4):reshape(1,1,4)\n", 41 | "print(n)" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "#### Output using Convolution Block\n", 49 | "Also similar to the example we used in the class, let us create a convolution block with a weights $w$ of size $1 \\times 3$ and obtain the output $m = Convolution(n, w)$ of size $1\\times2$." 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 2, 55 | "metadata": {}, 56 | "outputs": [ 57 | { 58 | "data": { 59 | "text/plain": [ 60 | "(1,.,.) = \n", 61 | " 0.1151 -0.0816\n", 62 | "[torch.DoubleTensor of size 1x1x2]\n", 63 | "\n" 64 | ] 65 | }, 66 | "execution_count": 2, 67 | "metadata": {}, 68 | "output_type": "execute_result" 69 | } 70 | ], 71 | "source": [ 72 | "conv = nn.SpatialConvolutionMM(1,1,3,1)\n", 73 | "conv.bias:fill(0)\n", 74 | "m = conv:forward(n)\n", 75 | "print(m)" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "#### Doing backward and calculating the gradinent of the loss with respect to the weights\n", 83 | "Let us set the gradient of the loss with respect to the input of next layer (flowing in through the next layer) $\\frac{\\partial L}{\\partial I^{l+1}}$ to be random numbers. After the ```backward()``` call, let us print the $\\frac{\\partial L}{\\partial W}$ as calcuated by torch." 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": 3, 89 | "metadata": {}, 90 | "outputs": [ 91 | { 92 | "data": { 93 | "text/plain": [ 94 | " 0.3516 0.1675 0.2284\n", 95 | "[torch.DoubleTensor of size 1x3]\n", 96 | "\n" 97 | ] 98 | }, 99 | "execution_count": 3, 100 | "metadata": {}, 101 | "output_type": "execute_result" 102 | } 103 | ], 104 | "source": [ 105 | "nextgrad=torch.rand(2):reshape(1,1,2)\n", 106 | "conv:backward(n, nextgrad)\n", 107 | "print(conv.gradWeight)" 108 | ] 109 | }, 110 | { 111 | "cell_type": "markdown", 112 | "metadata": {}, 113 | "source": [ 114 | "#### Expression for calcuating the gradinent of the loss with respect to the weights\n", 115 | "Again, as we learnt in class, the $\\frac{\\partial L}{\\partial W} = Convolution(I, \\frac{\\partial L}{\\partial I^{l+1}})$. We varify that this is indeed exactly equal to $\\frac{\\partial L}{\\partial W}$ computed by torch. " 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 4, 121 | "metadata": {}, 122 | "outputs": [ 123 | { 124 | "data": { 125 | "text/plain": [ 126 | "(1,.,.) = \n", 127 | " 0.3516 0.1675 0.2284\n", 128 | "[torch.DoubleTensor of size 1x1x3]\n", 129 | "\n" 130 | ] 131 | }, 132 | "execution_count": 4, 133 | "metadata": {}, 134 | "output_type": "execute_result" 135 | } 136 | ], 137 | "source": [ 138 | "convback = nn.SpatialConvolutionMM(1,1,2,1)\n", 139 | "convback.bias:fill(0)\n", 140 | "convback.weight:copy(nextgrad:reshape(1,2))\n", 141 | "gradWeight = convback:forward(n)\n", 142 | "print(gradWeight)" 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "I leave the calculation of $\\frac{\\partial L}{\\partial I}$ as an exercise. Remember: $\\frac{\\partial L}{\\partial I} = Convolution(W^{padded}, \\frac{\\partial L}{\\partial I^{l+1}}^{Flip})$" 150 | ] 151 | } 152 | ], 153 | "metadata": { 154 | "kernelspec": { 155 | "display_name": "iTorch", 156 | "language": "lua", 157 | "name": "itorch" 158 | }, 159 | "language_info": { 160 | "name": "lua", 161 | "version": "5.1" 162 | } 163 | }, 164 | "nbformat": 4, 165 | "nbformat_minor": 2 166 | } 167 | -------------------------------------------------------------------------------- /notebooks/Dropout.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "deletable": true, 7 | "editable": true 8 | }, 9 | "source": [ 10 | "# Dropout Layer\n", 11 | "In this notebook, we will look into the the dropout layer.\n", 12 | "Consider a standard 3 layered network as shown bellow in (a):\n", 13 | "\n", 14 | "During training with dropout, as shown bellow in code snippet, we randomly set some neurons to zero in the forward pass. The network with dropout on can be seen in (b)." 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 20, 20 | "metadata": { 21 | "collapsed": false, 22 | "deletable": true, 23 | "editable": true 24 | }, 25 | "outputs": [ 26 | { 27 | "data": { 28 | "text/plain": [ 29 | "Hidden Layer 1 output before dropout:\t\n", 30 | " 0.2164\n", 31 | " 0.0931\n", 32 | "-0.3029\n", 33 | "-0.6296\n", 34 | " 0.3302\n", 35 | "[torch.DoubleTensor of size 5]\n", 36 | "\n", 37 | "Dropout Mask:\t\n", 38 | " 1\n", 39 | " 1\n", 40 | " 1\n", 41 | " 1\n", 42 | " 0\n", 43 | "[torch.DoubleTensor of size 5]\n", 44 | "\n", 45 | "Hidden Layer 1 output after dropout\t\n", 46 | " 0.2164\n", 47 | " 0.0931\n", 48 | "-0.3029\n", 49 | "-0.6296\n", 50 | " 0.0000\n", 51 | "[torch.DoubleTensor of size 5]\n", 52 | "\n", 53 | "-----------------------------------\t\n", 54 | "Hidden Layer 2 output before dropout\t\n", 55 | " 0.1721\n", 56 | " 0.0472\n", 57 | " 0.1428\n", 58 | " 0.1557\n", 59 | " 0.0723\n", 60 | "[torch.DoubleTensor of size 5]\n", 61 | "\n", 62 | "Dropout Mask:\t\n", 63 | " 1\n", 64 | " 1\n", 65 | " 0\n", 66 | " 0\n", 67 | " 1\n", 68 | "[torch.DoubleTensor of size 5]\n", 69 | "\n", 70 | "Hidden Layer 2 output after dropout\t\n", 71 | " 0.1721\n", 72 | " 0.0472\n", 73 | " 0.0000\n", 74 | " 0.0000\n", 75 | " 0.0723\n", 76 | "[torch.DoubleTensor of size 5]\n", 77 | "\n", 78 | "-----------------------------------\t\n", 79 | "Hidden Layer 3 output before dropout\t\n", 80 | "-0.3645\n", 81 | "-0.1621\n", 82 | "-0.0378\n", 83 | "-0.0005\n", 84 | "-0.1822\n", 85 | "[torch.DoubleTensor of size 5]\n", 86 | "\n", 87 | "Dropout Mask:\t\n", 88 | " 0\n", 89 | " 0\n", 90 | " 0\n", 91 | " 1\n", 92 | " 1\n", 93 | "[torch.DoubleTensor of size 5]\n", 94 | "\n", 95 | "Hidden Layer 2 output after dropout\t\n", 96 | "-0.0000\n", 97 | "-0.0000\n", 98 | "-0.0000\n", 99 | "-0.0005\n", 100 | "-0.1822\n", 101 | "[torch.DoubleTensor of size 5]\n", 102 | "\n", 103 | "-----------------------------------\t\n" 104 | ] 105 | }, 106 | "execution_count": 20, 107 | "metadata": {}, 108 | "output_type": "execute_result" 109 | } 110 | ], 111 | "source": [ 112 | "require 'nn';\n", 113 | "p = 0.5\n", 114 | "x = torch.rand(5)\n", 115 | "L1 = nn.Linear(5, 5)\n", 116 | "L2 = nn.Linear(5, 5)\n", 117 | "L3 = nn.Linear(5, 5)\n", 118 | "L4 = nn.Linear(5, 1)\n", 119 | "\n", 120 | "\n", 121 | "H1 = L1:forward(x)\n", 122 | "print('Hidden Layer 1 output before dropout:')\n", 123 | "print(H1)\n", 124 | "U1 = torch.rand(H1:size(1)):gt(p):double()\n", 125 | "print('Dropout Mask:')\n", 126 | "print(U1)\n", 127 | "H1 = H1:cmul(U1)\n", 128 | "print('Hidden Layer 1 output after dropout')\n", 129 | "print(H1)\n", 130 | "print('-----------------------------------')\n", 131 | "\n", 132 | "H2 = L2:forward(H1)\n", 133 | "print('Hidden Layer 2 output before dropout')\n", 134 | "print(H2)\n", 135 | "U2 = torch.rand(H2:size(1)):gt(p):double()\n", 136 | "print('Dropout Mask:')\n", 137 | "print(U2)\n", 138 | "H2 = H2:cmul(U2)\n", 139 | "print('Hidden Layer 2 output after dropout')\n", 140 | "print(H2)\n", 141 | "print('-----------------------------------')\n", 142 | "\n", 143 | "H3 = L3:forward(H2)\n", 144 | "print('Hidden Layer 3 output before dropout')\n", 145 | "print(H3)\n", 146 | "U3 = torch.rand(H3:size(1)):gt(p):double()\n", 147 | "print('Dropout Mask:')\n", 148 | "print(U3)\n", 149 | "H2 = H3:cmul(U3)\n", 150 | "print('Hidden Layer 2 output after dropout')\n", 151 | "print(H3)\n", 152 | "print('-----------------------------------')\n", 153 | "\n", 154 | "out = L4:forward(H3)" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": { 160 | "deletable": true, 161 | "editable": true 162 | }, 163 | "source": [ 164 | "However, we must componsate for the dropout, such as the total magnitude of the activations are same both in the trining and the test phase. This can be done by scaling the activations down during the forward pass at the test time." 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 21, 170 | "metadata": { 171 | "collapsed": true, 172 | "deletable": true, 173 | "editable": true 174 | }, 175 | "outputs": [], 176 | "source": [ 177 | "require 'nn';\n", 178 | "p = 0.5\n", 179 | "x = torch.rand(5)\n", 180 | "L1 = nn.Linear(5, 5)\n", 181 | "L2 = nn.Linear(5, 5)\n", 182 | "L3 = nn.Linear(5, 5)\n", 183 | "L4 = nn.Linear(5, 1)\n", 184 | "\n", 185 | "function forward_train(x)\n", 186 | " H1 = L1:forward(x)\n", 187 | " U1 = torch.rand(H1:size(1)):gt(p):double()\n", 188 | " H1 = H1:cmul(U1)\n", 189 | "\n", 190 | " H2 = L2:forward(H1)\n", 191 | " U2 = torch.rand(H2:size(1)):gt(p):double()\n", 192 | " H2 = H2:cmul(U2)\n", 193 | "\n", 194 | " H3 = L3:forward(H2)\n", 195 | " U3 = torch.rand(H3:size(1)):gt(p):double()\n", 196 | " H2 = H3:cmul(U3)\n", 197 | "\n", 198 | " out = L4:forward(H3)\n", 199 | " return out\n", 200 | "end\n", 201 | "\n", 202 | "function forward_test(x)\n", 203 | " H1 = L1:forward(x) * p\n", 204 | " H2 = L2:forward(H1) * p\n", 205 | " H3 = L3:forward(H2) * p\n", 206 | " out = L4:forward(H3)\n", 207 | " return out\n", 208 | "end" 209 | ] 210 | }, 211 | { 212 | "cell_type": "markdown", 213 | "metadata": { 214 | "deletable": true, 215 | "editable": true 216 | }, 217 | "source": [ 218 | "Alternatively, we can scale the activations up at training time, and thus the test time code remains untouched." 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": null, 224 | "metadata": { 225 | "collapsed": true, 226 | "deletable": true, 227 | "editable": true 228 | }, 229 | "outputs": [], 230 | "source": [ 231 | "function forward_train(x)\n", 232 | " H1 = L1:forward(x)\n", 233 | " U1 = torch.rand(H1:size(1)):gt(p):double()\n", 234 | " H1 = H1:cmul(U1) / p\n", 235 | "\n", 236 | " H2 = L2:forward(H1)\n", 237 | " U2 = torch.rand(H2:size(1)):gt(p):double()\n", 238 | " H2 = H2:cmul(U2) / p\n", 239 | "\n", 240 | " H3 = L3:forward(H2)\n", 241 | " U3 = torch.rand(H3:size(1)):gt(p):double()\n", 242 | " H2 = H3:cmul(U3) / p\n", 243 | "\n", 244 | " out = L4:forward(H3)\n", 245 | " return out\n", 246 | "end\n", 247 | "\n", 248 | "function forward_test(x)\n", 249 | " H1 = L1:forward(x) \n", 250 | " H2 = L2:forward(H1) \n", 251 | " H3 = L3:forward(H2) \n", 252 | " out = L4:forward(H3)\n", 253 | " return out\n", 254 | "end" 255 | ] 256 | } 257 | ], 258 | "metadata": { 259 | "kernelspec": { 260 | "display_name": "iTorch", 261 | "language": "lua", 262 | "name": "itorch" 263 | }, 264 | "language_info": { 265 | "name": "lua", 266 | "version": "5.1" 267 | } 268 | }, 269 | "nbformat": 4, 270 | "nbformat_minor": 2 271 | } 272 | -------------------------------------------------------------------------------- /notebooks/Linear.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Fully-Connected (Linear) Layer\n", 8 | "In this notebook, we will look into the forward and the backward the the ```nn.Linear``` layer. We will also manualy derive the expressions for the gradient of the loss respect to the input $\\frac{\\partial L}{\\partial I}$ of this layer and also the gradient of the loss with respect to the weights $\\frac{\\partial L}{\\partial W}$." 9 | ] 10 | }, 11 | { 12 | "cell_type": "code", 13 | "execution_count": 1, 14 | "metadata": {}, 15 | "outputs": [], 16 | "source": [ 17 | "require 'nn';\n", 18 | "n = torch.rand(5)\n", 19 | "lin = nn.Linear(5,4)\n", 20 | "m = lin:forward(n)" 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": {}, 26 | "source": [ 27 | "#### Input" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 2, 33 | "metadata": {}, 34 | "outputs": [ 35 | { 36 | "data": { 37 | "text/plain": [ 38 | " 0.2647\n", 39 | " 0.7477\n", 40 | " 0.5382\n", 41 | " 0.1914\n", 42 | " 0.0834\n", 43 | "[torch.DoubleTensor of size 5]\n", 44 | "\n" 45 | ] 46 | }, 47 | "execution_count": 2, 48 | "metadata": {}, 49 | "output_type": "execute_result" 50 | } 51 | ], 52 | "source": [ 53 | "n" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": {}, 59 | "source": [ 60 | "#### Output" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 3, 66 | "metadata": {}, 67 | "outputs": [ 68 | { 69 | "data": { 70 | "text/plain": [ 71 | " 0.1242\n", 72 | " 0.2382\n", 73 | "-0.6489\n", 74 | "-0.2896\n", 75 | "[torch.DoubleTensor of size 4]\n", 76 | "\n" 77 | ] 78 | }, 79 | "execution_count": 3, 80 | "metadata": {}, 81 | "output_type": "execute_result" 82 | } 83 | ], 84 | "source": [ 85 | "m" 86 | ] 87 | }, 88 | { 89 | "cell_type": "markdown", 90 | "metadata": {}, 91 | "source": [ 92 | "#### Output (manually compute)" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 4, 98 | "metadata": {}, 99 | "outputs": [ 100 | { 101 | "data": { 102 | "text/plain": [ 103 | " 0.1242\n", 104 | " 0.2382\n", 105 | "-0.6489\n", 106 | "-0.2896\n", 107 | "[torch.DoubleTensor of size 4]\n", 108 | "\n" 109 | ] 110 | }, 111 | "execution_count": 4, 112 | "metadata": {}, 113 | "output_type": "execute_result" 114 | } 115 | ], 116 | "source": [ 117 | "m_ = lin.weight*n + lin.bias\n", 118 | "print(m_)" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": {}, 124 | "source": [ 125 | "#### Set gradient of the loss with respect of input of the next layer $\\frac{\\partial L}{\\partial I^{l+1}}$ of next layer to random values, and backward propagae the gradient from the next layer via this linear layer." 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "execution_count": 5, 131 | "metadata": { 132 | "collapsed": true 133 | }, 134 | "outputs": [], 135 | "source": [ 136 | "nextgrad = torch.rand(4)\n", 137 | "lin:backward(n, nextgrad)" 138 | ] 139 | }, 140 | { 141 | "cell_type": "markdown", 142 | "metadata": {}, 143 | "source": [ 144 | "#### Gradient of the loss with respect of input of this layer $\\frac{\\partial L}{\\partial I}$" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 6, 150 | "metadata": {}, 151 | "outputs": [ 152 | { 153 | "data": { 154 | "text/plain": [ 155 | "-0.1486\n", 156 | "-0.3457\n", 157 | "-0.0236\n", 158 | " 0.2292\n", 159 | " 0.3097\n", 160 | "[torch.DoubleTensor of size 5]\n", 161 | "\n" 162 | ] 163 | }, 164 | "execution_count": 6, 165 | "metadata": {}, 166 | "output_type": "execute_result" 167 | } 168 | ], 169 | "source": [ 170 | "lin.gradInput" 171 | ] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "metadata": {}, 176 | "source": [ 177 | "#### Relation for calcuating the gradient of loss with respect to the input: $\\frac{\\partial L}{\\partial I^{l}} = \\frac{\\partial L}{\\partial I^{l+1}} \\times \\frac{\\partial O^{l}}{\\partial I^{l}}$. Note how the jacobian $\\frac{\\partial O^{l}}{\\partial I^{l}} = W^{l}$" 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": 7, 183 | "metadata": {}, 184 | "outputs": [ 185 | { 186 | "data": { 187 | "text/plain": [ 188 | "-0.1486 -0.3457 -0.0236 0.2292 0.3097\n", 189 | "[torch.DoubleTensor of size 1x5]\n", 190 | "\n" 191 | ] 192 | }, 193 | "execution_count": 7, 194 | "metadata": {}, 195 | "output_type": "execute_result" 196 | } 197 | ], 198 | "source": [ 199 | "nextgrad:reshape(1,4)*lin.weight" 200 | ] 201 | }, 202 | { 203 | "cell_type": "markdown", 204 | "metadata": {}, 205 | "source": [ 206 | "#### This layers gradient of Loss with respect to the weights: $\\frac{\\partial L}{\\partial W^{l}}$" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": 8, 212 | "metadata": {}, 213 | "outputs": [ 214 | { 215 | "data": { 216 | "text/plain": [ 217 | " 0.2135 0.6033 0.4343 0.1544 0.0673\n", 218 | " 0.0556 0.1572 0.1132 0.0402 0.0175\n", 219 | " 0.0850 0.2402 0.1729 0.0615 0.0268\n", 220 | " 0.1717 0.4850 0.3491 0.1242 0.0541\n", 221 | "[torch.DoubleTensor of size 4x5]\n", 222 | "\n" 223 | ] 224 | }, 225 | "execution_count": 8, 226 | "metadata": {}, 227 | "output_type": "execute_result" 228 | } 229 | ], 230 | "source": [ 231 | "lin.gradWeight" 232 | ] 233 | }, 234 | { 235 | "cell_type": "markdown", 236 | "metadata": {}, 237 | "source": [ 238 | "#### Relation for calcuating the gradient of the loss with respect to the weights of this layer: $\\frac{\\partial L}{\\partial W^{l}} = \\frac{\\partial L}{\\partial O} \\frac{\\partial O}{\\partial W_{l}}$.
    \n", 239 | "Let us first calcuate $\\frac{\\partial O}{\\partial W_{l}}$ which is a jacobian of size $4\\times20$. " 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": 9, 245 | "metadata": {}, 246 | "outputs": [], 247 | "source": [ 248 | "dodw = torch.Tensor(4,20)\n", 249 | "st = 1\n", 250 | "for i = 1, 4 do\n", 251 | " for j = 1, 5 do\n", 252 | " dodw[i][st]=n[j]\n", 253 | " st = st + 1\n", 254 | " end\n", 255 | "end" 256 | ] 257 | }, 258 | { 259 | "cell_type": "markdown", 260 | "metadata": {}, 261 | "source": [ 262 | "#### Finally, we can now calculate $\\frac{\\partial L}{\\partial W^{l}} = \\frac{\\partial L}{\\partial O} \\frac{\\partial O}{\\partial W_{l}}$" 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": 10, 268 | "metadata": {}, 269 | "outputs": [ 270 | { 271 | "data": { 272 | "text/plain": [ 273 | " 0.2135 0.6033 0.4343 0.1544 0.0673\n", 274 | " 0.0556 0.1572 0.1132 0.0402 0.0175\n", 275 | " 0.0850 0.2402 0.1729 0.0615 0.0268\n", 276 | " 0.1717 0.4850 0.3491 0.1242 0.0541\n", 277 | "[torch.DoubleTensor of size 4x5]\n", 278 | "\n" 279 | ] 280 | }, 281 | "execution_count": 10, 282 | "metadata": {}, 283 | "output_type": "execute_result" 284 | } 285 | ], 286 | "source": [ 287 | "(nextgrad:reshape(1,4) * dodw):reshape(4,5)" 288 | ] 289 | }, 290 | { 291 | "cell_type": "markdown", 292 | "metadata": {}, 293 | "source": [ 294 | "#### This layers gradient of output with respect to the bias: $\\frac{\\partial L}{\\partial b^{l}}$" 295 | ] 296 | }, 297 | { 298 | "cell_type": "code", 299 | "execution_count": 11, 300 | "metadata": {}, 301 | "outputs": [ 302 | { 303 | "data": { 304 | "text/plain": [ 305 | " 0.8068\n", 306 | " 0.2102\n", 307 | " 0.3212\n", 308 | " 0.6487\n", 309 | "[torch.DoubleTensor of size 4]\n", 310 | "\n" 311 | ] 312 | }, 313 | "execution_count": 11, 314 | "metadata": {}, 315 | "output_type": "execute_result" 316 | } 317 | ], 318 | "source": [ 319 | "lin.gradBias" 320 | ] 321 | }, 322 | { 323 | "cell_type": "markdown", 324 | "metadata": {}, 325 | "source": [ 326 | "#### Relation for calcuating this layers gradient of output with respect to the bias: $\\frac{\\partial L}{\\partial b^{l}} = \\frac{\\partial L}{\\partial I^{l+1}}$" 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "execution_count": 12, 332 | "metadata": {}, 333 | "outputs": [ 334 | { 335 | "data": { 336 | "text/plain": [ 337 | " 0.8068\n", 338 | " 0.2102\n", 339 | " 0.3212\n", 340 | " 0.6487\n", 341 | "[torch.DoubleTensor of size 4x1]\n", 342 | "\n" 343 | ] 344 | }, 345 | "execution_count": 12, 346 | "metadata": {}, 347 | "output_type": "execute_result" 348 | } 349 | ], 350 | "source": [ 351 | "nextgrad:reshape(1,4):t()" 352 | ] 353 | } 354 | ], 355 | "metadata": { 356 | "kernelspec": { 357 | "display_name": "iTorch", 358 | "language": "lua", 359 | "name": "itorch" 360 | }, 361 | "language_info": { 362 | "name": "lua", 363 | "version": "5.1" 364 | } 365 | }, 366 | "nbformat": 4, 367 | "nbformat_minor": 2 368 | } 369 | -------------------------------------------------------------------------------- /notebooks/Max-Pool.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "require 'nn';\n", 12 | "n = torch.Tensor({{{0.2692, 0.4190, 0.2095, 0.9163},\n", 13 | " {0.2778, 0.9199, 0.5555, 0.1638},\n", 14 | " {0.6936, 0.2328, 0.0553, 0.1798},\n", 15 | " {0.3611, 0.3225, 0.9032, 0.5106}}})" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": 2, 21 | "metadata": { 22 | "collapsed": false 23 | }, 24 | "outputs": [ 25 | { 26 | "data": { 27 | "text/plain": [ 28 | "(1,.,.) = \n", 29 | " 0.2692 0.4190 0.2095 0.9163\n", 30 | " 0.2778 0.9199 0.5555 0.1638\n", 31 | " 0.6936 0.2328 0.0553 0.1798\n", 32 | " 0.3611 0.3225 0.9032 0.5106\n", 33 | "[torch.DoubleTensor of size 1x4x4]\n", 34 | "\n" 35 | ] 36 | }, 37 | "execution_count": 2, 38 | "metadata": {}, 39 | "output_type": "execute_result" 40 | } 41 | ], 42 | "source": [ 43 | "print(n)" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 3, 49 | "metadata": { 50 | "collapsed": false 51 | }, 52 | "outputs": [ 53 | { 54 | "data": { 55 | "text/plain": [ 56 | "(1,.,.) = \n", 57 | " 0.9199 0.9163\n", 58 | " 0.6936 0.9032\n", 59 | "[torch.DoubleTensor of size 1x2x2]\n", 60 | "\n" 61 | ] 62 | }, 63 | "execution_count": 3, 64 | "metadata": {}, 65 | "output_type": "execute_result" 66 | } 67 | ], 68 | "source": [ 69 | "pool = nn.SpatialMaxPooling(2, 2)\n", 70 | "m = pool:forward(n)\n", 71 | "print(m)" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 4, 77 | "metadata": { 78 | "collapsed": false 79 | }, 80 | "outputs": [ 81 | { 82 | "data": { 83 | "text/plain": [ 84 | "(1,.,.) = \n", 85 | " 0 0 0 1\n", 86 | " 0 1 0 0\n", 87 | " 1 0 0 0\n", 88 | " 0 0 1 0\n", 89 | "[torch.DoubleTensor of size 1x4x4]\n", 90 | "\n" 91 | ] 92 | }, 93 | "execution_count": 4, 94 | "metadata": {}, 95 | "output_type": "execute_result" 96 | } 97 | ], 98 | "source": [ 99 | "nextgrad = torch.ones(1,2,2)\n", 100 | "pool:backward(n, nextgrad)\n", 101 | "print(pool.gradInput)" 102 | ] 103 | } 104 | ], 105 | "metadata": { 106 | "kernelspec": { 107 | "display_name": "iTorch", 108 | "language": "lua", 109 | "name": "itorch" 110 | }, 111 | "language_info": { 112 | "name": "lua", 113 | "version": "5.1" 114 | } 115 | }, 116 | "nbformat": 4, 117 | "nbformat_minor": 2 118 | } 119 | -------------------------------------------------------------------------------- /notebooks/NN.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Nearest Neighbor Classifier for CIFAR-10" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 10, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "-- load test images\n", 17 | "te_x = torch.load('cifar10/te_data.bin')\n", 18 | "-- load test labels \n", 19 | "te_y = torch.load('cifar10/te_labels.bin')\n", 20 | "\n", 21 | "-- assuming the traning set to be the same \n", 22 | "-- as the test set\n", 23 | "tr_x = te_x\n", 24 | "tr_y = te_y" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 11, 30 | "metadata": {}, 31 | "outputs": [ 32 | { 33 | "data": { 34 | "text/plain": [ 35 | " 10000\n", 36 | " 3\n", 37 | " 32\n", 38 | " 32\n", 39 | "[torch.LongStorage of size 4]\n", 40 | "\n", 41 | " 10000\n", 42 | "[torch.LongStorage of size 1]\n", 43 | "\n" 44 | ] 45 | }, 46 | "execution_count": 11, 47 | "metadata": {}, 48 | "output_type": "execute_result" 49 | } 50 | ], 51 | "source": [ 52 | "print(te_x:size())\n", 53 | "print(te_y:size())" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 12, 59 | "metadata": {}, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "image/png": "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", 64 | "text/plain": [ 65 | "Console does not support images" 66 | ] 67 | }, 68 | "metadata": { 69 | "image/png": { 70 | "height": 204, 71 | "width": 204 72 | } 73 | }, 74 | "output_type": "display_data" 75 | }, 76 | { 77 | "data": { 78 | "text/plain": [ 79 | " 3\n", 80 | " 8\n", 81 | " 8\n", 82 | " 0\n", 83 | " 6\n", 84 | " 6\n", 85 | " 1\n", 86 | " 6\n", 87 | " 3\n", 88 | " 1\n", 89 | " 0\n", 90 | " 9\n", 91 | " 5\n", 92 | " 7\n", 93 | " 9\n", 94 | " 8\n", 95 | " 5\n", 96 | " 7\n", 97 | " 8\n", 98 | " 6\n", 99 | " 7\n", 100 | " 0\n", 101 | " 4\n", 102 | " 9\n", 103 | " 5\n", 104 | " 2\n", 105 | " 4\n", 106 | " 0\n", 107 | " 9\n", 108 | " 6\n", 109 | " 6\n", 110 | " 5\n", 111 | " 4\n", 112 | " 5\n", 113 | " 9\n", 114 | " 2\n", 115 | "[torch.ByteTensor of size 36]\n", 116 | "\n" 117 | ] 118 | }, 119 | "execution_count": 12, 120 | "metadata": {}, 121 | "output_type": "execute_result" 122 | } 123 | ], 124 | "source": [ 125 | "-- display the first 36 training set images\n", 126 | "require 'image';\n", 127 | "itorch.image(te_x[{{1,36},{},{},{}}])\n", 128 | "print(te_y[{{1,36}}])" 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": 13, 134 | "metadata": {}, 135 | "outputs": [], 136 | "source": [ 137 | "local NN = torch.class(\"NN\")\n", 138 | "\n", 139 | "function NN:__init()\n", 140 | "end\n", 141 | "\n", 142 | "function NN:train(X, y)\n", 143 | " -- X is 2D of size N x D = 32x32x3, so each row is an example\n", 144 | " -- Y is 1D of size N \n", 145 | " self.tr_x = X\n", 146 | " self.tr_y = y\n", 147 | "end\n", 148 | "\n", 149 | "function NN:predict(x)\n", 150 | " -- x is of size D = 32x32x3 for which we want to predict the label\n", 151 | " -- returns the predicted label for the input x\n", 152 | " local min_idx = nil\n", 153 | " local min_dist = 1e10\n", 154 | " for i=1, self.tr_x:size(1) do\n", 155 | " local dist = (self.tr_x[i] - x):float():abs():sum()\n", 156 | " if (dist < min_dist) then\n", 157 | " min_dist = dist\n", 158 | " min_idx = i\n", 159 | " end\n", 160 | " end\n", 161 | " return self.tr_y[min_idx]\n", 162 | "end" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 14, 168 | "metadata": {}, 169 | "outputs": [ 170 | { 171 | "data": { 172 | "image/png": "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", 173 | "text/plain": [ 174 | "Console does not support images" 175 | ] 176 | }, 177 | "metadata": { 178 | "image/png": { 179 | "height": 32, 180 | "width": 32 181 | } 182 | }, 183 | "output_type": "display_data" 184 | }, 185 | { 186 | "data": { 187 | "text/plain": [ 188 | "7\t\n" 189 | ] 190 | }, 191 | "execution_count": 14, 192 | "metadata": {}, 193 | "output_type": "execute_result" 194 | }, 195 | { 196 | "data": { 197 | "image/png": "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", 198 | "text/plain": [ 199 | "Console does not support images" 200 | ] 201 | }, 202 | "metadata": { 203 | "image/png": { 204 | "height": 32, 205 | "width": 32 206 | } 207 | }, 208 | "output_type": "display_data" 209 | }, 210 | { 211 | "data": { 212 | "text/plain": [ 213 | "7\t\n" 214 | ] 215 | }, 216 | "execution_count": 14, 217 | "metadata": {}, 218 | "output_type": "execute_result" 219 | }, 220 | { 221 | "data": { 222 | "image/png": "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", 223 | "text/plain": [ 224 | "Console does not support images" 225 | ] 226 | }, 227 | "metadata": { 228 | "image/png": { 229 | "height": 32, 230 | "width": 32 231 | } 232 | }, 233 | "output_type": "display_data" 234 | }, 235 | { 236 | "data": { 237 | "text/plain": [ 238 | "7\t\n" 239 | ] 240 | }, 241 | "execution_count": 14, 242 | "metadata": {}, 243 | "output_type": "execute_result" 244 | }, 245 | { 246 | "data": { 247 | "image/png": "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", 248 | "text/plain": [ 249 | "Console does not support images" 250 | ] 251 | }, 252 | "metadata": { 253 | "image/png": { 254 | "height": 32, 255 | "width": 32 256 | } 257 | }, 258 | "output_type": "display_data" 259 | }, 260 | { 261 | "data": { 262 | "text/plain": [ 263 | "2\t\n" 264 | ] 265 | }, 266 | "execution_count": 14, 267 | "metadata": {}, 268 | "output_type": "execute_result" 269 | }, 270 | { 271 | "data": { 272 | "image/png": "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", 273 | "text/plain": [ 274 | "Console does not support images" 275 | ] 276 | }, 277 | "metadata": { 278 | "image/png": { 279 | "height": 32, 280 | "width": 32 281 | } 282 | }, 283 | "output_type": "display_data" 284 | }, 285 | { 286 | "data": { 287 | "text/plain": [ 288 | "9\t\n" 289 | ] 290 | }, 291 | "execution_count": 14, 292 | "metadata": {}, 293 | "output_type": "execute_result" 294 | } 295 | ], 296 | "source": [ 297 | "classifier = NN.new()\n", 298 | "classifier:train(tr_x, tr_y)\n", 299 | "\n", 300 | "itorch.image(te_x[100])\n", 301 | "print (classifier:predict(te_x[100]))\n", 302 | "\n", 303 | "itorch.image(te_x[110])\n", 304 | "print (classifier:predict(te_x[110]))\n", 305 | "\n", 306 | "itorch.image(te_x[120])\n", 307 | "print (classifier:predict(te_x[120]))\n", 308 | "\n", 309 | "itorch.image(te_x[130])\n", 310 | "print (classifier:predict(te_x[130]))\n", 311 | "\n", 312 | "itorch.image(te_x[140])\n", 313 | "print (classifier:predict(te_x[140]))" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": 15, 319 | "metadata": { 320 | "collapsed": true 321 | }, 322 | "outputs": [], 323 | "source": [ 324 | "require 'math'\n", 325 | "function evaluate()\n", 326 | " errors = 0\n", 327 | " for i = 1,10 do\n", 328 | " xi = tr_x[i] \n", 329 | " ti = tr_y[i] \n", 330 | " op = classifier:predict(xi)\n", 331 | " if ti ~= op then\n", 332 | " errors = errors + 1\n", 333 | " end\n", 334 | " end\n", 335 | " return errors\n", 336 | "end" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": 16, 342 | "metadata": {}, 343 | "outputs": [ 344 | { 345 | "data": { 346 | "text/plain": [ 347 | "0\t\n" 348 | ] 349 | }, 350 | "execution_count": 16, 351 | "metadata": {}, 352 | "output_type": "execute_result" 353 | } 354 | ], 355 | "source": [ 356 | "print(evaluate())" 357 | ] 358 | } 359 | ], 360 | "metadata": { 361 | "kernelspec": { 362 | "display_name": "iTorch", 363 | "language": "lua", 364 | "name": "itorch" 365 | }, 366 | "language_info": { 367 | "name": "lua", 368 | "version": "5.1" 369 | } 370 | }, 371 | "nbformat": 4, 372 | "nbformat_minor": 2 373 | } 374 | -------------------------------------------------------------------------------- /notebooks/ReLU.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Rectified Linear (ReLU) Layer\n", 8 | "In this notebook, we will look into the forward and the backward the the ```nn.ReLU``` layer. We will also see how to compute the gradient of the lost respect to the input $\\frac{\\partial L}{\\partial I}$ for this layer." 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "metadata": {}, 14 | "source": [ 15 | "#### Input\n", 16 | "```torch.rand``` gives us random numbers unformly in the range $[0, 1]$. We subtract 0.5
    to bring it to the range $[-0.5, 0.5]$" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [ 24 | { 25 | "data": { 26 | "text/plain": [ 27 | "-0.0044\n", 28 | "-0.1521\n", 29 | " 0.4794\n", 30 | "-0.1014\n", 31 | " 0.4201\n", 32 | "[torch.DoubleTensor of size 5]\n", 33 | "\n" 34 | ] 35 | }, 36 | "execution_count": 1, 37 | "metadata": {}, 38 | "output_type": "execute_result" 39 | } 40 | ], 41 | "source": [ 42 | "require 'nn';\n", 43 | "n = torch.rand(5) - 0.5 \n", 44 | "print(n)" 45 | ] 46 | }, 47 | { 48 | "cell_type": "markdown", 49 | "metadata": {}, 50 | "source": [ 51 | "#### Output" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 2, 57 | "metadata": {}, 58 | "outputs": [ 59 | { 60 | "data": { 61 | "text/plain": [ 62 | " 0.0000\n", 63 | " 0.0000\n", 64 | " 0.4794\n", 65 | " 0.0000\n", 66 | " 0.4201\n", 67 | "[torch.DoubleTensor of size 5]\n", 68 | "\n" 69 | ] 70 | }, 71 | "execution_count": 2, 72 | "metadata": {}, 73 | "output_type": "execute_result" 74 | } 75 | ], 76 | "source": [ 77 | "relu = nn.ReLU()\n", 78 | "m = relu:forward(n)\n", 79 | "print(m)" 80 | ] 81 | }, 82 | { 83 | "cell_type": "markdown", 84 | "metadata": {}, 85 | "source": [ 86 | "So for simplicity, we start by setting the gradient of the loss with respect to the input of next layer (flowing in through the next layer) $\\frac{\\partial L}{\\partial I^{l+1}}$ to be all ones.
    Next, we see that gradient of the lost with respect to the input of this layer $\\frac{\\partial L}{\\partial I^{l}}$ is one where $n > 0$ and zero otherwise." 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": 3, 92 | "metadata": {}, 93 | "outputs": [ 94 | { 95 | "data": { 96 | "text/plain": [ 97 | " 0\n", 98 | " 0\n", 99 | " 1\n", 100 | " 0\n", 101 | " 1\n", 102 | "[torch.DoubleTensor of size 5]\n", 103 | "\n" 104 | ] 105 | }, 106 | "execution_count": 3, 107 | "metadata": {}, 108 | "output_type": "execute_result" 109 | } 110 | ], 111 | "source": [ 112 | "nextgrad=torch.ones(5)\n", 113 | "relu:backward(n, nextgrad)\n", 114 | "print(relu.gradInput)" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 4, 120 | "metadata": {}, 121 | "outputs": [ 122 | { 123 | "data": { 124 | "text/plain": [ 125 | " 1\n", 126 | " 1\n", 127 | " 1\n", 128 | " 1\n", 129 | " 1\n", 130 | "[torch.DoubleTensor of size 5]\n", 131 | "\n" 132 | ] 133 | }, 134 | "execution_count": 4, 135 | "metadata": {}, 136 | "output_type": "execute_result" 137 | } 138 | ], 139 | "source": [ 140 | "print(nextgrad)" 141 | ] 142 | } 143 | ], 144 | "metadata": { 145 | "kernelspec": { 146 | "display_name": "iTorch", 147 | "language": "lua", 148 | "name": "itorch" 149 | }, 150 | "language_info": { 151 | "name": "lua", 152 | "version": "5.1" 153 | } 154 | }, 155 | "nbformat": 4, 156 | "nbformat_minor": 2 157 | } 158 | -------------------------------------------------------------------------------- /notebooks/Transposed Convolution.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Transposed Convolution\n", 8 | "Transposed convolutions also called fractionally strided convolutions or deconvolutions work by swapping the forward and backward passes of a convolution. One way to put it is to note that the kernel defines a convolution, but whether it’s a direct convolution or a transposed convolution is determined by how the forward and backward passes are computed [1]. \n", 9 | "\n", 10 | "For instance, although the kernel $\\mathbf{w}$ defines a convolution whose forward and backward passes are computed by multiplying with $\\mathbf{C}$ and $\\mathbf{C}^T$ respectively, it also defines a transposed convolution whose forward and backward passes are computed by multiplying with $\\mathbf{C}^T$ and $(\\mathbf{C}^T)^T = \\mathbf{C}$ respectively.\n", 11 | "\n", 12 | "It is defined as SpatialFullConvolution in Torch\n", 13 | "\n", 14 | "[1]: Vincent Dumoulin, Francesco Visin - [A guide to convolution arithmetic for deep learning](https://arxiv.org/abs/1603.07285 \"A guide to convolution arithmetic for deep learning\") " 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "### SpatialFullConvolution\n", 22 | "`module = nn.SpatialFullConvolution(nInputPlane, nOutputPlane, kW, kH, [dW], [dH], [padW], [padH], [adjW], [adjH])`\n", 23 | "\n", 24 | "Other frameworks call this operation \"In-network Upsampling\", \"Fractionally-strided convolution\", \"Backwards Convolution,\" \"Deconvolution\", or \"Upconvolution.\"\n", 25 | "The parameters are the following:\n", 26 | "* `nInputPlane:` The number of expected input planes in the image given into `forward()`.\n", 27 | "* `nOutputPlane:` The number of output planes the convolution layer will produce.\n", 28 | "* `kW:` The kernel width of the convolution\n", 29 | "* `kH:` The kernel height of the convolution\n", 30 | "* `dW:` The step of the convolution in the width dimension. Default is 1.\n", 31 | "* `dH:` The step of the convolution in the height dimension. Default is 1.\n", 32 | "* `padW:` Additional zeros added to the input plane data on both sides of width axis. Default is 0. (kW-1)/2 is often used here.\n", 33 | "* `padH:` Additional zeros added to the input plane data on both sides of height axis. Default is 0. (kH-1)/2 is often used here.\n", 34 | "* `adjW:` Extra width to add to the output image. Default is 0. Cannot be greater than dW-1.\n", 35 | "* `adjH:` Extra height to add to the output image. Default is 0. Cannot be greater than dH-1.\n" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 1, 41 | "metadata": { 42 | "collapsed": true 43 | }, 44 | "outputs": [], 45 | "source": [ 46 | "require 'torch'\n", 47 | "require 'nn'" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "### (Normal) Convolution Forward & Backward Pass\n", 55 | "\n", 56 | "Layer with kernel size $3 \\times 3$ and stride of $2$, $2$" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 2, 62 | "metadata": {}, 63 | "outputs": [ 64 | { 65 | "data": { 66 | "text/plain": [ 67 | " 1.0160 0.4442 0.8234 1.7105 1.9389 1.8970 0.4721 1.4563 0.4023\n", 68 | "[torch.DoubleTensor of size 1x9]\n", 69 | "\n" 70 | ] 71 | }, 72 | "execution_count": 2, 73 | "metadata": {}, 74 | "output_type": "execute_result" 75 | } 76 | ], 77 | "source": [ 78 | "conv = nn.SpatialConvolutionMM(1,1,3,3,2,2)\n", 79 | "conv.weight:uniform(0,2)\n", 80 | "conv.bias:fill(0)\n", 81 | "print(conv.weight)" 82 | ] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "metadata": {}, 87 | "source": [ 88 | "#### Input\n", 89 | "Image of channel $1$ and size $5 \\times 5$, $r$ is the inputGradient" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": 3, 95 | "metadata": { 96 | "collapsed": true 97 | }, 98 | "outputs": [], 99 | "source": [ 100 | "imgC = torch.Tensor(1,1,5,5)\n", 101 | "imgC:uniform(0,5)" 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "execution_count": 4, 107 | "metadata": {}, 108 | "outputs": [ 109 | { 110 | "data": { 111 | "text/plain": [ 112 | "(1,1,.,.) = \n", 113 | " 28.0467 21.1382\n", 114 | " 23.1202 30.5335\n", 115 | "[torch.DoubleTensor of size 1x1x2x2]\n", 116 | "\n" 117 | ] 118 | }, 119 | "execution_count": 4, 120 | "metadata": {}, 121 | "output_type": "execute_result" 122 | } 123 | ], 124 | "source": [ 125 | "r=conv:forward(imgC)\n", 126 | "print(r)" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 5, 132 | "metadata": {}, 133 | "outputs": [ 134 | { 135 | "data": { 136 | "text/plain": [ 137 | "(1,1,.,.) = \n", 138 | " 28.4956 12.4596 44.5710 9.3905 17.4058\n", 139 | " 47.9750 54.3784 89.3627 40.9838 40.0994\n", 140 | " 36.7311 51.1151 71.3240 44.3476 33.6471\n", 141 | " 39.5481 44.8267 96.0881 59.1999 57.9224\n", 142 | " 10.9150 33.6697 23.7172 44.4655 12.2851\n", 143 | "[torch.DoubleTensor of size 1x1x5x5]\n", 144 | "\n" 145 | ] 146 | }, 147 | "execution_count": 5, 148 | "metadata": {}, 149 | "output_type": "execute_result" 150 | } 151 | ], 152 | "source": [ 153 | "conv:backward(imgC,r)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "metadata": {}, 159 | "source": [ 160 | "### Transpose Convolution Forward Pass\n", 161 | "\n", 162 | "Layer with kernel size $3 \\times 3$ and stride of $2$, $2$" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 6, 168 | "metadata": { 169 | "collapsed": true 170 | }, 171 | "outputs": [], 172 | "source": [ 173 | "trancon = nn.SpatialFullConvolution(1, 1, 3, 3, 2, 2)\n", 174 | "trancon.bias:fill(0)" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 7, 180 | "metadata": {}, 181 | "outputs": [ 182 | { 183 | "data": { 184 | "text/plain": [ 185 | "(1,1,.,.) = \n", 186 | " 1.0160 0.4442 0.8234\n", 187 | " 1.7105 1.9389 1.8970\n", 188 | " 0.4721 1.4563 0.4023\n", 189 | "[torch.DoubleTensor of size 1x1x3x3]\n", 190 | "\n" 191 | ] 192 | }, 193 | "execution_count": 7, 194 | "metadata": {}, 195 | "output_type": "execute_result" 196 | } 197 | ], 198 | "source": [ 199 | "trancon.weight:copy(conv.weight)\n", 200 | "trancon.weight:reshape(1,1,3,3)\n", 201 | "print(trancon.weight)" 202 | ] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "metadata": {}, 207 | "source": [ 208 | "#### Input\n", 209 | "Image of channel $1$ and size $2 \\times 2$ " 210 | ] 211 | }, 212 | { 213 | "cell_type": "code", 214 | "execution_count": 8, 215 | "metadata": {}, 216 | "outputs": [ 217 | { 218 | "data": { 219 | "text/plain": [ 220 | "(1,1,.,.) = \n", 221 | " 28.0467 21.1382\n", 222 | " 23.1202 30.5335\n", 223 | "[torch.DoubleTensor of size 1x1x2x2]\n", 224 | "\n" 225 | ] 226 | }, 227 | "execution_count": 8, 228 | "metadata": {}, 229 | "output_type": "execute_result" 230 | } 231 | ], 232 | "source": [ 233 | "print(r)" 234 | ] 235 | }, 236 | { 237 | "cell_type": "markdown", 238 | "metadata": {}, 239 | "source": [ 240 | "#### Forward Pass - Note this is exactly same as the backward pass of (normal) convolution!" 241 | ] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": 9, 246 | "metadata": {}, 247 | "outputs": [ 248 | { 249 | "data": { 250 | "text/plain": [ 251 | "(1,1,.,.) = \n", 252 | " 28.4956 12.4596 44.5710 9.3905 17.4058\n", 253 | " 47.9750 54.3784 89.3627 40.9838 40.0994\n", 254 | " 36.7311 51.1151 71.3240 44.3476 33.6471\n", 255 | " 39.5481 44.8267 96.0881 59.1999 57.9224\n", 256 | " 10.9150 33.6697 23.7172 44.4655 12.2851\n", 257 | "[torch.DoubleTensor of size 1x1x5x5]\n", 258 | "\n" 259 | ] 260 | }, 261 | "execution_count": 9, 262 | "metadata": {}, 263 | "output_type": "execute_result" 264 | } 265 | ], 266 | "source": [ 267 | "trancon:forward(r)" 268 | ] 269 | } 270 | ], 271 | "metadata": { 272 | "kernelspec": { 273 | "display_name": "iTorch", 274 | "language": "lua", 275 | "name": "itorch" 276 | }, 277 | "language_info": { 278 | "name": "lua", 279 | "version": "5.1" 280 | } 281 | }, 282 | "nbformat": 4, 283 | "nbformat_minor": 2 284 | } 285 | -------------------------------------------------------------------------------- /notebooks/cifar10/te_data.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cs763/Spring2018/817df53a8def4e05f2ef2b217b0efd7b479c662b/notebooks/cifar10/te_data.bin -------------------------------------------------------------------------------- /notebooks/cifar10/te_labels.bin: -------------------------------------------------------------------------------- 1 | V 1torch.ByteTensor'V 1torch.ByteStorage'                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             -------------------------------------------------------------------------------- /notebooks/mnist/test_32x32.t7: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:33b5f4f249d9113ddf5918ac0af21dff73312a68d9ca06e6260e82770cdf0994 3 | size 10250210 4 | -------------------------------------------------------------------------------- /notebooks/mnist/train_32x32.t7: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:391bf4c91ce96deb828e7c1b4c8255b310aa997ce202c52609e89705e5bb87fa 3 | size 61500210 4 | -------------------------------------------------------------------------------- /projects/glyphs_sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cs763/Spring2018/817df53a8def4e05f2ef2b217b0efd7b479c662b/projects/glyphs_sample.png -------------------------------------------------------------------------------- /projects/readme.md: -------------------------------------------------------------------------------- 1 |

    Computer Vision (CS 763) - Spring 2018 Project Information

    2 | You can choose projects given in the list below or you can propose your project and get it approved by the TAs. 3 |

    Timeline

    4 | 9 | 10 |

    Project Proposal Form

    11 | Project Proposal Form 12 | 13 |

    Some Proposed Projects

    14 |
      15 |
    1. MASK R-CNN for Object Instance Segmentation
      16 | Meet Pragnesh Shah, Mehta Nihar Nikhil, Parth Ashit Kothari
      17 | 18 | Mask R-CNN efficiently detects objects in an image while simultaneously generating a high-quality segmentation mask for each instance. Instance segmentation involves detection of all objects in the image as well as precise segmentation of each instance.The related research paper was published by Facebook AI Research. Through this project, we aim to implement this model in pytorch and perform experiments on the PASCAL-VOC dataset. We also shall make an attempt to provide a modification to the model which helps in improving the accuracies on the vision tasks as described in the paper. Another incentive of this project is that no working code is yet available in pytorch/tensorflow, which are the popular frameworks today. This will largely benefit the deep learning community. 19 | 20 |
    2. Object Detection
      21 | Kratika Gupta, Pratik Kalshetty, Naman Rastogi
      22 | 23 | The aim of this project is to implement a system which is capable of detecting and localising objects in an image. The goal is to achieve accurate object detection at a high speed. The ideas in YOLO (You Only Look Once: Unified, Real-Time Object Detection) will help in implementing the project. For the purpose of this project, the publicly available PASCAL VOC dataset will be used. It consists of $10$k annotated images with $20$ object classes with $25$k object annotations. 24 | 25 |
    3. Plane Extraction on Surfaces 26 |
      Tejesh Raut, Deep Modh, Chaitanya Rajesh
      27 | 28 | In this project, we aim to track a section of a plane in the image so that a user can place a 3D object on the surface, for augmented reality applications. We would recognise if the texture to be detected is present or not in the image. If present, we can then find its position and orientation in the image and finally pply the transformation on predefined hardcoded 3D model in order to place the object on the surface plane. The output will be an image along with the 3D model placed on it. 29 | 30 |
    4. Activity Recognition 31 |
      Naman Jain, Sahil Shah, Uddeshya
      32 | 33 | In our project, we plan to work on detecting human activities from videos. There exists a good amount of literature and data in this area, yet, there is room for improvement. Our initial endeavours would be towards exploring 3D CNNs, as is proposed in the literature, to approach the problem. We also intend to incorporate Connectionist Temporal Classification (CTC) losses in our temporal architectures for improved detection. 34 | 35 |
    5. Glyph based AR application 36 |
      Sachin Goyal, Mohit Madan, Michelle Barnette
      37 | 38 | We wish to perform glyph based AR using the following steps: 1) Glyph-boundary recognition using edge detection. 2) Estimating of the distortion (orientation and scaling) in 3D space. 3) Placing any image on the glyph in 3D space (applying rigid transformations). 4) Identification of the glyph pattern and placing specific image on glyph. 5) (If time permits) placing a 3D object on glyph. 39 | 40 |

    6. Vehicle registration plate detection and recognition 41 |
      Chintan Tundia, Shabana K M, Sukanya Bhattacharjee
      42 | 43 | In this project, we aim to build an automated pipeline to perform license plate detection from images of vehicles and perform recognition of characters in the number plate. This would involve first localizing the number plate in the image followed by detecting the numbers. For the current project, we plan to stick to Indian number plates only. 44 | 45 |
    7. Video Prediction using GANS 46 |
      Alok Kumar Bishoyi
      47 | 48 | Adversarial networks have recently been used to predict future video frames. I plan to implement ‘Deep Multi-Scale Video Prediction beyond Mean Square Error’ for Chainer users. I also plan to test and train on sample games like Pong, Breakout, etc. 49 | 50 |
    8. Label satellite image chips from Amazon rainforest with atmospheric conditions and various classes of land cover
      51 | Kalpesh Dusane, Arijit Mukherjee, Vaishali Shakya
      52 | 53 | It is crucial to identify the terrain of Amazon rainforest to help the government track the region of deforestation or human infiltration of forest which in turns help minimize the devastating effects of climate change. Due to recent advancements in technology, we can capture satellite images but manually monitor and labeling this satellite images would be a tedious and unreliable task. To solve this problem, we represent model which assign multiple labels to the image describing various climate conditions and landmark. We seek to explore different deep convolutional neural network architectures to do the image labeling task and learn how changing various factors such as hyperparameters affect the performance of our neural net model. 54 | 55 |
    9. Style Transfer on Car Exteriors
      56 | Uday Kusupati, Jayanth Shankar, Manoj Kilaru
      57 | Applying style from another image(painting, texture etc) to image of car, sort of similar to prisma but for car exteriors. 58 | 59 | Idea is to identify the body of car using segmentation on the car parts. Next we will build upon an efficient solution proposed by Leon A. Gatys where they train feed-forward convolutional neural networks by defining and optimizing perceptual loss functions. Intent is to also use cues like depth, neighborhood pixels, as well as planarity to transfer style better. 60 | 61 |
    10. Implementing Re3: Real-Time Recurrent Regression Networks for Visual Tracking of Generic Objects
      62 | Rishab Garg, Abhishek Kumar
      63 | 64 | Implementing Re3: Real-Time Recurrent Regression Networks for Visual Tracking of Generic Objects 65 | 66 | A robust object tracking algorithm based which utilises the combination of CNN & LSTM. This optimized tracker is capable of tracking objects at 150 FPS, while attaining impressive results on various benchmarks. This tracker also handles temporary occlusion better than other comparable trackers. Involving LSTM gives real-time deep object tracker capability to incorporating temporal information into its model. All this is achieved in with a single forward pass. 67 | 68 |
    11. Face detection using CNN
      69 | Khursheed Ali, Ayush Goyal and Anshul Gupta 70 |
      71 | 72 | Face detection has vas applications in the areas ranging from surveillance, 73 | security, crowd size estimation to social networking etc. The challenge 74 | lies in creating a model which is agnostic to lightning conditions, 75 | pose, accessories and occlusion. We aim to create a pipeline which takes 76 | an image as an input and creates a bounding box on the faces of all the 77 | people in the image. Further, if the dimension of the face is above a certain 78 | threshold, we will detect the expression of the person. 79 | 80 |
    12. Image Captioning
      81 | Yugal Sachdev
      82 | 83 | The goal of this project is to generate natural language descriptions of images and their regions. It will use combination of CNN over image regions, bidirectional RNN over sentences, and a structured loss function that aligns the two modalities - text and images, through a multimodal embedding. I will be implementing 'Deep Visual-Semantic Alignments for Generating Image Descriptions' on Flikr8K, Flickr30K and MSCOCO datasets using Tensorflow and Keras. 84 |
    85 | --------------------------------------------------------------------------------