master 3f3a790b14da cached
126 files
79.1 MB
6.8M tokens
1101 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (27,234K chars total). Download the full file to get everything.
Repository: seloufian/Deep-Learning-Computer-Vision
Branch: master
Commit: 3f3a790b14da
Files: 126
Total size: 79.1 MB

Directory structure:
gitextract_4rfjadju/

├── README.md
├── cs231n/
│   ├── assignment1/
│   │   ├── README.md
│   │   ├── cs231n/
│   │   │   ├── __init__.py
│   │   │   ├── classifiers/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── k_nearest_neighbor.py
│   │   │   │   ├── linear_classifier.py
│   │   │   │   ├── linear_svm.py
│   │   │   │   ├── neural_net.py
│   │   │   │   └── softmax.py
│   │   │   ├── data_utils.py
│   │   │   ├── datasets/
│   │   │   │   └── get_datasets.sh
│   │   │   ├── features.py
│   │   │   ├── gradient_check.py
│   │   │   └── vis_utils.py
│   │   ├── features.ipynb
│   │   ├── knn.ipynb
│   │   ├── requirements.txt
│   │   ├── softmax.ipynb
│   │   ├── svm.ipynb
│   │   └── two_layer_net.ipynb
│   ├── assignment2/
│   │   ├── BatchNormalization.ipynb
│   │   ├── ConvolutionalNetworks.ipynb
│   │   ├── Dropout.ipynb
│   │   ├── FullyConnectedNets.ipynb
│   │   ├── PyTorch.ipynb
│   │   ├── README.md
│   │   ├── cs231n/
│   │   │   ├── __init__.py
│   │   │   ├── build/
│   │   │   │   └── temp.linux-x86_64-3.6/
│   │   │   │       └── im2col_cython.o
│   │   │   ├── classifiers/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── cnn.py
│   │   │   │   └── fc_net.py
│   │   │   ├── data_utils.py
│   │   │   ├── datasets/
│   │   │   │   └── get_datasets.sh
│   │   │   ├── fast_layers.py
│   │   │   ├── gradient_check.py
│   │   │   ├── im2col.py
│   │   │   ├── im2col_cython.c
│   │   │   ├── im2col_cython.pyx
│   │   │   ├── layer_utils.py
│   │   │   ├── layers.py
│   │   │   ├── optim.py
│   │   │   ├── setup.py
│   │   │   ├── solver.py
│   │   │   └── vis_utils.py
│   │   └── requirements.txt
│   └── assignment3/
│       ├── Generative_Adversarial_Networks_PyTorch.ipynb
│       ├── LSTM_Captioning.ipynb
│       ├── NetworkVisualization-PyTorch.ipynb
│       ├── README.md
│       ├── RNN_Captioning.ipynb
│       ├── StyleTransfer-PyTorch.ipynb
│       ├── cs231n/
│       │   ├── __init__.py
│       │   ├── captioning_solver.py
│       │   ├── classifiers/
│       │   │   ├── __init__.py
│       │   │   ├── rnn.py
│       │   │   └── squeezenet.py
│       │   ├── coco_utils.py
│       │   ├── data_utils.py
│       │   ├── datasets/
│       │   │   ├── get_assignment3_data.sh
│       │   │   ├── get_coco_captioning.sh
│       │   │   ├── get_dataset.sh
│       │   │   ├── get_datasets.sh
│       │   │   ├── get_imagenet_val.sh
│       │   │   └── get_squeezenet_tf.sh
│       │   ├── fast_layers.py
│       │   ├── gan_pytorch.py
│       │   ├── gradient_check.py
│       │   ├── im2col.py
│       │   ├── im2col_cython.pyx
│       │   ├── image_utils.py
│       │   ├── layer_utils.py
│       │   ├── layers.py
│       │   ├── net_visualization_pytorch.py
│       │   ├── optim.py
│       │   ├── rnn_layers.py
│       │   ├── setup.py
│       │   └── style_transfer_pytorch.py
│       ├── requirements.txt
│       └── style-transfer-checks.npz
└── eecs498-007/
    ├── A4/
    │   ├── README.md
    │   ├── a4_helper.py
    │   ├── eecs598/
    │   │   ├── __init__.py
    │   │   ├── data.py
    │   │   ├── grad.py
    │   │   ├── solver.py
    │   │   ├── submit.py
    │   │   ├── utils.py
    │   │   └── vis.py
    │   ├── network_visualization.ipynb
    │   ├── network_visualization.py
    │   ├── pytorch_autograd_and_nn.ipynb
    │   ├── pytorch_autograd_and_nn.pkl
    │   ├── pytorch_autograd_and_nn.py
    │   ├── rnn_lstm_attention_captioning.ipynb
    │   ├── rnn_lstm_attention_captioning.py
    │   ├── rnn_lstm_attention_submission.pkl
    │   ├── style_transfer.ipynb
    │   └── style_transfer.py
    ├── A5/
    │   ├── README.md
    │   ├── a5_helper.py
    │   ├── eecs598/
    │   │   ├── __init__.py
    │   │   ├── data.py
    │   │   ├── grad.py
    │   │   ├── solver.py
    │   │   ├── submit.py
    │   │   ├── utils.py
    │   │   └── vis.py
    │   ├── frcnn_detector.pt
    │   ├── single_stage_detector.py
    │   ├── single_stage_detector_yolo.ipynb
    │   ├── two_stage_detector.py
    │   ├── two_stage_detector_faster_rcnn.ipynb
    │   └── yolo_detector.pt
    └── A6/
        ├── README.md
        ├── a6_helper.py
        ├── eecs598/
        │   ├── __init__.py
        │   ├── data.py
        │   ├── grad.py
        │   ├── solver.py
        │   ├── submit.py
        │   ├── utils.py
        │   └── vis.py
        ├── gan.py
        ├── generative_adversarial_networks.ipynb
        ├── vae.py
        └── variational_autoencoders.ipynb

================================================
FILE CONTENTS
================================================

================================================
FILE: README.md
================================================
# Deep Learning for Computer Vision Courses

## General info

I present my assignment solutions for both 2020 course offerings: **Stanford University CS231n** (CNNs for Visual Recognition) and **University of Michigan EECS 498-007/598-005** (Deep Learning for Computer Vision).

### Review

After reading enormous positive reviews about CS231n, I decided to dive in by myself into the course lectures which, as expected, were great with well-presented and explained topics (thanks to the instructors) that covers a plethora of Machine Learning / Deep Learning concepts (not only computer vision related), theoretically (via lectures, slides and extra reading content) and practically (via the well-designed assignments).

Depending on your ML understanding (especially, statistics, algebra and Python programming with NumPy package) this course can be challenging since the topics are covered from the fundamentals (actually, from scratch, going through all the math behind). Even me, having a mathematical background, I found myself struggled with some advanced topics (like Variational Autoencoders), which pushed me to review some maths/stats formulas. That being said, most of the course materials aren't that difficult and even so, all the putted efforts and spent time are totally worth it, you will learn a lot.

In parallel to CS231n, I took also its Michigan's updated equivalent EECS 498-007 (abbreviated, as there is a lot of numbers in the course's title), because:

- For CS231n, only 2016 and 2017 lectures are available, which is a little bit old given the fast progress in ML in general. However, this concerns only some topics and even that, the old lectures are still worthy to watch.

- For EECS 498-007, the 2019 lectures are available. They cover more topics (like Attention, 3D, Video, etc.), and the ones existing in CS231n are updated, and some topics are explained in more detail (like Object detection and VAEs). This novelty concerns also the assignments.

The similarity between the two courses is related to the fact that one of CS231n's main instructors (precisely, Justin Johnson) moved from Stanford to Michigan in 2019.

### Assignments

Assignments are the funniest part of the courses, they allow practicing most of the learned theoretical concepts. That is, you will implement vectorized mathematical formulas, gradient descent (be prepared to spend some hours with a pen and a sheet figuring out how to compute formula gradients), neural networks (among others: CNNs and RNNs) from scratch, etc. . That being said, in advanced assignment parts, you will also use high-level frameworks: TensorFlow and PyTorch.

Assignment questions are in form of Jupyter notebooks that call external Python files in order to execute properly. That is, you will mostly implement missing parts in the Python files and execute notebook's cells to check the correctness of your implementation. However, you'll write also some code in the notebooks and respond to inline questions (result analysis and theoretical questions).

For my implementation, I solved all from the three CS231n assignments, for the questions that use frameworks, they ask to pick only one, and for that I choosed PyTorch. That is, questions that require framework were implemented with PyTorch (and not with TensorFlow). For EECS 498-007, since its assignments are similar to the CS231n ones, I solved only those who bring new concepts, precisely A4 (partially, the first two questions about Residual Networks and Attention LSTM), A5 (Object detection: YOLO and Faster RCNN) and A6 (partially, the 1st question about VAEs). For EECS 498-007, there is no choice, only PyTorch is used (which fits perfectly with my choice of using it also in CS231n).

Note that, even that my coding solutions are probably correct, the CS231n assignments contain inline questions for which I'm not sure about their correctness, I just responded as well as I know. Also, Except for the CS231n first assignment (which is less commented), for the remaining assignments, I tried to comment on my code as richly as I can to make it understandable.

### Repository Structure

The repository file's structure is quite intuitive, there are two folders (one for each course), each one with its sub-folders that represent the assignments (three for both, CS231n and EECS 498-007). Note that for each assignment's folder, I put a README which shows covered topics and question descriptions (copied from the assignment's website).

In the rest of this README, I will present a [quick access to the assignments files](#assignment-files), [useful links](#useful-links), some [obtained results](#result-examples) and [credits](#credits).

### Courses' Materials Links

The table below shows relevant links to both courses' materials.

| Relevent info | CS231n | EECS 498-007 |
|:-:|:-:|:-:|
| Official website | [[2020]](http://cs231n.stanford.edu/2020/index.html), [[2017]](http://cs231n.stanford.edu/2017/index.html)  | [[2020]](https://web.eecs.umich.edu/~justincj/teaching/eecs498/FA2020/), [[2019]](https://web.eecs.umich.edu/~justincj/teaching/eecs498/FA2019/) |
| Lectures playlist | [[2017]](https://www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv), [[2016]](https://www.youtube.com/playlist?list=PLkt2uSq6rBVctENoVBg1TpCC7OQi31AlC) | [[2019]](https://www.youtube.com/playlist?list=PL5-TkQAfAZFbzxjBHtzdVCWE0Zbhomg7r) |
| Syllabus | [[2020]](http://cs231n.stanford.edu/2020/syllabus.html), [[2017]](http://cs231n.stanford.edu/2017/syllabus) | [[2020]](https://web.eecs.umich.edu/~justincj/teaching/eecs498/FA2020/schedule.html), [[2019]](https://web.eecs.umich.edu/~justincj/teaching/eecs498/FA2019/schedule.html) |

## Assignment Files

### CS231n: Convolutional Neural Networks for Visual Recognition

#### Assignment 1

**Modified Python files:** [``k_nearest_neighbor.py``](cs231n/assignment1/cs231n/classifiers/k_nearest_neighbor.py), [``linear_classifier.py``](cs231n/assignment1/cs231n/classifiers/linear_classifier.py), [``linear_svm.py``](cs231n/assignment1/cs231n/classifiers/linear_svm.py), [``softmax.py``](cs231n/assignment1/cs231n/classifiers/softmax.py), [``neural_net.py``](cs231n/assignment1/cs231n/classifiers/neural_net.py).

| Question |                     Title                    |                          IPython Notebook                         |
|:--------:|:--------------------------------------------:|:-----------------------------------------------------------------:|
|    Q1    |         k-Nearest Neighbor classifier        |           [``knn.ipynb``](cs231n/assignment1/knn.ipynb)           |
|    Q2    |       Training a Support Vector Machine      |           [``svm.ipynb``](cs231n/assignment1/svm.ipynb)           |
|    Q3    |        Implement a Softmax classifier        |       [``softmax.ipynb``](cs231n/assignment1/softmax.ipynb)       |
|    Q4    |           Two-Layer Neural Network           | [``two_layer_net.ipynb``](cs231n/assignment1/two_layer_net.ipynb) |
|    Q5    | Higher Level Representations: Image Features |      [``features.ipynb``](cs231n/assignment1/features.ipynb)      |

#### Assignment 2

**Modified Python files:** [``layers.py``](cs231n/assignment2/cs231n/layers.py), [``optim.py``](cs231n/assignment2/cs231n/optim.py), [``fc_net.py``](cs231n/assignment2/cs231n/classifiers/fc_net.py), [``cnn.py``](cs231n/assignment2/cs231n/classifiers/cnn.py).

| Question |               Title              |                                  IPython Notebook                                 |
|:--------:|:--------------------------------:|:---------------------------------------------------------------------------------:|
|    Q1    |  Fully-connected Neural Network  |    [``FullyConnectedNets.ipynb``](cs231n/assignment2/FullyConnectedNets.ipynb)    |
|    Q2    |        Batch Normalization       |    [``BatchNormalization.ipynb``](cs231n/assignment2/BatchNormalization.ipynb)    |
|    Q3    |              Dropout             |               [``Dropout.ipynb``](cs231n/assignment2/Dropout.ipynb)               |
|    Q4    |      Convolutional Networks      | [``ConvolutionalNetworks.ipynb``](cs231n/assignment2/ConvolutionalNetworks.ipynb) |
|    Q5    | PyTorch / TensorFlow on CIFAR-10 |               [``PyTorch.ipynb``](cs231n/assignment2/PyTorch.ipynb)               |

#### Assignment 3

**Modified Python files:** [``rnn_layers.py``](cs231n/assignment3/cs231n/rnn_layers.py), [``rnn.py``](cs231n/assignment3/cs231n/classifiers/rnn.py), [``net_visualization_pytorch.py``](cs231n/assignment3/cs231n/net_visualization_pytorch.py), [``style_transfer_pytorch.py``](cs231n/assignment3/cs231n/style_transfer_pytorch.py), [``gan_pytorch.py``](cs231n/assignment3/cs231n/gan_pytorch.py).

| Question |                Title               |                                                    IPython Notebook                                                   |
|:--------:|:----------------------------------:|:---------------------------------------------------------------------------------------------------------------------:|
|    Q1    | Image Captioning with Vanilla RNNs |                          [``RNN_Captioning.ipynb``](cs231n/assignment3/RNN_Captioning.ipynb)                          |
|    Q2    |     Image Captioning with LSTMs    |                         [``LSTM_Captioning.ipynb``](cs231n/assignment3/LSTM_Captioning.ipynb)                         |
|    Q3    |        Network Visualization       |            [``NetworkVisualization-PyTorch.ipynb``](cs231n/assignment3/NetworkVisualization-PyTorch.ipynb)            |
|    Q4    |           Style Transfer           |                   [``StyleTransfer-PyTorch.ipynb``](cs231n/assignment3/StyleTransfer-PyTorch.ipynb)                   |
|    Q5    |   Generative Adversarial Networks  | [``Generative_Adversarial_Networks_PyTorch.ipynb``](cs231n/assignment3/Generative_Adversarial_Networks_PyTorch.ipynb) |

### EECS 498-007 / 598-005: Deep Learning for Computer Vision

#### Assignment 4

**Modified Python files:** [``pytorch_autograd_and_nn.py``](eecs498-007/A4/pytorch_autograd_and_nn.py), [``rnn_lstm_attention_captioning.py``](eecs498-007/A4/rnn_lstm_attention_captioning.py), [``network_visualization.py``](eecs498-007/A4/network_visualization.py), [``style_transfer.py``](eecs498-007/A4/style_transfer.py).

| Question |                      Title                      |                                        IPython Notebook                                       |
|:--------:|:-----------------------------------------------:|:---------------------------------------------------------------------------------------------:|
|    Q1    |                 PyTorch Autograd                |       [``pytorch_autograd_and_nn.ipynb``](eecs498-007/A4/pytorch_autograd_and_nn.ipynb)       |
|    Q2    | Image Captioning with Recurrent Neural Networks | [``rnn_lstm_attention_captioning.ipynb``](eecs498-007/A4/rnn_lstm_attention_captioning.ipynb) |
|    Q3    |              Network Visualization              |         [``network_visualization.ipynb``](eecs498-007/A4/network_visualization.ipynb)         |
|    Q4    |                  Style Transfer                 |                [``style_transfer.ipynb``](eecs498-007/A4/style_transfer.ipynb)                |

#### Assignment 5

**Modified Python files:** [``single_stage_detector.py``](eecs498-007/A5/single_stage_detector.py), [``two_stage_detector.py``](eecs498-007/A5/two_stage_detector.py).

| Question |         Title         |                                         IPython Notebook                                        |
|:--------:|:---------------------:|:-----------------------------------------------------------------------------------------------:|
|    Q1    | Single-Stage Detector |     [``single_stage_detector_yolo.ipynb``](eecs498-007/A5/single_stage_detector_yolo.ipynb)     |
|    Q2    |   Two-Stage Detector  | [``two_stage_detector_faster_rcnn.ipynb``](eecs498-007/A5/two_stage_detector_faster_rcnn.ipynb) |

#### Assignment 6

**Modified Python files:** [``vae.py``](eecs498-007/A6/vae.py), [``gan.py``](eecs498-007/A6/gan.py).

| Question |              Title              |                                          IPython Notebook                                         |
|:--------:|:-------------------------------:|:-------------------------------------------------------------------------------------------------:|
|    Q1    |     Variational Autoencoder     |        [``variational_autoencoders.ipynb``](eecs498-007/A6/variational_autoencoders.ipynb)        |
|    Q2    | Generative Adversarial Networks | [``generative_adversarial_networks.ipynb``](eecs498-007/A6/generative_adversarial_networks.ipynb) |

## Useful Links

The list below provides the most useful external resources that helped me to clarify and understand deeply some ambiguous topics encountered in the lectures. Note that those are only the most important ones, that is, completely understanding them will maybe require checking other -not mentioned- resources.

- Convolutional Neural Networks (CNNs).
  - CNNs implementation from scratch in Python [[Part 1]](https://victorzhou.com/blog/intro-to-cnns-part-1/) [[Part 2]](https://victorzhou.com/blog/intro-to-cnns-part-2/).
  - [A guide to receptive field arithmetic for CNNs](https://medium.com/mlreview/a-guide-to-receptive-field-arithmetic-for-convolutional-neural-networks-e0f514068807).

- Normalization layers.
  - [Understanding the backward pass through Batch Normalization Layer](https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html) (Staged computation method).
  - [Deriving the Gradient for the Backward Pass of Batch Normalization](https://kevinzakka.github.io/2016/09/14/batch_normalization/) (Gradient derivation method).
  - [Group Normalization - The paper](https://arxiv.org/abs/1803.08494) (Concept and implementation well explained).

- Principal Component Analysis (PCA).
  - [Principal Component Analysis (PCA) from Scratch](https://drscotthawley.github.io/blog/2019/12/21/PCA-From-Scratch.html) (Covariance matrix method).
  - StatQuest: PCA (SVD Decomposition method) [[Part 1]](https://youtu.be/FgakZw6K1QQ) [[Part 2]](https://youtu.be/oRvgq966yZg).
  - [In Depth: Principal Component Analysis](https://jakevdp.github.io/PythonDataScienceHandbook/05.09-principal-component-analysis.html) (Using Sklearn package).

- Object Detection.
  - [mAP (mean Average Precision) for Object Detection](https://jonathan-hui.medium.com/map-mean-average-precision-for-object-detection-45c121a31173).
  - Object Detection for Dummies [[Part 1]](https://lilianweng.github.io/lil-log/2017/10/29/object-recognition-for-dummies-part-1.html) [[Part 2]](https://lilianweng.github.io/lil-log/2017/12/15/object-recognition-for-dummies-part-2.html) [[Part 3]](https://lilianweng.github.io/lil-log/2017/12/31/object-recognition-for-dummies-part-3.html) [[Part 4]](https://lilianweng.github.io/lil-log/2018/12/27/object-detection-part-4.html).

- Variational Autoencoders (VAEs).
  - [Kullback-Leibler (KL) Divergence Explained](https://www.countbayesie.com/blog/2017/5/9/kullback-leibler-divergence-explained).
  - [Variational autoencoders](https://www.jeremyjordan.me/variational-autoencoders/).
  - [Variational Autoencoder Demystified With PyTorch Implementation](https://towardsdatascience.com/variational-autoencoder-demystified-with-pytorch-implementation-3a06bee395ed).

- Generative Adversarial Networks (GANs).
  - [GANs from Scratch: A deep introduction, with code in PyTorch](https://medium.com/ai-society/gans-from-scratch-1-a-deep-introduction-with-code-in-pytorch-and-tensorflow-cb03cdcdba0f).
  - [GAN objective function origin explanation](https://ai.stackexchange.com/a/13038).
  - [Google DeepMind: Generative Adversarial Networks](https://youtu.be/wFsI2WqUfdA).

## Result Examples

As mentioned previously, assignments are the funniest part of the courses. In this section, I will provide some interesting obtained results. That being said, during assignment solving, you will encounter other amazing results, here I just picked some of them.

### Class Visualization

Consists of generating a synthetic image that will maximize some class score. Illustrations shown below are generated by applying this technique on a pre-trained CNN on ImageNet dataset. You can see the changes on the synthetic image during training for different classes (categories). Even that those images are not understandable (because they are supposed to maximize scores, not to be pretty) you can identify some specific patterns/shapes for these particular classes.

| ![Analog Clock](examples/analog_clock.gif) | ![Dining Table](examples/dining_table.gif) | ![Kit Fox](examples/kit_fox.gif) | ![Tarantula](examples/tarantula.gif) |
|:------------------------------------------:|:------------------------------------------:|:--------------------------------:|:------------------------------------:|
|                Analog Clock                |                Dining Table                |              Kit Fox             |               Tarantula              |

### GANs

The goal of Generative Adversarial Networks is to generate novel data (in our case, images) that mimic the original data from a dataset. Illustrations below were generated by training three types of GANs (on left: The most basic one, on right: The most advanced one) on the MNIST dataset. You can see the changes on the generated images during training, from completely noisy to reasonable images (that do not exist in the dataset).

| ![Vanilla GAN](examples/vanilla_gan.gif) | ![DCGAN](examples/dcgan.gif) |
|:----------------------------------------:|:----------------------------:|
|                Vanilla GAN               |             DCGAN            |

### Style Transfer

Consists of applying a style from an artistic drawing on an input image. The illustration below shows the result of applying different styles on two images.

| ![Style transfer](examples/style_transfer.png) |
|:-:|
| Style transfer applied on two images.<br>Drawing credits (from left to the right): [The Scream](https://artsandculture.google.com/asset/the-scream-edvard-munch/eQFdRTFKDtVQ1A), [Bicentennial Print](https://artsandculture.google.com/asset/bicentennial-print-roy-lichtenstein/TAHrv5B7P6vh1A), [Horses on the Seashore](https://artsandculture.google.com/asset/horses-on-the-seashore/-wFNr8bqc58Ghw), [Head of a Clown](https://artsandculture.google.com/asset/head-of-a-clown/CQHMqKf7DRo76w) and [The Starry Night](https://artsandculture.google.com/asset/the-starry-night-vincent-van-gogh/bgEuwDxel93-Pg). |

## Credits

I would like to thank everyone involved, directly or indirectly, for making such a great course freely available for everyone. Especially, the instructors: [Fei-Fei Li](https://profiles.stanford.edu/fei-fei-li), [Andrej Karpathy](https://karpathy.ai/), [Serena Yeung](http://ai.stanford.edu/~syyeung/) and [Justin Johnson](https://web.eecs.umich.edu/~justincj/).


================================================
FILE: cs231n/assignment1/README.md
================================================
<div>
  <h2 align="center"><a href="https://cs231n.github.io">CS231n: Convolutional Neural Networks for Visual Recognition</a></h2>
  <h2 align="center"><a href="https://cs231n.github.io/assignments2020/assignment1/">Assignment 1 (2020)</a></h3>
</div>

# Goals

In this assignment you will practice putting together a simple image classification pipeline based on the k-Nearest Neighbor or the SVM/Softmax classifier. The goals of this assignment are as follows:

- Understand the basic **Image Classification pipeline** and the data-driven approach (train/predict stages).
- Understand the train/val/test **splits** and the use of validation data for **hyperparameter tuning**.
- Develop proficiency in writing efficient **vectorized** code with numpy.
- Implement and apply a k-Nearest Neighbor (**kNN**) classifier.
- Implement and apply a Multiclass Support Vector Machine (**SVM**) classifier.
- Implement and apply a **Softmax** classifier.
- Implement and apply a **Two layer neural network** classifier.
- Understand the differences and tradeoffs between these classifiers.
- Get a basic understanding of performance improvements from using **higher-level representations** as opposed to raw pixels, e.g. color histograms, Histogram of Gradient (HOG) features, etc.

# Questions

## Q1: k-Nearest Neighbor classifier

The notebook [``knn.ipynb``](knn.ipynb) will walk you through implementing the kNN classifier.

## Q2: Training a Support Vector Machine

The notebook [``svm.ipynb``](svm.ipynb) will walk you through implementing the SVM classifier.

## Q3: Implement a Softmax classifier

The notebook [``softmax.ipynb``](softmax.ipynb) will walk you through implementing the Softmax classifier.

## Q4: Two-Layer Neural Network

The notebook [``two_layer_net.ipynb``](two_layer_net.ipynb) will walk you through the implementation of a two-layer neural network classifier.

## Q5: Higher Level Representations: Image Features

The notebook [``features.ipynb``](features.ipynb) will examine the improvements gained by using higher-level representations as opposed to using raw pixel values.


================================================
FILE: cs231n/assignment1/cs231n/__init__.py
================================================


================================================
FILE: cs231n/assignment1/cs231n/classifiers/__init__.py
================================================
from cs231n.classifiers.k_nearest_neighbor import *
from cs231n.classifiers.linear_classifier import *


================================================
FILE: cs231n/assignment1/cs231n/classifiers/k_nearest_neighbor.py
================================================
from builtins import range
from builtins import object
import numpy as np
from past.builtins import xrange


class KNearestNeighbor(object):
    """ a kNN classifier with L2 distance """

    def __init__(self):
        pass

    def train(self, X, y):
        """
        Train the classifier. For k-nearest neighbors this is just
        memorizing the training data.

        Inputs:
        - X: A numpy array of shape (num_train, D) containing the training data
          consisting of num_train samples each of dimension D.
        - y: A numpy array of shape (N,) containing the training labels, where
             y[i] is the label for X[i].
        """
        self.X_train = X
        self.y_train = y

    def predict(self, X, k=1, num_loops=0):
        """
        Predict labels for test data using this classifier.

        Inputs:
        - X: A numpy array of shape (num_test, D) containing test data consisting
             of num_test samples each of dimension D.
        - k: The number of nearest neighbors that vote for the predicted labels.
        - num_loops: Determines which implementation to use to compute distances
          between training points and testing points.

        Returns:
        - y: A numpy array of shape (num_test,) containing predicted labels for the
          test data, where y[i] is the predicted label for the test point X[i].
        """
        if num_loops == 0:
            dists = self.compute_distances_no_loops(X)
        elif num_loops == 1:
            dists = self.compute_distances_one_loop(X)
        elif num_loops == 2:
            dists = self.compute_distances_two_loops(X)
        else:
            raise ValueError('Invalid value %d for num_loops' % num_loops)

        return self.predict_labels(dists, k=k)

    def compute_distances_two_loops(self, X):
        """
        Compute the distance between each test point in X and each training point
        in self.X_train using a nested loop over both the training data and the
        test data.

        Inputs:
        - X: A numpy array of shape (num_test, D) containing test data.

        Returns:
        - dists: A numpy array of shape (num_test, num_train) where dists[i, j]
          is the Euclidean distance between the ith test point and the jth training
          point.
        """
        num_test = X.shape[0]
        num_train = self.X_train.shape[0]
        dists = np.zeros((num_test, num_train))
        for i in range(num_test):
            for j in range(num_train):
                #####################################################################
                # TODO:                                                             #
                # Compute the l2 distance between the ith test point and the jth    #
                # training point, and store the result in dists[i, j]. You should   #
                # not use a loop over dimension, nor use np.linalg.norm().          #
                #####################################################################
                # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

                distance_ij = np.square(X[i] - self.X_train[j])
                distance_ij = np.sqrt(np.sum(distance_ij))

                dists[i, j] = distance_ij

                # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
        return dists

    def compute_distances_one_loop(self, X):
        """
        Compute the distance between each test point in X and each training point
        in self.X_train using a single loop over the test data.

        Input / Output: Same as compute_distances_two_loops
        """
        num_test = X.shape[0]
        num_train = self.X_train.shape[0]
        dists = np.zeros((num_test, num_train))
        for i in range(num_test):
            #######################################################################
            # TODO:                                                               #
            # Compute the l2 distance between the ith test point and all training #
            # points, and store the result in dists[i, :].                        #
            # Do not use np.linalg.norm().                                        #
            #######################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            dists[i, :] = np.sqrt(np.sum(np.square(X[i] - self.X_train), axis=1))

            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
        return dists

    def compute_distances_no_loops(self, X):
        """
        Compute the distance between each test point in X and each training point
        in self.X_train using no explicit loops.

        Input / Output: Same as compute_distances_two_loops
        """
        num_test = X.shape[0]
        num_train = self.X_train.shape[0]
        dists = np.zeros((num_test, num_train))
        #########################################################################
        # TODO:                                                                 #
        # Compute the l2 distance between all test points and all training      #
        # points without using any explicit loops, and store the result in      #
        # dists.                                                                #
        #                                                                       #
        # You should implement this function using only basic array operations; #
        # in particular you should not use functions from scipy,                #
        # nor use np.linalg.norm().                                             #
        #                                                                       #
        # HINT: Try to formulate the l2 distance using matrix multiplication    #
        #       and two broadcast sums.                                         #
        #########################################################################
        # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        train_matrix_tr = self.X_train.T

        sum_1 = np.sum(np.square(X), axis=1)
        sum_1 = sum_1.reshape((-1, sum_1.size)).T

        sum_2 = np.sum(np.square(train_matrix_tr), axis=0)

        dists = -2 * X.dot(train_matrix_tr) + sum_1 + sum_2
        dists = np.sqrt(dists)

        # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
        return dists

    def predict_labels(self, dists, k=1):
        """
        Given a matrix of distances between test points and training points,
        predict a label for each test point.

        Inputs:
        - dists: A numpy array of shape (num_test, num_train) where dists[i, j]
          gives the distance betwen the ith test point and the jth training point.

        Returns:
        - y: A numpy array of shape (num_test,) containing predicted labels for the
          test data, where y[i] is the predicted label for the test point X[i].
        """
        num_test = dists.shape[0]
        y_pred = np.zeros(num_test)
        for i in range(num_test):
            # A list of length k storing the labels of the k nearest neighbors to
            # the ith test point.
            closest_y = []
            #########################################################################
            # TODO:                                                                 #
            # Use the distance matrix to find the k nearest neighbors of the ith    #
            # testing point, and use self.y_train to find the labels of these       #
            # neighbors. Store these labels in closest_y.                           #
            # Hint: Look up the function numpy.argsort.                             #
            #########################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            closet_indexes = np.argsort(dists[i])
            closet_indexes = closet_indexes[:k]

            closest_y = self.y_train.take(closet_indexes)

            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
            #########################################################################
            # TODO:                                                                 #
            # Now that you have found the labels of the k nearest neighbors, you    #
            # need to find the most common label in the list closest_y of labels.   #
            # Store this label in y_pred[i]. Break ties by choosing the smaller     #
            # label.                                                                #
            #########################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            y_pred[i] = np.bincount(closest_y).argmax()

            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        return y_pred


================================================
FILE: cs231n/assignment1/cs231n/classifiers/linear_classifier.py
================================================
from __future__ import print_function

from builtins import range
from builtins import object
import numpy as np
from cs231n.classifiers.linear_svm import *
from cs231n.classifiers.softmax import *
from past.builtins import xrange


class LinearClassifier(object):

    def __init__(self):
        self.W = None

    def train(self, X, y, learning_rate=1e-3, reg=1e-5, num_iters=100,
              batch_size=200, verbose=False):
        """
        Train this linear classifier using stochastic gradient descent.

        Inputs:
        - X: A numpy array of shape (N, D) containing training data; there are N
          training samples each of dimension D.
        - y: A numpy array of shape (N,) containing training labels; y[i] = c
          means that X[i] has label 0 <= c < C for C classes.
        - learning_rate: (float) learning rate for optimization.
        - reg: (float) regularization strength.
        - num_iters: (integer) number of steps to take when optimizing
        - batch_size: (integer) number of training examples to use at each step.
        - verbose: (boolean) If true, print progress during optimization.

        Outputs:
        A list containing the value of the loss function at each training iteration.
        """
        num_train, dim = X.shape
        num_classes = np.max(y) + 1 # assume y takes values 0...K-1 where K is number of classes
        if self.W is None:
            # lazily initialize W
            self.W = 0.001 * np.random.randn(dim, num_classes)

        # Run stochastic gradient descent to optimize W
        loss_history = []
        for it in range(num_iters):
            X_batch = None
            y_batch = None

            #########################################################################
            # TODO:                                                                 #
            # Sample batch_size elements from the training data and their           #
            # corresponding labels to use in this round of gradient descent.        #
            # Store the data in X_batch and their corresponding labels in           #
            # y_batch; after sampling X_batch should have shape (batch_size, dim)   #
            # and y_batch should have shape (batch_size,)                           #
            #                                                                       #
            # Hint: Use np.random.choice to generate indices. Sampling with         #
            # replacement is faster than sampling without replacement.              #
            #########################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            batch_indexes = np.random.choice(num_train, batch_size)
            X_batch = X[batch_indexes]
            y_batch = y[batch_indexes]

            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            # evaluate loss and gradient
            loss, grad = self.loss(X_batch, y_batch, reg)
            loss_history.append(loss)

            # perform parameter update
            #########################################################################
            # TODO:                                                                 #
            # Update the weights using the gradient and the learning rate.          #
            #########################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            self.W += - learning_rate * grad

            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            if verbose and it % 100 == 0:
                print('iteration %d / %d: loss %f' % (it, num_iters, loss))

        return loss_history

    def predict(self, X):
        """
        Use the trained weights of this linear classifier to predict labels for
        data points.

        Inputs:
        - X: A numpy array of shape (N, D) containing training data; there are N
          training samples each of dimension D.

        Returns:
        - y_pred: Predicted labels for the data in X. y_pred is a 1-dimensional
          array of length N, and each element is an integer giving the predicted
          class.
        """
        y_pred = np.zeros(X.shape[0])
        ###########################################################################
        # TODO:                                                                   #
        # Implement this method. Store the predicted labels in y_pred.            #
        ###########################################################################
        # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        predict_matrix = X.dot(self.W)
        y_pred = predict_matrix.argmax(axis=1)

        # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
        return y_pred

    def loss(self, X_batch, y_batch, reg):
        """
        Compute the loss function and its derivative.
        Subclasses will override this.

        Inputs:
        - X_batch: A numpy array of shape (N, D) containing a minibatch of N
          data points; each point has dimension D.
        - y_batch: A numpy array of shape (N,) containing labels for the minibatch.
        - reg: (float) regularization strength.

        Returns: A tuple containing:
        - loss as a single float
        - gradient with respect to self.W; an array of the same shape as W
        """
        pass


class LinearSVM(LinearClassifier):
    """ A subclass that uses the Multiclass SVM loss function """

    def loss(self, X_batch, y_batch, reg):
        return svm_loss_vectorized(self.W, X_batch, y_batch, reg)


class Softmax(LinearClassifier):
    """ A subclass that uses the Softmax + Cross-entropy loss function """

    def loss(self, X_batch, y_batch, reg):
        return softmax_loss_vectorized(self.W, X_batch, y_batch, reg)


================================================
FILE: cs231n/assignment1/cs231n/classifiers/linear_svm.py
================================================
from builtins import range
import numpy as np
from random import shuffle
from past.builtins import xrange

def svm_loss_naive(W, X, y, reg):
    """
    Structured SVM loss function, naive implementation (with loops).

    Inputs have dimension D, there are C classes, and we operate on minibatches
    of N examples.

    Inputs:
    - W: A numpy array of shape (D, C) containing weights.
    - X: A numpy array of shape (N, D) containing a minibatch of data.
    - y: A numpy array of shape (N,) containing training labels; y[i] = c means
      that X[i] has label c, where 0 <= c < C.
    - reg: (float) regularization strength

    Returns a tuple of:
    - loss as single float
    - gradient with respect to weights W; an array of same shape as W
    """
    dW = np.zeros(W.shape) # initialize the gradient as zero

    # compute the loss and the gradient
    num_classes = W.shape[1]
    num_train = X.shape[0]
    loss = 0.0
    for i in range(num_train):
        scores = X[i].dot(W)
        correct_class_score = scores[y[i]]
        no_meet_margin = 0
        for j in range(num_classes):
            if j == y[i]:
                continue
            margin = scores[j] - correct_class_score + 1 # note delta = 1
            if margin > 0:
                loss += margin
                no_meet_margin += 1
                dW[:, j] += X[i]
        dW[:, y[i]] -=  no_meet_margin * X[i]

    # Right now the loss is a sum over all training examples, but we want it
    # to be an average instead so we divide by num_train.
    loss /= num_train

    # Add regularization to the loss.
    loss += reg * np.sum(W * W)

    #############################################################################
    # TODO:                                                                     #
    # Compute the gradient of the loss function and store it dW.                #
    # Rather than first computing the loss and then computing the derivative,   #
    # it may be simpler to compute the derivative at the same time that the     #
    # loss is being computed. As a result you may need to modify some of the    #
    # code above to compute the gradient.                                       #
    #############################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    dW /= num_train

    # Add the regularization to 'dW' (derivate of L2 norm)
    dW += 2 * reg * W

    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
    
    return loss, dW



def svm_loss_vectorized(W, X, y, reg):
    """
    Structured SVM loss function, vectorized implementation.

    Inputs and outputs are the same as svm_loss_naive.
    """
    loss = 0.0
    dW = np.zeros(W.shape) # initialize the gradient as zero

    #############################################################################
    # TODO:                                                                     #
    # Implement a vectorized version of the structured SVM loss, storing the    #
    # result in loss.                                                           #
    #############################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    scores = X.dot(W)

    correct_class_score = scores[np.arange(len(scores)), y]

    scores_check_margin = scores - correct_class_score.reshape(-1, 1) + 1
    scores_check_margin[np.arange(len(scores_check_margin)), y] = 0

    num_meet_margin = - np.sum(scores_check_margin > 0, axis=1)

    scores_check_margin[scores_check_margin < 0] = 0

    loss = scores_check_margin.sum()
    loss /= X.shape[0]
    loss += reg * np.sum(W * W)

    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    #############################################################################
    # TODO:                                                                     #
    # Implement a vectorized version of the gradient for the structured SVM     #
    # loss, storing the result in dW.                                           #
    #                                                                           #
    # Hint: Instead of computing the gradient from scratch, it may be easier    #
    # to reuse some of the intermediate values that you used to compute the     #
    # loss.                                                                     #
    #############################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    scores_check_margin[scores_check_margin > 0] = 1
  
    scores_check_margin[np.arange(len(scores_check_margin)), y] = num_meet_margin

    dW = X.T.dot(scores_check_margin)

    dW /= X.shape[0]
    dW += reg * 2 * W # Derivate of L2 norm

    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    return loss, dW


================================================
FILE: cs231n/assignment1/cs231n/classifiers/neural_net.py
================================================
from __future__ import print_function

from builtins import range
from builtins import object
import numpy as np
import matplotlib.pyplot as plt
from past.builtins import xrange

class TwoLayerNet(object):
    """
    A two-layer fully-connected neural network. The net has an input dimension of
    N, a hidden layer dimension of H, and performs classification over C classes.
    We train the network with a softmax loss function and L2 regularization on the
    weight matrices. The network uses a ReLU nonlinearity after the first fully
    connected layer.

    In other words, the network has the following architecture:

    input - fully connected layer - ReLU - fully connected layer - softmax

    The outputs of the second fully-connected layer are the scores for each class.
    """

    def __init__(self, input_size, hidden_size, output_size, std=1e-4):
        """
        Initialize the model. Weights are initialized to small random values and
        biases are initialized to zero. Weights and biases are stored in the
        variable self.params, which is a dictionary with the following keys:

        W1: First layer weights; has shape (D, H)
        b1: First layer biases; has shape (H,)
        W2: Second layer weights; has shape (H, C)
        b2: Second layer biases; has shape (C,)

        Inputs:
        - input_size: The dimension D of the input data.
        - hidden_size: The number of neurons H in the hidden layer.
        - output_size: The number of classes C.
        """
        self.params = {}
        self.params['W1'] = std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = std * np.random.randn(hidden_size, output_size)
        self.params['b2'] = np.zeros(output_size)

    def loss(self, X, y=None, reg=0.0):
        """
        Compute the loss and gradients for a two layer fully connected neural
        network.

        Inputs:
        - X: Input data of shape (N, D). Each X[i] is a training sample.
        - y: Vector of training labels. y[i] is the label for X[i], and each y[i] is
          an integer in the range 0 <= y[i] < C. This parameter is optional; if it
          is not passed then we only return scores, and if it is passed then we
          instead return the loss and gradients.
        - reg: Regularization strength.

        Returns:
        If y is None, return a matrix scores of shape (N, C) where scores[i, c] is
        the score for class c on input X[i].

        If y is not None, instead return a tuple of:
        - loss: Loss (data loss and regularization loss) for this batch of training
          samples.
        - grads: Dictionary mapping parameter names to gradients of those parameters
          with respect to the loss function; has the same keys as self.params.
        """
        # Unpack variables from the params dictionary
        W1, b1 = self.params['W1'], self.params['b1']
        W2, b2 = self.params['W2'], self.params['b2']
        N, D = X.shape

        # Compute the forward pass
        scores = None
        #############################################################################
        # TODO: Perform the forward pass, computing the class scores for the input. #
        # Store the result in the scores variable, which should be an array of      #
        # shape (N, C).                                                             #
        #############################################################################
        # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        hid_layer = X.dot(W1) + b1
        hid_layer_act = np.maximum(0, hid_layer) # Apply ReLU

        out_layer = hid_layer_act.dot(W2) + b2

        scores = out_layer

        # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        # If the targets are not given then jump out, we're done
        if y is None:
            return scores

        # Compute the loss
        loss = None
        #############################################################################
        # TODO: Finish the forward pass, and compute the loss. This should include  #
        # both the data loss and L2 regularization for W1 and W2. Store the result  #
        # in the variable loss, which should be a scalar. Use the Softmax           #
        # classifier loss.                                                          #
        #############################################################################
        # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        # scores = scores - np.max(scores) # Ensure numerical stability
        out_layer_act = np.exp(scores)
        sum_out_layer_act = out_layer_act.sum(axis=1, keepdims=True)
        out_layer_act =  out_layer_act / sum_out_layer_act

        y_scores = out_layer_act[range(N), y]
        loss = - np.log(y_scores)
        loss = loss.sum() / N
        loss += reg * (np.sum(W1 ** 2) + np.sum(W2 ** 2))

        # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        # Backward pass: compute gradients
        grads = {}
        #############################################################################
        # TODO: Compute the backward pass, computing the derivatives of the weights #
        # and biases. Store the results in the grads dictionary. For example,       #
        # grads['W1'] should store the gradient on W1, and be a matrix of same size #
        #############################################################################
        # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        d_scores = out_layer_act
        d_scores[range(N), y] -= 1
        d_scores /= N

        grads['W2'] = hid_layer_act.T.dot(d_scores) + 2 * reg * W2
        grads['b2'] = d_scores.sum(axis=0)

        d_hid_layer_act = d_scores.dot(W2.T)

        d_hid_layer_act[hid_layer_act <= 0] = 0

        grads['W1'] = X.T.dot(d_hid_layer_act) + 2 * reg * W1
        grads['b1'] = d_hid_layer_act.sum(axis=0)

        # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        return loss, grads

    def train(self, X, y, X_val, y_val,
              learning_rate=1e-3, learning_rate_decay=0.95,
              reg=5e-6, num_iters=100,
              batch_size=200, verbose=False):
        """
        Train this neural network using stochastic gradient descent.

        Inputs:
        - X: A numpy array of shape (N, D) giving training data.
        - y: A numpy array f shape (N,) giving training labels; y[i] = c means that
          X[i] has label c, where 0 <= c < C.
        - X_val: A numpy array of shape (N_val, D) giving validation data.
        - y_val: A numpy array of shape (N_val,) giving validation labels.
        - learning_rate: Scalar giving learning rate for optimization.
        - learning_rate_decay: Scalar giving factor used to decay the learning rate
          after each epoch.
        - reg: Scalar giving regularization strength.
        - num_iters: Number of steps to take when optimizing.
        - batch_size: Number of training examples to use per step.
        - verbose: boolean; if true print progress during optimization.
        """
        num_train = X.shape[0]
        iterations_per_epoch = max(num_train / batch_size, 1)

        # Use SGD to optimize the parameters in self.model
        loss_history = []
        train_acc_history = []
        val_acc_history = []

        for it in range(num_iters):
            X_batch = None
            y_batch = None

            #########################################################################
            # TODO: Create a random minibatch of training data and labels, storing  #
            # them in X_batch and y_batch respectively.                             #
            #########################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            batch_indexes = np.random.choice(num_train, batch_size)
            X_batch = X[batch_indexes]
            y_batch = y[batch_indexes]

            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            # Compute loss and gradients using the current minibatch
            loss, grads = self.loss(X_batch, y=y_batch, reg=reg)
            loss_history.append(loss)

            #########################################################################
            # TODO: Use the gradients in the grads dictionary to update the         #
            # parameters of the network (stored in the dictionary self.params)      #
            # using stochastic gradient descent. You'll need to use the gradients   #
            # stored in the grads dictionary defined above.                         #
            #########################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            self.params['W1'] -= learning_rate * grads['W1']
            self.params['b1'] -= learning_rate * grads['b1']
            self.params['W2'] -= learning_rate * grads['W2']
            self.params['b2'] -= learning_rate * grads['b2']

            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            if verbose and it % 100 == 0:
                print('iteration %d / %d: loss %f' % (it, num_iters, loss))

            # Every epoch, check train and val accuracy and decay learning rate.
            if it % iterations_per_epoch == 0:
                # Check accuracy
                train_acc = (self.predict(X_batch) == y_batch).mean()
                val_acc = (self.predict(X_val) == y_val).mean()
                train_acc_history.append(train_acc)
                val_acc_history.append(val_acc)

                # Decay learning rate
                learning_rate *= learning_rate_decay

        return {
          'loss_history': loss_history,
          'train_acc_history': train_acc_history,
          'val_acc_history': val_acc_history,
        }

    def predict(self, X):
        """
        Use the trained weights of this two-layer network to predict labels for
        data points. For each data point we predict scores for each of the C
        classes, and assign each data point to the class with the highest score.

        Inputs:
        - X: A numpy array of shape (N, D) giving N D-dimensional data points to
          classify.

        Returns:
        - y_pred: A numpy array of shape (N,) giving predicted labels for each of
          the elements of X. For all i, y_pred[i] = c means that X[i] is predicted
          to have class c, where 0 <= c < C.
        """
        y_pred = None

        ###########################################################################
        # TODO: Implement this function; it should be VERY simple!                #
        ###########################################################################
        # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        W1 = self.params['W1']
        b1 = self.params['b1']
        W2 = self.params['W2']
        b2 = self.params['b2']

        hid_layer_act = np.maximum(0, X.dot(W1) + b1)
        out_layer = hid_layer_act.dot(W2) + b2

        y_pred = out_layer.argmax(axis=1)

        # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        return y_pred


================================================
FILE: cs231n/assignment1/cs231n/classifiers/softmax.py
================================================
from builtins import range
import numpy as np
from random import shuffle
from past.builtins import xrange

def softmax_loss_naive(W, X, y, reg):
    """
    Softmax loss function, naive implementation (with loops)

    Inputs have dimension D, there are C classes, and we operate on minibatches
    of N examples.

    Inputs:
    - W: A numpy array of shape (D, C) containing weights.
    - X: A numpy array of shape (N, D) containing a minibatch of data.
    - y: A numpy array of shape (N,) containing training labels; y[i] = c means
      that X[i] has label c, where 0 <= c < C.
    - reg: (float) regularization strength

    Returns a tuple of:
    - loss as single float
    - gradient with respect to weights W; an array of same shape as W
    """
    # Initialize the loss and gradient to zero.
    loss = 0.0
    dW = np.zeros_like(W)

    #############################################################################
    # TODO: Compute the softmax loss and its gradient using explicit loops.     #
    # Store the loss in loss and the gradient in dW. If you are not careful     #
    # here, it is easy to run into numeric instability. Don't forget the        #
    # regularization!                                                           #
    #############################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    # Gradient for the Softmax function.
    # Check: https://stackoverflow.com/a/53972798

    num_classes = W.shape[1]
    num_train = X.shape[0]
    for i in range(num_train):
        scores = X[i].dot(W)

        correct_class_score = scores[y[i]]
        numerator = np.exp(correct_class_score)

        denominator = 0.0
        for j in range(num_classes):
            denominator += np.exp(scores[j])

        loss += - np.log(numerator / denominator)

        dW[:, y[i]] += (numerator / denominator - 1) * X[i]
        for j in range(num_classes):
            if j != y[i]:
              dW[:, j] += (np.exp(scores[j]) / denominator) * X[i]

    loss /= num_train
    loss += reg * np.sum(W * W)

    dW /= num_train
    dW += reg * 2 * W # Derivate of L2 norm

    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    return loss, dW


def softmax_loss_vectorized(W, X, y, reg):
    """
    Softmax loss function, vectorized version.

    Inputs and outputs are the same as softmax_loss_naive.
    """
    # Initialize the loss and gradient to zero.
    loss = 0.0
    dW = np.zeros_like(W)

    #############################################################################
    # TODO: Compute the softmax loss and its gradient using no explicit loops.  #
    # Store the loss in loss and the gradient in dW. If you are not careful     #
    # here, it is easy to run into numeric instability. Don't forget the        #
    # regularization!                                                           #
    #############################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    scores = np.exp(X.dot(W))

    sum_scores = scores.sum(axis=1)

    y_scores = scores[np.arange(len(scores)), y]

    loss = - np.log(y_scores / sum_scores)
    loss = np.mean(loss)
    loss += reg * np.sum(W * W)

    scores /= sum_scores.reshape(-1, 1)
    scores[np.arange(len(scores)), y] -= 1

    dW = X.T.dot(scores)
    dW /= X.shape[0]
    dW += reg * 2 * W # Derivate of L2 norm

    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    return loss, dW


================================================
FILE: cs231n/assignment1/cs231n/data_utils.py
================================================
from __future__ import print_function

from builtins import range
from six.moves import cPickle as pickle
import numpy as np
import os
from imageio import imread
import platform

def load_pickle(f):
    version = platform.python_version_tuple()
    if version[0] == '2':
        return  pickle.load(f)
    elif version[0] == '3':
        return  pickle.load(f, encoding='latin1')
    raise ValueError("invalid python version: {}".format(version))

def load_CIFAR_batch(filename):
    """ load single batch of cifar """
    with open(filename, 'rb') as f:
        datadict = load_pickle(f)
        X = datadict['data']
        Y = datadict['labels']
        X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")
        Y = np.array(Y)
        return X, Y

def load_CIFAR10(ROOT):
    """ load all of cifar """
    xs = []
    ys = []
    for b in range(1,6):
        f = os.path.join(ROOT, 'data_batch_%d' % (b, ))
        X, Y = load_CIFAR_batch(f)
        xs.append(X)
        ys.append(Y)
    Xtr = np.concatenate(xs)
    Ytr = np.concatenate(ys)
    del X, Y
    Xte, Yte = load_CIFAR_batch(os.path.join(ROOT, 'test_batch'))
    return Xtr, Ytr, Xte, Yte


def get_CIFAR10_data(num_training=49000, num_validation=1000, num_test=1000,
                     subtract_mean=True):
    """
    Load the CIFAR-10 dataset from disk and perform preprocessing to prepare
    it for classifiers. These are the same steps as we used for the SVM, but
    condensed to a single function.
    """
    # Load the raw CIFAR-10 data
    cifar10_dir = 'cs231n/datasets/cifar-10-batches-py'
    X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir)

    # Subsample the data
    mask = list(range(num_training, num_training + num_validation))
    X_val = X_train[mask]
    y_val = y_train[mask]
    mask = list(range(num_training))
    X_train = X_train[mask]
    y_train = y_train[mask]
    mask = list(range(num_test))
    X_test = X_test[mask]
    y_test = y_test[mask]

    # Normalize the data: subtract the mean image
    if subtract_mean:
        mean_image = np.mean(X_train, axis=0)
        X_train -= mean_image
        X_val -= mean_image
        X_test -= mean_image

    # Transpose so that channels come first
    X_train = X_train.transpose(0, 3, 1, 2).copy()
    X_val = X_val.transpose(0, 3, 1, 2).copy()
    X_test = X_test.transpose(0, 3, 1, 2).copy()

    # Package data into a dictionary
    return {
      'X_train': X_train, 'y_train': y_train,
      'X_val': X_val, 'y_val': y_val,
      'X_test': X_test, 'y_test': y_test,
    }


def load_tiny_imagenet(path, dtype=np.float32, subtract_mean=True):
    """
    Load TinyImageNet. Each of TinyImageNet-100-A, TinyImageNet-100-B, and
    TinyImageNet-200 have the same directory structure, so this can be used
    to load any of them.

    Inputs:
    - path: String giving path to the directory to load.
    - dtype: numpy datatype used to load the data.
    - subtract_mean: Whether to subtract the mean training image.

    Returns: A dictionary with the following entries:
    - class_names: A list where class_names[i] is a list of strings giving the
      WordNet names for class i in the loaded dataset.
    - X_train: (N_tr, 3, 64, 64) array of training images
    - y_train: (N_tr,) array of training labels
    - X_val: (N_val, 3, 64, 64) array of validation images
    - y_val: (N_val,) array of validation labels
    - X_test: (N_test, 3, 64, 64) array of testing images.
    - y_test: (N_test,) array of test labels; if test labels are not available
      (such as in student code) then y_test will be None.
    - mean_image: (3, 64, 64) array giving mean training image
    """
    # First load wnids
    with open(os.path.join(path, 'wnids.txt'), 'r') as f:
        wnids = [x.strip() for x in f]

    # Map wnids to integer labels
    wnid_to_label = {wnid: i for i, wnid in enumerate(wnids)}

    # Use words.txt to get names for each class
    with open(os.path.join(path, 'words.txt'), 'r') as f:
        wnid_to_words = dict(line.split('\t') for line in f)
        for wnid, words in wnid_to_words.items():
            wnid_to_words[wnid] = [w.strip() for w in words.split(',')]
    class_names = [wnid_to_words[wnid] for wnid in wnids]

    # Next load training data.
    X_train = []
    y_train = []
    for i, wnid in enumerate(wnids):
        if (i + 1) % 20 == 0:
            print('loading training data for synset %d / %d'
                  % (i + 1, len(wnids)))
        # To figure out the filenames we need to open the boxes file
        boxes_file = os.path.join(path, 'train', wnid, '%s_boxes.txt' % wnid)
        with open(boxes_file, 'r') as f:
            filenames = [x.split('\t')[0] for x in f]
        num_images = len(filenames)

        X_train_block = np.zeros((num_images, 3, 64, 64), dtype=dtype)
        y_train_block = wnid_to_label[wnid] * \
                        np.ones(num_images, dtype=np.int64)
        for j, img_file in enumerate(filenames):
            img_file = os.path.join(path, 'train', wnid, 'images', img_file)
            img = imread(img_file)
            if img.ndim == 2:
        ## grayscale file
                img.shape = (64, 64, 1)
            X_train_block[j] = img.transpose(2, 0, 1)
        X_train.append(X_train_block)
        y_train.append(y_train_block)

    # We need to concatenate all training data
    X_train = np.concatenate(X_train, axis=0)
    y_train = np.concatenate(y_train, axis=0)

    # Next load validation data
    with open(os.path.join(path, 'val', 'val_annotations.txt'), 'r') as f:
        img_files = []
        val_wnids = []
        for line in f:
            img_file, wnid = line.split('\t')[:2]
            img_files.append(img_file)
            val_wnids.append(wnid)
        num_val = len(img_files)
        y_val = np.array([wnid_to_label[wnid] for wnid in val_wnids])
        X_val = np.zeros((num_val, 3, 64, 64), dtype=dtype)
        for i, img_file in enumerate(img_files):
            img_file = os.path.join(path, 'val', 'images', img_file)
            img = imread(img_file)
            if img.ndim == 2:
                img.shape = (64, 64, 1)
            X_val[i] = img.transpose(2, 0, 1)

    # Next load test images
    # Students won't have test labels, so we need to iterate over files in the
    # images directory.
    img_files = os.listdir(os.path.join(path, 'test', 'images'))
    X_test = np.zeros((len(img_files), 3, 64, 64), dtype=dtype)
    for i, img_file in enumerate(img_files):
        img_file = os.path.join(path, 'test', 'images', img_file)
        img = imread(img_file)
        if img.ndim == 2:
            img.shape = (64, 64, 1)
        X_test[i] = img.transpose(2, 0, 1)

    y_test = None
    y_test_file = os.path.join(path, 'test', 'test_annotations.txt')
    if os.path.isfile(y_test_file):
        with open(y_test_file, 'r') as f:
            img_file_to_wnid = {}
            for line in f:
                line = line.split('\t')
                img_file_to_wnid[line[0]] = line[1]
        y_test = [wnid_to_label[img_file_to_wnid[img_file]]
                  for img_file in img_files]
        y_test = np.array(y_test)

    mean_image = X_train.mean(axis=0)
    if subtract_mean:
        X_train -= mean_image[None]
        X_val -= mean_image[None]
        X_test -= mean_image[None]

    return {
      'class_names': class_names,
      'X_train': X_train,
      'y_train': y_train,
      'X_val': X_val,
      'y_val': y_val,
      'X_test': X_test,
      'y_test': y_test,
      'class_names': class_names,
      'mean_image': mean_image,
    }


def load_models(models_dir):
    """
    Load saved models from disk. This will attempt to unpickle all files in a
    directory; any files that give errors on unpickling (such as README.txt)
    will be skipped.

    Inputs:
    - models_dir: String giving the path to a directory containing model files.
      Each model file is a pickled dictionary with a 'model' field.

    Returns:
    A dictionary mapping model file names to models.
    """
    models = {}
    for model_file in os.listdir(models_dir):
        with open(os.path.join(models_dir, model_file), 'rb') as f:
            try:
                models[model_file] = load_pickle(f)['model']
            except pickle.UnpicklingError:
                continue
    return models


def load_imagenet_val(num=None):
    """Load a handful of validation images from ImageNet.

    Inputs:
    - num: Number of images to load (max of 25)

    Returns:
    - X: numpy array with shape [num, 224, 224, 3]
    - y: numpy array of integer image labels, shape [num]
    - class_names: dict mapping integer label to class name
    """
    imagenet_fn = 'cs231n/datasets/imagenet_val_25.npz'
    if not os.path.isfile(imagenet_fn):
      print('file %s not found' % imagenet_fn)
      print('Run the following:')
      print('cd cs231n/datasets')
      print('bash get_imagenet_val.sh')
      assert False, 'Need to download imagenet_val_25.npz'
    f = np.load(imagenet_fn)
    X = f['X']
    y = f['y']
    class_names = f['label_map'].item()
    if num is not None:
        X = X[:num]
        y = y[:num]
    return X, y, class_names


================================================
FILE: cs231n/assignment1/cs231n/datasets/get_datasets.sh
================================================
# Get CIFAR10
wget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz -O cifar-10-python.tar.gz
tar -xzvf cifar-10-python.tar.gz
rm cifar-10-python.tar.gz 


================================================
FILE: cs231n/assignment1/cs231n/features.py
================================================
from __future__ import print_function
from builtins import zip
from builtins import range
from past.builtins import xrange

import matplotlib
import numpy as np
from scipy.ndimage import uniform_filter


def extract_features(imgs, feature_fns, verbose=False):
    """
    Given pixel data for images and several feature functions that can operate on
    single images, apply all feature functions to all images, concatenating the
    feature vectors for each image and storing the features for all images in
    a single matrix.

    Inputs:
    - imgs: N x H X W X C array of pixel data for N images.
    - feature_fns: List of k feature functions. The ith feature function should
      take as input an H x W x D array and return a (one-dimensional) array of
      length F_i.
    - verbose: Boolean; if true, print progress.

    Returns:
    An array of shape (N, F_1 + ... + F_k) where each column is the concatenation
    of all features for a single image.
    """
    num_images = imgs.shape[0]
    if num_images == 0:
        return np.array([])

    # Use the first image to determine feature dimensions
    feature_dims = []
    first_image_features = []
    for feature_fn in feature_fns:
        feats = feature_fn(imgs[0].squeeze())
        assert len(feats.shape) == 1, 'Feature functions must be one-dimensional'
        feature_dims.append(feats.size)
        first_image_features.append(feats)

    # Now that we know the dimensions of the features, we can allocate a single
    # big array to store all features as columns.
    total_feature_dim = sum(feature_dims)
    imgs_features = np.zeros((num_images, total_feature_dim))
    imgs_features[0] = np.hstack(first_image_features).T

    # Extract features for the rest of the images.
    for i in range(1, num_images):
        idx = 0
        for feature_fn, feature_dim in zip(feature_fns, feature_dims):
            next_idx = idx + feature_dim
            imgs_features[i, idx:next_idx] = feature_fn(imgs[i].squeeze())
            idx = next_idx
        if verbose and i % 1000 == 999:
            print('Done extracting features for %d / %d images' % (i+1, num_images))

    return imgs_features


def rgb2gray(rgb):
    """Convert RGB image to grayscale

      Parameters:
        rgb : RGB image

      Returns:
        gray : grayscale image

    """
    return np.dot(rgb[...,:3], [0.299, 0.587, 0.144])


def hog_feature(im):
    """Compute Histogram of Gradient (HOG) feature for an image

         Modified from skimage.feature.hog
         http://pydoc.net/Python/scikits-image/0.4.2/skimage.feature.hog

       Reference:
         Histograms of Oriented Gradients for Human Detection
         Navneet Dalal and Bill Triggs, CVPR 2005

      Parameters:
        im : an input grayscale or rgb image

      Returns:
        feat: Histogram of Gradient (HOG) feature

    """

    # convert rgb to grayscale if needed
    if im.ndim == 3:
        image = rgb2gray(im)
    else:
        image = np.at_least_2d(im)

    sx, sy = image.shape # image size
    orientations = 9 # number of gradient bins
    cx, cy = (8, 8) # pixels per cell

    gx = np.zeros(image.shape)
    gy = np.zeros(image.shape)
    gx[:, :-1] = np.diff(image, n=1, axis=1) # compute gradient on x-direction
    gy[:-1, :] = np.diff(image, n=1, axis=0) # compute gradient on y-direction
    grad_mag = np.sqrt(gx ** 2 + gy ** 2) # gradient magnitude
    grad_ori = np.arctan2(gy, (gx + 1e-15)) * (180 / np.pi) + 90 # gradient orientation

    n_cellsx = int(np.floor(sx / cx))  # number of cells in x
    n_cellsy = int(np.floor(sy / cy))  # number of cells in y
    # compute orientations integral images
    orientation_histogram = np.zeros((n_cellsx, n_cellsy, orientations))
    for i in range(orientations):
        # create new integral image for this orientation
        # isolate orientations in this range
        temp_ori = np.where(grad_ori < 180 / orientations * (i + 1),
                            grad_ori, 0)
        temp_ori = np.where(grad_ori >= 180 / orientations * i,
                            temp_ori, 0)
        # select magnitudes for those orientations
        cond2 = temp_ori > 0
        temp_mag = np.where(cond2, grad_mag, 0)
        orientation_histogram[:,:,i] = uniform_filter(temp_mag, size=(cx, cy))[round(cx/2)::cx, round(cy/2)::cy].T

    return orientation_histogram.ravel()


def color_histogram_hsv(im, nbin=10, xmin=0, xmax=255, normalized=True):
    """
    Compute color histogram for an image using hue.

    Inputs:
    - im: H x W x C array of pixel data for an RGB image.
    - nbin: Number of histogram bins. (default: 10)
    - xmin: Minimum pixel value (default: 0)
    - xmax: Maximum pixel value (default: 255)
    - normalized: Whether to normalize the histogram (default: True)

    Returns:
      1D vector of length nbin giving the color histogram over the hue of the
      input image.
    """
    ndim = im.ndim
    bins = np.linspace(xmin, xmax, nbin+1)
    hsv = matplotlib.colors.rgb_to_hsv(im/xmax) * xmax
    imhist, bin_edges = np.histogram(hsv[:,:,0], bins=bins, density=normalized)
    imhist = imhist * np.diff(bin_edges)

    # return histogram
    return imhist


# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

pass

# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****


================================================
FILE: cs231n/assignment1/cs231n/gradient_check.py
================================================
from __future__ import print_function
from builtins import range
from past.builtins import xrange

import numpy as np
from random import randrange

def eval_numerical_gradient(f, x, verbose=True, h=0.00001):
    """
    a naive implementation of numerical gradient of f at x
    - f should be a function that takes a single argument
    - x is the point (numpy array) to evaluate the gradient at
    """

    fx = f(x) # evaluate function value at original point
    grad = np.zeros_like(x)
    # iterate over all indexes in x
    it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
    while not it.finished:

        # evaluate function at x+h
        ix = it.multi_index
        oldval = x[ix]
        x[ix] = oldval + h # increment by h
        fxph = f(x) # evalute f(x + h)
        x[ix] = oldval - h
        fxmh = f(x) # evaluate f(x - h)
        x[ix] = oldval # restore

        # compute the partial derivative with centered formula
        grad[ix] = (fxph - fxmh) / (2 * h) # the slope
        if verbose:
            print(ix, grad[ix])
        it.iternext() # step to next dimension

    return grad


def eval_numerical_gradient_array(f, x, df, h=1e-5):
    """
    Evaluate a numeric gradient for a function that accepts a numpy
    array and returns a numpy array.
    """
    grad = np.zeros_like(x)
    it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
    while not it.finished:
        ix = it.multi_index

        oldval = x[ix]
        x[ix] = oldval + h
        pos = f(x).copy()
        x[ix] = oldval - h
        neg = f(x).copy()
        x[ix] = oldval

        grad[ix] = np.sum((pos - neg) * df) / (2 * h)
        it.iternext()
    return grad


def eval_numerical_gradient_blobs(f, inputs, output, h=1e-5):
    """
    Compute numeric gradients for a function that operates on input
    and output blobs.

    We assume that f accepts several input blobs as arguments, followed by a
    blob where outputs will be written. For example, f might be called like:

    f(x, w, out)

    where x and w are input Blobs, and the result of f will be written to out.

    Inputs:
    - f: function
    - inputs: tuple of input blobs
    - output: output blob
    - h: step size
    """
    numeric_diffs = []
    for input_blob in inputs:
        diff = np.zeros_like(input_blob.diffs)
        it = np.nditer(input_blob.vals, flags=['multi_index'],
                       op_flags=['readwrite'])
        while not it.finished:
            idx = it.multi_index
            orig = input_blob.vals[idx]

            input_blob.vals[idx] = orig + h
            f(*(inputs + (output,)))
            pos = np.copy(output.vals)
            input_blob.vals[idx] = orig - h
            f(*(inputs + (output,)))
            neg = np.copy(output.vals)
            input_blob.vals[idx] = orig

            diff[idx] = np.sum((pos - neg) * output.diffs) / (2.0 * h)

            it.iternext()
        numeric_diffs.append(diff)
    return numeric_diffs


def eval_numerical_gradient_net(net, inputs, output, h=1e-5):
    return eval_numerical_gradient_blobs(lambda *args: net.forward(),
                inputs, output, h=h)


def grad_check_sparse(f, x, analytic_grad, num_checks=10, h=1e-5):
    """
    sample a few random elements and only return numerical
    in this dimensions.
    """

    for i in range(num_checks):
        ix = tuple([randrange(m) for m in x.shape])

        oldval = x[ix]
        x[ix] = oldval + h # increment by h
        fxph = f(x) # evaluate f(x + h)
        x[ix] = oldval - h # increment by h
        fxmh = f(x) # evaluate f(x - h)
        x[ix] = oldval # reset

        grad_numerical = (fxph - fxmh) / (2 * h)
        grad_analytic = analytic_grad[ix]
        rel_error = (abs(grad_numerical - grad_analytic) /
                    (abs(grad_numerical) + abs(grad_analytic)))
        print('numerical: %f analytic: %f, relative error: %e'
              %(grad_numerical, grad_analytic, rel_error))


================================================
FILE: cs231n/assignment1/cs231n/vis_utils.py
================================================
from builtins import range
from past.builtins import xrange

from math import sqrt, ceil
import numpy as np

def visualize_grid(Xs, ubound=255.0, padding=1):
    """
    Reshape a 4D tensor of image data to a grid for easy visualization.

    Inputs:
    - Xs: Data of shape (N, H, W, C)
    - ubound: Output grid will have values scaled to the range [0, ubound]
    - padding: The number of blank pixels between elements of the grid
    """
    (N, H, W, C) = Xs.shape
    grid_size = int(ceil(sqrt(N)))
    grid_height = H * grid_size + padding * (grid_size - 1)
    grid_width = W * grid_size + padding * (grid_size - 1)
    grid = np.zeros((grid_height, grid_width, C))
    next_idx = 0
    y0, y1 = 0, H
    for y in range(grid_size):
        x0, x1 = 0, W
        for x in range(grid_size):
            if next_idx < N:
                img = Xs[next_idx]
                low, high = np.min(img), np.max(img)
                grid[y0:y1, x0:x1] = ubound * (img - low) / (high - low)
                # grid[y0:y1, x0:x1] = Xs[next_idx]
                next_idx += 1
            x0 += W + padding
            x1 += W + padding
        y0 += H + padding
        y1 += H + padding
    # grid_max = np.max(grid)
    # grid_min = np.min(grid)
    # grid = ubound * (grid - grid_min) / (grid_max - grid_min)
    return grid

def vis_grid(Xs):
    """ visualize a grid of images """
    (N, H, W, C) = Xs.shape
    A = int(ceil(sqrt(N)))
    G = np.ones((A*H+A, A*W+A, C), Xs.dtype)
    G *= np.min(Xs)
    n = 0
    for y in range(A):
        for x in range(A):
            if n < N:
                G[y*H+y:(y+1)*H+y, x*W+x:(x+1)*W+x, :] = Xs[n,:,:,:]
                n += 1
    # normalize to [0,1]
    maxg = G.max()
    ming = G.min()
    G = (G - ming)/(maxg-ming)
    return G

def vis_nn(rows):
    """ visualize array of arrays of images """
    N = len(rows)
    D = len(rows[0])
    H,W,C = rows[0][0].shape
    Xs = rows[0][0]
    G = np.ones((N*H+N, D*W+D, C), Xs.dtype)
    for y in range(N):
        for x in range(D):
            G[y*H+y:(y+1)*H+y, x*W+x:(x+1)*W+x, :] = rows[y][x]
    # normalize to [0,1]
    maxg = G.max()
    ming = G.min()
    G = (G - ming)/(maxg-ming)
    return G


================================================
FILE: cs231n/assignment1/features.ipynb
================================================
{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"features.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"x4FJ_QKSt97H","executionInfo":{"status":"ok","timestamp":1616336945540,"user_tz":-60,"elapsed":33043,"user":{"displayName":"Soufian Benamara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gj7-UwGIuLvBwNdi62Q2pMRjoHrgtEm3LZkyGEWZw=s64","userId":"08596286217915945464"}},"outputId":"2f1382c6-55d7-4fc1-effa-a1b49dfc4854"},"source":["from google.colab import drive\n","\n","drive.mount('/content/drive', force_remount=True)\n","\n","# enter the foldername in your Drive where you have saved the unzipped\n","# 'cs231n' folder containing the '.py', 'classifiers' and 'datasets'\n","# folders.\n","# e.g. 'cs231n/assignments/assignment1/cs231n/'\n","FOLDERNAME = 'cs231n/assignments/assignment1/cs231n/'\n","\n","assert FOLDERNAME is not None, \"[!] Enter the foldername.\"\n","\n","%cd drive/My\\ Drive\n","%cp -r $FOLDERNAME ../../\n","%cd ../../\n","%cd cs231n/datasets/\n","!bash get_datasets.sh\n","%cd ../../"],"execution_count":1,"outputs":[{"output_type":"stream","text":["Mounted at /content/drive\n","/content/drive/My Drive\n","/content\n","/content/cs231n/datasets\n","--2021-03-21 14:28:59--  http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\n","Resolving www.cs.toronto.edu (www.cs.toronto.edu)... 128.100.3.30\n","Connecting to www.cs.toronto.edu (www.cs.toronto.edu)|128.100.3.30|:80... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 170498071 (163M) [application/x-gzip]\n","Saving to: ‘cifar-10-python.tar.gz’\n","\n","cifar-10-python.tar 100%[===================>] 162.60M  61.2MB/s    in 2.7s    \n","\n","2021-03-21 14:29:02 (61.2 MB/s) - ‘cifar-10-python.tar.gz’ saved [170498071/170498071]\n","\n","cifar-10-batches-py/\n","cifar-10-batches-py/data_batch_4\n","cifar-10-batches-py/readme.html\n","cifar-10-batches-py/test_batch\n","cifar-10-batches-py/data_batch_3\n","cifar-10-batches-py/batches.meta\n","cifar-10-batches-py/data_batch_2\n","cifar-10-batches-py/data_batch_5\n","cifar-10-batches-py/data_batch_1\n","/content\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"tags":["pdf-title"],"id":"GFLgyN93t97O"},"source":["# Image features exercise\n","*Complete and hand in this completed worksheet (including its outputs and any supporting code outside of the worksheet) with your assignment submission. For more details see the [assignments page](http://vision.stanford.edu/teaching/cs231n/assignments.html) on the course website.*\n","\n","We have seen that we can achieve reasonable performance on an image classification task by training a linear classifier on the pixels of the input image. In this exercise we will show that we can improve our classification performance by training linear classifiers not on raw pixels but on features that are computed from the raw pixels.\n","\n","All of your work for this exercise will be done in this notebook."]},{"cell_type":"code","metadata":{"tags":["pdf-ignore"],"id":"skxP_7nlt97P","executionInfo":{"status":"ok","timestamp":1616336951293,"user_tz":-60,"elapsed":620,"user":{"displayName":"Soufian Benamara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gj7-UwGIuLvBwNdi62Q2pMRjoHrgtEm3LZkyGEWZw=s64","userId":"08596286217915945464"}}},"source":["import random\n","import numpy as np\n","from cs231n.data_utils import load_CIFAR10\n","import matplotlib.pyplot as plt\n","\n","\n","%matplotlib inline\n","plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots\n","plt.rcParams['image.interpolation'] = 'nearest'\n","plt.rcParams['image.cmap'] = 'gray'\n","\n","# for auto-reloading extenrnal modules\n","# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython\n","%load_ext autoreload\n","%autoreload 2"],"execution_count":2,"outputs":[]},{"cell_type":"markdown","metadata":{"tags":["pdf-ignore"],"id":"PIm_jpxDt97Q"},"source":["## Load data\n","Similar to previous exercises, we will load CIFAR-10 data from disk."]},{"cell_type":"code","metadata":{"tags":["pdf-ignore"],"id":"0sDu4RUzt97Q","executionInfo":{"status":"ok","timestamp":1616336961633,"user_tz":-60,"elapsed":2776,"user":{"displayName":"Soufian Benamara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gj7-UwGIuLvBwNdi62Q2pMRjoHrgtEm3LZkyGEWZw=s64","userId":"08596286217915945464"}}},"source":["from cs231n.features import color_histogram_hsv, hog_feature\n","\n","def get_CIFAR10_data(num_training=49000, num_validation=1000, num_test=1000):\n","    # Load the raw CIFAR-10 data\n","    cifar10_dir = 'cs231n/datasets/cifar-10-batches-py'\n","\n","    # Cleaning up variables to prevent loading data multiple times (which may cause memory issue)\n","    try:\n","       del X_train, y_train\n","       del X_test, y_test\n","       print('Clear previously loaded data.')\n","    except:\n","       pass\n","\n","    X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir)\n","    \n","    # Subsample the data\n","    mask = list(range(num_training, num_training + num_validation))\n","    X_val = X_train[mask]\n","    y_val = y_train[mask]\n","    mask = list(range(num_training))\n","    X_train = X_train[mask]\n","    y_train = y_train[mask]\n","    mask = list(range(num_test))\n","    X_test = X_test[mask]\n","    y_test = y_test[mask]\n","    \n","    return X_train, y_train, X_val, y_val, X_test, y_test\n","\n","X_train, y_train, X_val, y_val, X_test, y_test = get_CIFAR10_data()"],"execution_count":3,"outputs":[]},{"cell_type":"markdown","metadata":{"tags":["pdf-ignore"],"id":"P-R35dUyt97Q"},"source":["## Extract Features\n","For each image we will compute a Histogram of Oriented\n","Gradients (HOG) as well as a color histogram using the hue channel in HSV\n","color space. We form our final feature vector for each image by concatenating\n","the HOG and color histogram feature vectors.\n","\n","Roughly speaking, HOG should capture the texture of the image while ignoring\n","color information, and the color histogram represents the color of the input\n","image while ignoring texture. As a result, we expect that using both together\n","ought to work better than using either alone. Verifying this assumption would\n","be a good thing to try for your own interest.\n","\n","The `hog_feature` and `color_histogram_hsv` functions both operate on a single\n","image and return a feature vector for that image. The extract_features\n","function takes a set of images and a list of feature functions and evaluates\n","each feature function on each image, storing the results in a matrix where\n","each column is the concatenation of all feature vectors for a single image."]},{"cell_type":"code","metadata":{"scrolled":true,"tags":["pdf-ignore"],"colab":{"base_uri":"https://localhost:8080/"},"id":"SSU9t4v7t97S","executionInfo":{"status":"ok","timestamp":1616337031550,"user_tz":-60,"elapsed":60354,"user":{"displayName":"Soufian Benamara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gj7-UwGIuLvBwNdi62Q2pMRjoHrgtEm3LZkyGEWZw=s64","userId":"08596286217915945464"}},"outputId":"f8db031a-24df-441a-e436-889fbc78b35e"},"source":["from cs231n.features import *\n","\n","num_color_bins = 20 # Number of bins in the color histogram (Changed from original value: 10)\n","feature_fns = [hog_feature, lambda img: color_histogram_hsv(img, nbin=num_color_bins)]\n","X_train_feats = extract_features(X_train, feature_fns, verbose=True)\n","X_val_feats = extract_features(X_val, feature_fns)\n","X_test_feats = extract_features(X_test, feature_fns)\n","\n","# Preprocessing: Subtract the mean feature\n","mean_feat = np.mean(X_train_feats, axis=0, keepdims=True)\n","X_train_feats -= mean_feat\n","X_val_feats -= mean_feat\n","X_test_feats -= mean_feat\n","\n","# Preprocessing: Divide by standard deviation. This ensures that each feature\n","# has roughly the same scale.\n","std_feat = np.std(X_train_feats, axis=0, keepdims=True)\n","X_train_feats /= std_feat\n","X_val_feats /= std_feat\n","X_test_feats /= std_feat\n","\n","# Preprocessing: Add a bias dimension\n","X_train_feats = np.hstack([X_train_feats, np.ones((X_train_feats.shape[0], 1))])\n","X_val_feats = np.hstack([X_val_feats, np.ones((X_val_feats.shape[0], 1))])\n","X_test_feats = np.hstack([X_test_feats, np.ones((X_test_feats.shape[0], 1))])"],"execution_count":4,"outputs":[{"output_type":"stream","text":["Done extracting features for 1000 / 49000 images\n","Done extracting features for 2000 / 49000 images\n","Done extracting features for 3000 / 49000 images\n","Done extracting features for 4000 / 49000 images\n","Done extracting features for 5000 / 49000 images\n","Done extracting features for 6000 / 49000 images\n","Done extracting features for 7000 / 49000 images\n","Done extracting features for 8000 / 49000 images\n","Done extracting features for 9000 / 49000 images\n","Done extracting features for 10000 / 49000 images\n","Done extracting features for 11000 / 49000 images\n","Done extracting features for 12000 / 49000 images\n","Done extracting features for 13000 / 49000 images\n","Done extracting features for 14000 / 49000 images\n","Done extracting features for 15000 / 49000 images\n","Done extracting features for 16000 / 49000 images\n","Done extracting features for 17000 / 49000 images\n","Done extracting features for 18000 / 49000 images\n","Done extracting features for 19000 / 49000 images\n","Done extracting features for 20000 / 49000 images\n","Done extracting features for 21000 / 49000 images\n","Done extracting features for 22000 / 49000 images\n","Done extracting features for 23000 / 49000 images\n","Done extracting features for 24000 / 49000 images\n","Done extracting features for 25000 / 49000 images\n","Done extracting features for 26000 / 49000 images\n","Done extracting features for 27000 / 49000 images\n","Done extracting features for 28000 / 49000 images\n","Done extracting features for 29000 / 49000 images\n","Done extracting features for 30000 / 49000 images\n","Done extracting features for 31000 / 49000 images\n","Done extracting features for 32000 / 49000 images\n","Done extracting features for 33000 / 49000 images\n","Done extracting features for 34000 / 49000 images\n","Done extracting features for 35000 / 49000 images\n","Done extracting features for 36000 / 49000 images\n","Done extracting features for 37000 / 49000 images\n","Done extracting features for 38000 / 49000 images\n","Done extracting features for 39000 / 49000 images\n","Done extracting features for 40000 / 49000 images\n","Done extracting features for 41000 / 49000 images\n","Done extracting features for 42000 / 49000 images\n","Done extracting features for 43000 / 49000 images\n","Done extracting features for 44000 / 49000 images\n","Done extracting features for 45000 / 49000 images\n","Done extracting features for 46000 / 49000 images\n","Done extracting features for 47000 / 49000 images\n","Done extracting features for 48000 / 49000 images\n","Done extracting features for 49000 / 49000 images\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"fPDBygbjt97S"},"source":["## Train SVM on features\n","Using the multiclass SVM code developed earlier in the assignment, train SVMs on top of the features extracted above; this should achieve better results than training SVMs directly on top of raw pixels."]},{"cell_type":"code","metadata":{"tags":["code"],"colab":{"base_uri":"https://localhost:8080/"},"id":"1KC8Xhvzt97T","executionInfo":{"status":"ok","timestamp":1616337059111,"user_tz":-60,"elapsed":1988,"user":{"displayName":"Soufian Benamara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gj7-UwGIuLvBwNdi62Q2pMRjoHrgtEm3LZkyGEWZw=s64","userId":"08596286217915945464"}},"outputId":"04859090-c05b-4d56-8436-acb9be78139c"},"source":["# Use the validation set to tune the learning rate and regularization strength\n","\n","from cs231n.classifiers.linear_classifier import LinearSVM\n","\n","learning_rates = [1e-8]\n","regularization_strengths = [1e6]\n","\n","results = {}\n","best_val = -1\n","best_svm = None\n","\n","################################################################################\n","# TODO:                                                                        #\n","# Use the validation set to set the learning rate and regularization strength. #\n","# This should be identical to the validation that you did for the SVM; save    #\n","# the best trained classifer in best_svm. You might also want to play          #\n","# with different numbers of bins in the color histogram. If you are careful    #\n","# you should be able to get accuracy of near 0.44 on the validation set.       #\n","################################################################################\n","# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****\n","\n","# Tested numbers of bins in the color histogram:\n","# num_color_bins = 10, best validation accuracy: 0.417\n","# num_color_bins = 15, best validation accuracy: 0.432\n","# num_color_bins = 20, best validation accuracy: 0.430\n","# num_color_bins = 25, best validation accuracy: 0.423\n","\n","for lr in learning_rates:\n","  for rs in regularization_strengths:\n","    svm = LinearSVM()\n","    loss_hist = svm.train(X_train_feats, y_train, learning_rate=lr, reg=rs,\n","                          num_iters=2000, verbose=False)\n","\n","    y_train_pred = svm.predict(X_train_feats)\n","    training_accuracy = np.mean(y_train == y_train_pred)\n","\n","    y_val_pred = svm.predict(X_val_feats)\n","    validation_accuracy = np.mean(y_val == y_val_pred)\n","\n","    results[(lr, rs)] = (training_accuracy, validation_accuracy)\n","\n","    if validation_accuracy > best_val:\n","      best_val = validation_accuracy\n","      best_svm = svm\n","\n","# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****\n","\n","# Print out results.\n","for lr, reg in sorted(results):\n","    train_accuracy, val_accuracy = results[(lr, reg)]\n","    print('lr %e reg %e train accuracy: %f val accuracy: %f' % (\n","                lr, reg, train_accuracy, val_accuracy))\n","    \n","print('best validation accuracy achieved during cross-validation: %f' % best_val)"],"execution_count":7,"outputs":[{"output_type":"stream","text":["lr 1.000000e-08 reg 1.000000e+06 train accuracy: 0.419776 val accuracy: 0.437000\n","best validation accuracy achieved during cross-validation: 0.437000\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"svm_test_accuracy","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1616337078469,"user_tz":-60,"elapsed":679,"user":{"displayName":"Soufian Benamara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gj7-UwGIuLvBwNdi62Q2pMRjoHrgtEm3LZkyGEWZw=s64","userId":"08596286217915945464"}},"outputId":"3e64d1d1-7754-46ca-bcb9-afcd8991e8ad"},"source":["# Evaluate your trained SVM on the test set: you should be able to get at least 0.40\n","y_test_pred = best_svm.predict(X_test_feats)\n","test_accuracy = np.mean(y_test == y_test_pred)\n","print(test_accuracy)"],"execution_count":8,"outputs":[{"output_type":"stream","text":["0.418\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":482},"id":"cFzozd1zt97U","executionInfo":{"status":"ok","timestamp":1616337088495,"user_tz":-60,"elapsed":3409,"user":{"displayName":"Soufian Benamara","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14Gj7-UwGIuLvBwNdi62Q2pMRjoHrgtEm3LZkyGEWZw=s64","userId":"08596286217915945464"}},"outputId":"e5931541-445d-48a9-9ddc-62aa1d4edc49"},"source":["# An important way to gain intuition about how an algorithm works is to\n","# visualize the mistakes that it makes. In this visualization, we show examples\n","# of images that are misclassified by our current system. The first column\n","# shows images that our system labeled as \"plane\" but whose true label is\n","# something other than \"plane\".\n","\n","examples_per_class = 8\n","classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']\n","for cls, cls_name in enumerate(classes):\n","    idxs = np.where((y_test != cls) & (y_test_pred == cls))[0]\n","    idxs = np.random.choice(idxs, examples_per_class, replace=False)\n","    for i, idx in enumerate(idxs):\n","        plt.subplot(examples_per_class, len(classes), i * len(classes) + cls + 1)\n","        plt.imshow(X_test[idx].astype('uint8'))\n","        plt.axis('off')\n","        if i == 0:\n","            plt.title(cls_name)\n","plt.show()"],"execution_count":9,"outputs":[{"output_type":"display_data","data":{"image/png":"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
Download .txt
gitextract_4rfjadju/

├── README.md
├── cs231n/
│   ├── assignment1/
│   │   ├── README.md
│   │   ├── cs231n/
│   │   │   ├── __init__.py
│   │   │   ├── classifiers/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── k_nearest_neighbor.py
│   │   │   │   ├── linear_classifier.py
│   │   │   │   ├── linear_svm.py
│   │   │   │   ├── neural_net.py
│   │   │   │   └── softmax.py
│   │   │   ├── data_utils.py
│   │   │   ├── datasets/
│   │   │   │   └── get_datasets.sh
│   │   │   ├── features.py
│   │   │   ├── gradient_check.py
│   │   │   └── vis_utils.py
│   │   ├── features.ipynb
│   │   ├── knn.ipynb
│   │   ├── requirements.txt
│   │   ├── softmax.ipynb
│   │   ├── svm.ipynb
│   │   └── two_layer_net.ipynb
│   ├── assignment2/
│   │   ├── BatchNormalization.ipynb
│   │   ├── ConvolutionalNetworks.ipynb
│   │   ├── Dropout.ipynb
│   │   ├── FullyConnectedNets.ipynb
│   │   ├── PyTorch.ipynb
│   │   ├── README.md
│   │   ├── cs231n/
│   │   │   ├── __init__.py
│   │   │   ├── build/
│   │   │   │   └── temp.linux-x86_64-3.6/
│   │   │   │       └── im2col_cython.o
│   │   │   ├── classifiers/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── cnn.py
│   │   │   │   └── fc_net.py
│   │   │   ├── data_utils.py
│   │   │   ├── datasets/
│   │   │   │   └── get_datasets.sh
│   │   │   ├── fast_layers.py
│   │   │   ├── gradient_check.py
│   │   │   ├── im2col.py
│   │   │   ├── im2col_cython.c
│   │   │   ├── im2col_cython.pyx
│   │   │   ├── layer_utils.py
│   │   │   ├── layers.py
│   │   │   ├── optim.py
│   │   │   ├── setup.py
│   │   │   ├── solver.py
│   │   │   └── vis_utils.py
│   │   └── requirements.txt
│   └── assignment3/
│       ├── Generative_Adversarial_Networks_PyTorch.ipynb
│       ├── LSTM_Captioning.ipynb
│       ├── NetworkVisualization-PyTorch.ipynb
│       ├── README.md
│       ├── RNN_Captioning.ipynb
│       ├── StyleTransfer-PyTorch.ipynb
│       ├── cs231n/
│       │   ├── __init__.py
│       │   ├── captioning_solver.py
│       │   ├── classifiers/
│       │   │   ├── __init__.py
│       │   │   ├── rnn.py
│       │   │   └── squeezenet.py
│       │   ├── coco_utils.py
│       │   ├── data_utils.py
│       │   ├── datasets/
│       │   │   ├── get_assignment3_data.sh
│       │   │   ├── get_coco_captioning.sh
│       │   │   ├── get_dataset.sh
│       │   │   ├── get_datasets.sh
│       │   │   ├── get_imagenet_val.sh
│       │   │   └── get_squeezenet_tf.sh
│       │   ├── fast_layers.py
│       │   ├── gan_pytorch.py
│       │   ├── gradient_check.py
│       │   ├── im2col.py
│       │   ├── im2col_cython.pyx
│       │   ├── image_utils.py
│       │   ├── layer_utils.py
│       │   ├── layers.py
│       │   ├── net_visualization_pytorch.py
│       │   ├── optim.py
│       │   ├── rnn_layers.py
│       │   ├── setup.py
│       │   └── style_transfer_pytorch.py
│       ├── requirements.txt
│       └── style-transfer-checks.npz
└── eecs498-007/
    ├── A4/
    │   ├── README.md
    │   ├── a4_helper.py
    │   ├── eecs598/
    │   │   ├── __init__.py
    │   │   ├── data.py
    │   │   ├── grad.py
    │   │   ├── solver.py
    │   │   ├── submit.py
    │   │   ├── utils.py
    │   │   └── vis.py
    │   ├── network_visualization.ipynb
    │   ├── network_visualization.py
    │   ├── pytorch_autograd_and_nn.ipynb
    │   ├── pytorch_autograd_and_nn.pkl
    │   ├── pytorch_autograd_and_nn.py
    │   ├── rnn_lstm_attention_captioning.ipynb
    │   ├── rnn_lstm_attention_captioning.py
    │   ├── rnn_lstm_attention_submission.pkl
    │   ├── style_transfer.ipynb
    │   └── style_transfer.py
    ├── A5/
    │   ├── README.md
    │   ├── a5_helper.py
    │   ├── eecs598/
    │   │   ├── __init__.py
    │   │   ├── data.py
    │   │   ├── grad.py
    │   │   ├── solver.py
    │   │   ├── submit.py
    │   │   ├── utils.py
    │   │   └── vis.py
    │   ├── frcnn_detector.pt
    │   ├── single_stage_detector.py
    │   ├── single_stage_detector_yolo.ipynb
    │   ├── two_stage_detector.py
    │   ├── two_stage_detector_faster_rcnn.ipynb
    │   └── yolo_detector.pt
    └── A6/
        ├── README.md
        ├── a6_helper.py
        ├── eecs598/
        │   ├── __init__.py
        │   ├── data.py
        │   ├── grad.py
        │   ├── solver.py
        │   ├── submit.py
        │   ├── utils.py
        │   └── vis.py
        ├── gan.py
        ├── generative_adversarial_networks.ipynb
        ├── vae.py
        └── variational_autoencoders.ipynb
Download .txt
SYMBOL INDEX (1101 symbols across 66 files)

FILE: cs231n/assignment1/cs231n/classifiers/k_nearest_neighbor.py
  class KNearestNeighbor (line 7) | class KNearestNeighbor(object):
    method __init__ (line 10) | def __init__(self):
    method train (line 13) | def train(self, X, y):
    method predict (line 27) | def predict(self, X, k=1, num_loops=0):
    method compute_distances_two_loops (line 53) | def compute_distances_two_loops(self, X):
    method compute_distances_one_loop (line 88) | def compute_distances_one_loop(self, X):
    method compute_distances_no_loops (line 112) | def compute_distances_no_loops(self, X):
    method predict_labels (line 150) | def predict_labels(self, dists, k=1):

FILE: cs231n/assignment1/cs231n/classifiers/linear_classifier.py
  class LinearClassifier (line 11) | class LinearClassifier(object):
    method __init__ (line 13) | def __init__(self):
    method train (line 16) | def train(self, X, y, learning_rate=1e-3, reg=1e-5, num_iters=100,
    method predict (line 86) | def predict(self, X):
    method loss (line 113) | def loss(self, X_batch, y_batch, reg):
  class LinearSVM (line 131) | class LinearSVM(LinearClassifier):
    method loss (line 134) | def loss(self, X_batch, y_batch, reg):
  class Softmax (line 138) | class Softmax(LinearClassifier):
    method loss (line 141) | def loss(self, X_batch, y_batch, reg):

FILE: cs231n/assignment1/cs231n/classifiers/linear_svm.py
  function svm_loss_naive (line 6) | def svm_loss_naive(W, X, y, reg):
  function svm_loss_vectorized (line 72) | def svm_loss_vectorized(W, X, y, reg):

FILE: cs231n/assignment1/cs231n/classifiers/neural_net.py
  class TwoLayerNet (line 9) | class TwoLayerNet(object):
    method __init__ (line 24) | def __init__(self, input_size, hidden_size, output_size, std=1e-4):
    method loss (line 46) | def loss(self, X, y=None, reg=0.0):
    method train (line 145) | def train(self, X, y, X_val, y_val,
    method predict (line 229) | def predict(self, X):

FILE: cs231n/assignment1/cs231n/classifiers/softmax.py
  function softmax_loss_naive (line 6) | def softmax_loss_naive(W, X, y, reg):
  function softmax_loss_vectorized (line 69) | def softmax_loss_vectorized(W, X, y, reg):

FILE: cs231n/assignment1/cs231n/data_utils.py
  function load_pickle (line 10) | def load_pickle(f):
  function load_CIFAR_batch (line 18) | def load_CIFAR_batch(filename):
  function load_CIFAR10 (line 28) | def load_CIFAR10(ROOT):
  function get_CIFAR10_data (line 44) | def get_CIFAR10_data(num_training=49000, num_validation=1000, num_test=1...
  function load_tiny_imagenet (line 86) | def load_tiny_imagenet(path, dtype=np.float32, subtract_mean=True):
  function load_models (line 214) | def load_models(models_dir):
  function load_imagenet_val (line 237) | def load_imagenet_val(num=None):

FILE: cs231n/assignment1/cs231n/features.py
  function extract_features (line 11) | def extract_features(imgs, feature_fns, verbose=False):
  function rgb2gray (line 61) | def rgb2gray(rgb):
  function hog_feature (line 74) | def hog_feature(im):
  function color_histogram_hsv (line 128) | def color_histogram_hsv(im, nbin=10, xmin=0, xmax=255, normalized=True):

FILE: cs231n/assignment1/cs231n/gradient_check.py
  function eval_numerical_gradient (line 8) | def eval_numerical_gradient(f, x, verbose=True, h=0.00001):
  function eval_numerical_gradient_array (line 39) | def eval_numerical_gradient_array(f, x, df, h=1e-5):
  function eval_numerical_gradient_blobs (line 61) | def eval_numerical_gradient_blobs(f, inputs, output, h=1e-5):
  function eval_numerical_gradient_net (line 103) | def eval_numerical_gradient_net(net, inputs, output, h=1e-5):
  function grad_check_sparse (line 108) | def grad_check_sparse(f, x, analytic_grad, num_checks=10, h=1e-5):

FILE: cs231n/assignment1/cs231n/vis_utils.py
  function visualize_grid (line 7) | def visualize_grid(Xs, ubound=255.0, padding=1):
  function vis_grid (line 41) | def vis_grid(Xs):
  function vis_nn (line 59) | def vis_nn(rows):

FILE: cs231n/assignment2/cs231n/classifiers/cnn.py
  class ThreeLayerConvNet (line 9) | class ThreeLayerConvNet(object):
    method __init__ (line 20) | def __init__(
    method loss (line 90) | def loss(self, X, y=None):

FILE: cs231n/assignment2/cs231n/classifiers/fc_net.py
  class TwoLayerNet (line 9) | class TwoLayerNet(object):
    method __init__ (line 25) | def __init__(
    method loss (line 69) | def loss(self, X, y=None):
  function affine_norm_relu_forward (line 151) | def affine_norm_relu_forward(x, w, b, gamma, beta, n_param, normalization):
  function affine_norm_relu_backward (line 180) | def affine_norm_relu_backward(dout, cache, normalization):
  class FullyConnectedNet (line 203) | class FullyConnectedNet(object):
    method __init__ (line 219) | def __init__(
    method loss (line 324) | def loss(self, X, y=None):

FILE: cs231n/assignment2/cs231n/data_utils.py
  function load_pickle (line 11) | def load_pickle(f):
  function load_CIFAR_batch (line 20) | def load_CIFAR_batch(filename):
  function load_CIFAR10 (line 31) | def load_CIFAR10(ROOT):
  function get_CIFAR10_data (line 47) | def get_CIFAR10_data(
  function load_tiny_imagenet (line 95) | def load_tiny_imagenet(path, dtype=np.float32, subtract_mean=True):
  function load_models (line 220) | def load_models(models_dir):
  function load_imagenet_val (line 243) | def load_imagenet_val(num=None):

FILE: cs231n/assignment2/cs231n/fast_layers.py
  function conv_forward_im2col (line 16) | def conv_forward_im2col(x, w, b, conv_param):
  function conv_forward_strides (line 45) | def conv_forward_strides(x, w, b, conv_param):
  function conv_backward_strides (line 88) | def conv_backward_strides(dout, cache):
  function conv_backward_im2col (line 108) | def conv_backward_im2col(dout, cache):
  function max_pool_forward_fast (line 143) | def max_pool_forward_fast(x, pool_param):
  function max_pool_backward_fast (line 167) | def max_pool_backward_fast(dout, cache):
  function max_pool_forward_reshape (line 183) | def max_pool_forward_reshape(x, pool_param):
  function max_pool_backward_reshape (line 205) | def max_pool_backward_reshape(dout, cache):
  function max_pool_forward_im2col (line 236) | def max_pool_forward_im2col(x, pool_param):
  function max_pool_backward_im2col (line 263) | def max_pool_backward_im2col(dout, cache):

FILE: cs231n/assignment2/cs231n/gradient_check.py
  function eval_numerical_gradient (line 9) | def eval_numerical_gradient(f, x, verbose=True, h=0.00001):
  function eval_numerical_gradient_array (line 40) | def eval_numerical_gradient_array(f, x, df, h=1e-5):
  function eval_numerical_gradient_blobs (line 62) | def eval_numerical_gradient_blobs(f, inputs, output, h=1e-5):
  function eval_numerical_gradient_net (line 103) | def eval_numerical_gradient_net(net, inputs, output, h=1e-5):
  function grad_check_sparse (line 109) | def grad_check_sparse(f, x, analytic_grad, num_checks=10, h=1e-5):

FILE: cs231n/assignment2/cs231n/im2col.py
  function get_im2col_indices (line 5) | def get_im2col_indices(x_shape, field_height, field_width, padding=1, st...
  function im2col_indices (line 26) | def im2col_indices(x, field_height, field_width, padding=1, stride=1):
  function col2im_indices (line 40) | def col2im_indices(cols, x_shape, field_height=3, field_width=3, padding...

FILE: cs231n/assignment2/cs231n/im2col_cython.c
  type PyObject (line 360) | typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *co...
  type PyObject (line 361) | typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, ...
  type Py_tss_t (line 402) | typedef int Py_tss_t;
  function CYTHON_INLINE (line 403) | static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) {
  function CYTHON_INLINE (line 407) | static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) {
  function CYTHON_INLINE (line 412) | static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) {
  function CYTHON_INLINE (line 415) | static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) {
  function CYTHON_INLINE (line 418) | static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) {
  function CYTHON_INLINE (line 422) | static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) {
  function CYTHON_INLINE (line 425) | static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
  type Py_hash_t (line 562) | typedef long Py_hash_t;
  type __Pyx_PyAsyncMethodsStruct (line 585) | typedef struct {
  function CYTHON_INLINE (line 599) | static CYTHON_INLINE float __PYX_NAN() {
  type __Pyx_StringTabEntry (line 645) | typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const c...
  function CYTHON_INLINE (line 666) | static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t l...
  function CYTHON_INLINE (line 715) | static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) {
  function __Pyx_init_sys_getdefaultencoding_params (line 747) | static int __Pyx_init_sys_getdefaultencoding_params(void) {
  function __Pyx_init_sys_getdefaultencoding_params (line 797) | static int __Pyx_init_sys_getdefaultencoding_params(void) {
  function CYTHON_INLINE (line 829) | static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void...
  type __Pyx_StructField_ (line 874) | struct __Pyx_StructField_
  type __Pyx_TypeInfo (line 876) | typedef struct {
  type __Pyx_StructField (line 886) | typedef struct __Pyx_StructField_ {
  type __Pyx_BufFmt_StackElem (line 891) | typedef struct {
  type __Pyx_BufFmt_Context (line 895) | typedef struct {
  type __pyx_atomic_int_type (line 956) | typedef volatile __pyx_atomic_int_type __pyx_atomic_int;
  type __pyx_memoryview_obj (line 970) | struct __pyx_memoryview_obj
  type __Pyx_memviewslice (line 971) | typedef struct {
  type npy_int8 (line 988) | typedef npy_int8 __pyx_t_5numpy_int8_t;
  type npy_int16 (line 997) | typedef npy_int16 __pyx_t_5numpy_int16_t;
  type npy_int32 (line 1006) | typedef npy_int32 __pyx_t_5numpy_int32_t;
  type npy_int64 (line 1015) | typedef npy_int64 __pyx_t_5numpy_int64_t;
  type npy_uint8 (line 1024) | typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  type npy_uint16 (line 1033) | typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  type npy_uint32 (line 1042) | typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  type npy_uint64 (line 1051) | typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  type npy_float32 (line 1060) | typedef npy_float32 __pyx_t_5numpy_float32_t;
  type npy_float64 (line 1069) | typedef npy_float64 __pyx_t_5numpy_float64_t;
  type npy_long (line 1078) | typedef npy_long __pyx_t_5numpy_int_t;
  type npy_longlong (line 1087) | typedef npy_longlong __pyx_t_5numpy_long_t;
  type npy_longlong (line 1096) | typedef npy_longlong __pyx_t_5numpy_longlong_t;
  type npy_ulong (line 1105) | typedef npy_ulong __pyx_t_5numpy_uint_t;
  type npy_ulonglong (line 1114) | typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
  type npy_ulonglong (line 1123) | typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  type npy_intp (line 1132) | typedef npy_intp __pyx_t_5numpy_intp_t;
  type npy_uintp (line 1141) | typedef npy_uintp __pyx_t_5numpy_uintp_t;
  type npy_double (line 1150) | typedef npy_double __pyx_t_5numpy_float_t;
  type npy_double (line 1159) | typedef npy_double __pyx_t_5numpy_double_t;
  type npy_longdouble (line 1168) | typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
  type std (line 1172) | typedef ::std::complex< float > __pyx_t_float_complex;
  type __pyx_t_float_complex (line 1174) | typedef float _Complex __pyx_t_float_complex;
  type __pyx_t_float_complex (line 1177) | typedef struct { float real, imag; } __pyx_t_float_complex;
  type std (line 1184) | typedef ::std::complex< double > __pyx_t_double_complex;
  type __pyx_t_double_complex (line 1186) | typedef double _Complex __pyx_t_double_complex;
  type __pyx_t_double_complex (line 1189) | typedef struct { double real, imag; } __pyx_t_double_complex;
  type __pyx_array_obj (line 1195) | struct __pyx_array_obj
  type __pyx_MemviewEnum_obj (line 1196) | struct __pyx_MemviewEnum_obj
  type __pyx_memoryview_obj (line 1197) | struct __pyx_memoryview_obj
  type __pyx_memoryviewslice_obj (line 1198) | struct __pyx_memoryviewslice_obj
  type npy_cfloat (line 1207) | typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  type npy_cdouble (line 1216) | typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  type npy_clongdouble (line 1225) | typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
  type npy_cdouble (line 1234) | typedef npy_cdouble __pyx_t_5numpy_complex_t;
  type __pyx_array_obj (line 1243) | struct __pyx_array_obj {
  type __pyx_MemviewEnum_obj (line 1268) | struct __pyx_MemviewEnum_obj {
  type __pyx_memoryview_obj (line 1281) | struct __pyx_memoryview_obj {
  type __pyx_memoryviewslice_obj (line 1304) | struct __pyx_memoryviewslice_obj {
  type __pyx_vtabstruct_array (line 1322) | struct __pyx_vtabstruct_array {
  type __pyx_vtabstruct_array (line 1325) | struct __pyx_vtabstruct_array
  type __pyx_vtabstruct_memoryview (line 1336) | struct __pyx_vtabstruct_memoryview {
  type __pyx_vtabstruct_memoryview (line 1345) | struct __pyx_vtabstruct_memoryview
  type __pyx_vtabstruct__memoryviewslice (line 1356) | struct __pyx_vtabstruct__memoryviewslice {
  type __pyx_vtabstruct__memoryviewslice (line 1359) | struct __pyx_vtabstruct__memoryviewslice
  type __Pyx_RefNannyAPIStruct (line 1367) | typedef struct {
  function CYTHON_INLINE (line 1470) | static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObjec...
  function CYTHON_INLINE (line 1646) | static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
  type __pyx_array_obj (line 1807) | struct __pyx_array_obj
  function CYTHON_INLINE (line 1812) | static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s...
  function CYTHON_INLINE (line 1816) | static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char ...
  function CYTHON_INLINE (line 1820) | static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char ...
  function CYTHON_INLINE (line 1861) | static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject*...
  function CYTHON_INLINE (line 1885) | static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) {
  type __Pyx_ImportType_CheckSize (line 1932) | enum __Pyx_ImportType_CheckSize {
  type __Pyx_ImportType_CheckSize (line 1937) | enum __Pyx_ImportType_CheckSize
  type __pyx_CyFunctionObject (line 1956) | typedef struct {
  type __pyx_FusedFunctionObject (line 1997) | typedef struct {
  type __Pyx_CodeObjectCacheEntry (line 2020) | typedef struct {
  type __Pyx_CodeObjectCache (line 2024) | struct __Pyx_CodeObjectCache {
  type __Pyx_CodeObjectCache (line 2029) | struct __Pyx_CodeObjectCache
  type __Pyx_Buf_DimInfo (line 2048) | typedef struct {
  type __Pyx_Buffer (line 2051) | typedef struct {
  type __Pyx_LocalBuf_ND (line 2055) | typedef struct {
  type __pyx_memoryview_obj (line 2226) | struct __pyx_memoryview_obj
  type __pyx_array_obj (line 2263) | struct __pyx_array_obj
  type __pyx_memoryview_obj (line 2264) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2265) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2266) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2267) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2267) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2268) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2269) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2270) | struct __pyx_memoryview_obj
  type __pyx_memoryviewslice_obj (line 2271) | struct __pyx_memoryviewslice_obj
  type __pyx_memoryviewslice_obj (line 2272) | struct __pyx_memoryviewslice_obj
  type __pyx_array_obj (line 2322) | struct __pyx_array_obj
  type __pyx_memoryview_obj (line 2328) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2328) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2333) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2334) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2335) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2336) | struct __pyx_memoryview_obj
  type __pyx_MemviewEnum_obj (line 2354) | struct __pyx_MemviewEnum_obj
  type __pyx_array_obj (line 2640) | struct __pyx_array_obj
  type __pyx_array_obj (line 2641) | struct __pyx_array_obj
  type __pyx_array_obj (line 2642) | struct __pyx_array_obj
  type __pyx_array_obj (line 2643) | struct __pyx_array_obj
  type __pyx_array_obj (line 2644) | struct __pyx_array_obj
  type __pyx_array_obj (line 2645) | struct __pyx_array_obj
  type __pyx_array_obj (line 2646) | struct __pyx_array_obj
  type __pyx_array_obj (line 2647) | struct __pyx_array_obj
  type __pyx_MemviewEnum_obj (line 2650) | struct __pyx_MemviewEnum_obj
  type __pyx_MemviewEnum_obj (line 2651) | struct __pyx_MemviewEnum_obj
  type __pyx_MemviewEnum_obj (line 2652) | struct __pyx_MemviewEnum_obj
  type __pyx_MemviewEnum_obj (line 2653) | struct __pyx_MemviewEnum_obj
  type __pyx_memoryview_obj (line 2654) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2655) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2656) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2657) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2658) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2659) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2660) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2661) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2662) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2663) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2664) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2665) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2666) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2667) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2668) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2669) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2670) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2671) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2672) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2673) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2674) | struct __pyx_memoryview_obj
  type __pyx_memoryviewslice_obj (line 2677) | struct __pyx_memoryviewslice_obj
  type __pyx_memoryviewslice_obj (line 2678) | struct __pyx_memoryviewslice_obj
  function PyObject (line 2749) | static PyObject *__pyx_pw_13im2col_cython_1im2col_cython(PyObject *__pyx...
  function PyObject (line 2833) | static PyObject *__pyx_pf_13im2col_cython_im2col_cython(CYTHON_UNUSED Py...
  function PyObject (line 3282) | static PyObject *__pyx_fuse_0__pyx_pw_13im2col_cython_7im2col_cython(PyO...
  function PyObject (line 3382) | static PyObject *__pyx_pf_13im2col_cython_6im2col_cython(CYTHON_UNUSED P...
  function PyObject (line 3772) | static PyObject *__pyx_fuse_1__pyx_pw_13im2col_cython_9im2col_cython(PyO...
  function PyObject (line 3872) | static PyObject *__pyx_pf_13im2col_cython_8im2col_cython(CYTHON_UNUSED P...
  function __pyx_fuse_0__pyx_f_13im2col_cython_im2col_cython_inner (line 4267) | static int __pyx_fuse_0__pyx_f_13im2col_cython_im2col_cython_inner(PyArr...
  function __pyx_fuse_1__pyx_f_13im2col_cython_im2col_cython_inner (line 4476) | static int __pyx_fuse_1__pyx_f_13im2col_cython_im2col_cython_inner(PyArr...
  function PyObject (line 4696) | static PyObject *__pyx_pw_13im2col_cython_3col2im_cython(PyObject *__pyx...
  function PyObject (line 4780) | static PyObject *__pyx_pf_13im2col_cython_2col2im_cython(CYTHON_UNUSED P...
  function PyObject (line 5229) | static PyObject *__pyx_fuse_0__pyx_pw_13im2col_cython_13col2im_cython(Py...
  function PyObject (line 5373) | static PyObject *__pyx_pf_13im2col_cython_12col2im_cython(CYTHON_UNUSED ...
  function PyObject (line 5707) | static PyObject *__pyx_fuse_1__pyx_pw_13im2col_cython_15col2im_cython(Py...
  function PyObject (line 5851) | static PyObject *__pyx_pf_13im2col_cython_14col2im_cython(CYTHON_UNUSED ...
  function __pyx_fuse_0__pyx_f_13im2col_cython_col2im_cython_inner (line 6190) | static int __pyx_fuse_0__pyx_f_13im2col_cython_col2im_cython_inner(PyArr...
  function __pyx_fuse_1__pyx_f_13im2col_cython_col2im_cython_inner (line 6399) | static int __pyx_fuse_1__pyx_f_13im2col_cython_col2im_cython_inner(PyArr...
  function PyObject (line 6616) | static PyObject *__pyx_fuse_0__pyx_f_13im2col_cython_col2im_6d_cython_in...
  function PyObject (line 6808) | static PyObject *__pyx_fuse_1__pyx_f_13im2col_cython_col2im_6d_cython_in...
  function PyObject (line 7011) | static PyObject *__pyx_pw_13im2col_cython_5col2im_6d_cython(PyObject *__...
  function PyObject (line 7095) | static PyObject *__pyx_pf_13im2col_cython_4col2im_6d_cython(CYTHON_UNUSE...
  function PyObject (line 7544) | static PyObject *__pyx_fuse_0__pyx_pw_13im2col_cython_19col2im_6d_cython...
  function PyObject (line 7688) | static PyObject *__pyx_pf_13im2col_cython_18col2im_6d_cython(CYTHON_UNUS...
  function PyObject (line 8020) | static PyObject *__pyx_fuse_1__pyx_pw_13im2col_cython_21col2im_6d_cython...
  function PyObject (line 8164) | static PyObject *__pyx_pf_13im2col_cython_20col2im_6d_cython(CYTHON_UNUS...
  function CYTHON_INLINE (line 8501) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyOb...
  function CYTHON_INLINE (line 8551) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyOb...
  function CYTHON_INLINE (line 8601) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyOb...
  function CYTHON_INLINE (line 8651) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyOb...
  function CYTHON_INLINE (line 8701) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyOb...
  function CYTHON_INLINE (line 8751) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_D...
  function CYTHON_INLINE (line 8825) | static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *_...
  function CYTHON_INLINE (line 8867) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObje...
  function CYTHON_INLINE (line 8948) | static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
  function CYTHON_INLINE (line 9080) | static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
  function CYTHON_INLINE (line 9212) | static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
  function __pyx_array___cinit__ (line 9346) | static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx...
  function __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__ (line 9474) | static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(s...
  function CYTHON_UNUSED (line 10097) | static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, P...
  function __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__ (line 10108) | static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffe...
  function __pyx_array___dealloc__ (line 10404) | static void __pyx_array___dealloc__(PyObject *__pyx_v_self) {
  function __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__ (line 10413) | static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc...
  function PyObject (line 10535) | static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__...
  function PyObject (line 10546) | static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(...
  function PyObject (line 10596) | static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v...
  function Py_ssize_t (line 10678) | static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) {
  function Py_ssize_t (line 10689) | static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__l...
  function PyObject (line 10728) | static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObjec...
  function PyObject (line 10739) | static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__ge...
  function PyObject (line 10796) | static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObjec...
  function PyObject (line 10807) | static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__g...
  function __pyx_array___setitem__ (line 10864) | static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__p...
  function __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__ (line 10875) | static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem...
  function PyObject (line 10924) | static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx...
  function PyObject (line 10935) | static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED st...
  function PyObject (line 10981) | static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__p...
  function PyObject (line 10992) | static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED...
  type __pyx_array_obj (line 11037) | struct __pyx_array_obj
  type __pyx_array_obj (line 11038) | struct __pyx_array_obj
  type __pyx_array_obj (line 11039) | struct __pyx_array_obj
  type __pyx_array_obj (line 11091) | struct __pyx_array_obj
  type __pyx_array_obj (line 11155) | struct __pyx_array_obj
  function __pyx_MemviewEnum___init__ (line 11214) | static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *...
  function __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__ (line 11265) | static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init...
  function PyObject (line 11307) | static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) {
  function PyObject (line 11318) | static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_...
  function PyObject (line 11358) | static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject ...
  function PyObject (line 11369) | static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __p...
  function PyObject (line 11593) | static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObjec...
  function PyObject (line 11604) | static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct ...
  function __pyx_memoryview___cinit__ (line 11736) | static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *...
  function __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__ (line 11816) | static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_...
  function __pyx_memoryview___dealloc__ (line 12115) | static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) {
  function __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__ (line 12124) | static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview...
  type __pyx_memoryview_obj (line 12344) | struct __pyx_memoryview_obj
  function PyObject (line 12484) | static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, Py...
  function PyObject (line 12495) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function __pyx_memoryview___setitem__ (line 12673) | static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject...
  function __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__ (line 12684) | static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_...
  function PyObject (line 12899) | static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *...
  function PyObject (line 13109) | static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_...
  function PyObject (line 13199) | static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __p...
  function PyObject (line 13489) | static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryvie...
  function PyObject (line 13550) | static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_me...
  function PyObject (line 13827) | static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_m...
  function CYTHON_UNUSED (line 14068) | static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_se...
  function __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__ (line 14079) | static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_...
  function PyObject (line 14412) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__...
  function PyObject (line 14423) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(...
  function PyObject (line 14498) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__ge...
  function PyObject (line 14509) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get...
  function PyObject (line 14551) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__g...
  function PyObject (line 14562) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___ge...
  function PyObject (line 14632) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1_...
  function PyObject (line 14643) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___...
  function PyObject (line 14746) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffset...
  function PyObject (line 14757) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffset...
  function PyObject (line 14864) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__ge...
  function PyObject (line 14875) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get...
  function PyObject (line 14927) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1...
  function PyObject (line 14938) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize__...
  function PyObject (line 14990) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__...
  function PyObject (line 15001) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___g...
  function PyObject (line 15063) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__ge...
  function PyObject (line 15074) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get...
  function Py_ssize_t (line 15204) | static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) {
  function Py_ssize_t (line 15215) | static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memo...
  function PyObject (line 15284) | static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) {
  function PyObject (line 15295) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 15386) | static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) {
  function PyObject (line 15397) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 15465) | static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CY...
  function PyObject (line 15476) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 15541) | static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CY...
  function PyObject (line 15552) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 15617) | static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UN...
  function PyObject (line 15628) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 15711) | static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, C...
  function PyObject (line 15722) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 15804) | static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *...
  function PyObject (line 15815) | static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUS...
  function PyObject (line 15861) | static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject...
  function PyObject (line 15872) | static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_U...
  function PyObject (line 15917) | static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_f...
  function CYTHON_INLINE (line 16008) | static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) {
  function PyObject (line 16047) | static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) {
  function PyObject (line 16504) | static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets...
  type __pyx_memoryview_obj (line 16592) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 16592) | struct __pyx_memoryview_obj
  type __pyx_memoryviewslice_obj (line 16599) | struct __pyx_memoryviewslice_obj
  type __pyx_memoryview_obj (line 16609) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 16614) | struct __pyx_memoryview_obj
  type __pyx_memoryviewslice_obj (line 16684) | struct __pyx_memoryviewslice_obj
  type __pyx_memoryview_obj (line 17096) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 17137) | struct __pyx_memoryview_obj
  function __pyx_memoryview_slice_memviewslice (line 17172) | static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx...
  function __pyx_memslice_transpose (line 18265) | static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) {
  function __pyx_memoryviewslice___dealloc__ (line 18441) | static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) {
  function __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__ (line 18450) | static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memo...
  function PyObject (line 18483) | static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __p...
  function PyObject (line 18569) | static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __...
  function PyObject (line 18654) | static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base...
  function PyObject (line 18665) | static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base...
  function PyObject (line 18705) | static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObj...
  function PyObject (line 18716) | static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON...
  function PyObject (line 18762) | static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyO...
  function PyObject (line 18773) | static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYT...
  function PyObject (line 18818) | static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_m...
  function __Pyx_memviewslice (line 19204) | static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(st...
  function __pyx_memoryview_slice_copy (line 19307) | static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__p...
  function PyObject (line 19433) | static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_ob...
  function PyObject (line 19493) | static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_me...
  function Py_ssize_t (line 19619) | static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) {
  function __pyx_get_best_slice_order (line 19685) | static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslic...
  function _copy_strided_to_strided (line 19875) | static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t ...
  function copy_strided_to_strided (line 20112) | static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __P...
  function Py_ssize_t (line 20142) | static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__...
  function Py_ssize_t (line 20214) | static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_sh...
  type __pyx_memoryview_obj (line 20345) | struct __pyx_memoryview_obj
  function __pyx_memoryview_err_extents (line 20591) | static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_...
  function __pyx_memoryview_err_dim (line 20679) | static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx...
  function __pyx_memoryview_err (line 20763) | static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_m...
  function __pyx_memoryview_copy_contents (line 20873) | static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src...
  function __pyx_memoryview_broadcast_leading (line 21452) | static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx...
  function __pyx_memoryview_refcount_copying (line 21565) | static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_...
  function __pyx_memoryview_refcount_objects_in_slice_with_gil (line 21615) | static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__...
  function __pyx_memoryview_refcount_objects_in_slice (line 21654) | static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_dat...
  function __pyx_memoryview_slice_assign_scalar (line 21786) | static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__p...
  function __pyx_memoryview__slice_assign_scalar (line 21834) | static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py...
  function PyObject (line 21966) | static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyO...
  function PyObject (line 22039) | static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTH...
  function PyObject (line 22230) | static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum...
  type __pyx_vtabstruct_array (line 22353) | struct __pyx_vtabstruct_array
  function PyObject (line 22355) | static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObje...
  function __pyx_tp_dealloc_array (line 22375) | static void __pyx_tp_dealloc_array(PyObject *o) {
  function PyObject (line 22394) | static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) {
  function __pyx_mp_ass_subscript_array (line 22402) | static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObje...
  function PyObject (line 22413) | static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) {
  function PyObject (line 22422) | static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_U...
  type PyGetSetDef (line 22433) | struct PyGetSetDef
  type __pyx_array_obj (line 22477) | struct __pyx_array_obj
  function PyObject (line 22543) | static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObje...
  function __pyx_tp_dealloc_Enum (line 22557) | static void __pyx_tp_dealloc_Enum(PyObject *o) {
  function __pyx_tp_traverse_Enum (line 22569) | static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) {
  function __pyx_tp_clear_Enum (line 22578) | static int __pyx_tp_clear_Enum(PyObject *o) {
  type __pyx_MemviewEnum_obj (line 22596) | struct __pyx_MemviewEnum_obj
  type __pyx_vtabstruct_memoryview (line 22661) | struct __pyx_vtabstruct_memoryview
  function PyObject (line 22663) | static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, P...
  function __pyx_tp_dealloc_memoryview (line 22685) | static void __pyx_tp_dealloc_memoryview(PyObject *o) {
  function __pyx_tp_traverse_memoryview (line 22707) | static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *...
  function __pyx_tp_clear_memoryview (line 22725) | static int __pyx_tp_clear_memoryview(PyObject *o) {
  function PyObject (line 22740) | static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) {
  function __pyx_mp_ass_subscript_memoryview (line 22748) | static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, P...
  function PyObject (line 22759) | static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UN...
  function PyObject (line 22763) | static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON...
  function PyObject (line 22767) | static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHO...
  function PyObject (line 22771) | static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYT...
  function PyObject (line 22775) | static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, ...
  function PyObject (line 22779) | static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON...
  function PyObject (line 22783) | static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CY...
  function PyObject (line 22787) | static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTH...
  function PyObject (line 22791) | static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON...
  type PyGetSetDef (line 22805) | struct PyGetSetDef
  type __pyx_memoryview_obj (line 22857) | struct __pyx_memoryview_obj
  type __pyx_vtabstruct__memoryviewslice (line 22922) | struct __pyx_vtabstruct__memoryviewslice
  function PyObject (line 22924) | static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject...
  function __pyx_tp_dealloc__memoryviewslice (line 22935) | static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) {
  function __pyx_tp_traverse__memoryviewslice (line 22956) | static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, ...
  function __pyx_tp_clear__memoryviewslice (line 22966) | static int __pyx_tp_clear__memoryviewslice(PyObject *o) {
  function PyObject (line 22977) | static PyObject *__pyx_getprop___pyx_memoryviewslice_base(PyObject *o, C...
  type PyGetSetDef (line 22987) | struct PyGetSetDef
  type __pyx_memoryviewslice_obj (line 22995) | struct __pyx_memoryviewslice_obj
  type PyModuleDef (line 23084) | struct PyModuleDef
  function CYTHON_SMALL_CODE (line 23248) | static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
  function CYTHON_SMALL_CODE (line 23263) | static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
  function CYTHON_SMALL_CODE (line 23652) | static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) {
  function __Pyx_modinit_global_init_code (line 23673) | static int __Pyx_modinit_global_init_code(void) {
  function __Pyx_modinit_variable_export_code (line 23686) | static int __Pyx_modinit_variable_export_code(void) {
  function __Pyx_modinit_function_export_code (line 23694) | static int __Pyx_modinit_function_export_code(void) {
  function __Pyx_modinit_type_init_code (line 23702) | static int __Pyx_modinit_type_init_code(void) {
  function __Pyx_modinit_type_import_code (line 23767) | static int __Pyx_modinit_type_import_code(void) {
  function __Pyx_modinit_variable_import_code (line 23807) | static int __Pyx_modinit_variable_import_code(void) {
  function __Pyx_modinit_function_import_code (line 23815) | static int __Pyx_modinit_function_import_code(void) {
  function __Pyx_PyMODINIT_FUNC (line 23846) | __Pyx_PyMODINIT_FUNC PyInit_im2col_cython(void)
  function CYTHON_SMALL_CODE (line 23851) | static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) {
  function CYTHON_SMALL_CODE (line 23874) | static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, P...
  function CYTHON_SMALL_CODE (line 23889) | static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CY...
  function __Pyx_RefNannyAPIStruct (line 24312) | static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modn...
  function CYTHON_INLINE (line 24329) | static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, ...
  function PyObject (line 24342) | static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
  function __Pyx_RaiseArgtupleInvalid (line 24356) | static void __Pyx_RaiseArgtupleInvalid(
  function __Pyx_RaiseDoubleKeywordsError (line 24382) | static void __Pyx_RaiseDoubleKeywordsError(
  function __Pyx_ParseOptionalKeywords (line 24396) | static int __Pyx_ParseOptionalKeywords(
  function PyObject (line 24498) | static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
  function CYTHON_INLINE (line 24505) | static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, P...
  function CYTHON_INLINE (line 24523) | static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, ...
  function CYTHON_INLINE (line 24541) | static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssi...
  function PyObject (line 24586) | static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
  function CYTHON_INLINE (line 24610) | static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *fun...
  function PyObject (line 24633) | static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObjec...
  function CYTHON_INLINE (line 24752) | static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObj...
  function CYTHON_INLINE (line 24772) | static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, ...
  function PyObject (line 24792) | static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *ar...
  function CYTHON_INLINE (line 24802) | static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func,...
  function CYTHON_INLINE (line 24820) | static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func,...
  function CYTHON_INLINE (line 24832) | static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate,...
  function CYTHON_INLINE (line 24844) | static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, P...
  function __Pyx_Raise (line 24856) | static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
  function __Pyx_Raise (line 24907) | static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, P...
  function CYTHON_INLINE (line 25014) | static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) {
  function __Pyx__PyObject_Ord (line 25045) | static long __Pyx__PyObject_Ord(PyObject* c) {
  function __Pyx_SetItemInt_Generic (line 25074) | static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *...
  function CYTHON_INLINE (line 25081) | static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i...
  function CYTHON_INLINE (line 25123) | static CYTHON_INLINE int __Pyx_IterFinish(void) {
  function CYTHON_INLINE (line 25159) | static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
  function __Pyx_PyObject_GetMethod (line 25180) | static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObj...
  function PyObject (line 25276) | static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* met...
  function CYTHON_INLINE (line 25292) | static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t inde...
  function CYTHON_INLINE (line 25299) | static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expec...
  function __Pyx_IternextUnpackEndCheck (line 25305) | static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t exp...
  function CYTHON_INLINE (line 25317) | static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
  function __Pyx_UnpackTupleError (line 25322) | static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
  function CYTHON_INLINE (line 25333) | static CYTHON_INLINE int __Pyx_unpack_tuple2_exact(
  function __Pyx_unpack_tuple2_generic (line 25357) | static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalu...
  function CYTHON_INLINE (line 25385) | static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, i...
  function CYTHON_INLINE (line 25429) | static CYTHON_INLINE int __Pyx_dict_iter_next(
  function CYTHON_UNUSED (line 25498) | static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* functi...
  function __Pyx__ArgTypeTest (line 25527) | static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const c...
  function CYTHON_INLINE (line 25548) | static CYTHON_INLINE int __Pyx_Is_Little_Endian(void)
  function __Pyx_BufFmt_Init (line 25559) | static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,
  function __Pyx_BufFmt_ParseNumber (line 25586) | static int __Pyx_BufFmt_ParseNumber(const char** ts) {
  function __Pyx_BufFmt_ExpectNumber (line 25601) | static int __Pyx_BufFmt_ExpectNumber(const char **ts) {
  function __Pyx_BufFmt_RaiseUnexpectedChar (line 25608) | static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) {
  function __Pyx_BufFmt_TypeCharToStandardSize (line 25637) | static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_comple...
  function __Pyx_BufFmt_TypeCharToNativeSize (line 25655) | static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) {
  type __Pyx_st_short (line 25674) | typedef struct { char c; short x; } __Pyx_st_short;
  type __Pyx_st_int (line 25675) | typedef struct { char c; int x; } __Pyx_st_int;
  type __Pyx_st_long (line 25676) | typedef struct { char c; long x; } __Pyx_st_long;
  type __Pyx_st_float (line 25677) | typedef struct { char c; float x; } __Pyx_st_float;
  type __Pyx_st_double (line 25678) | typedef struct { char c; double x; } __Pyx_st_double;
  type __Pyx_st_longdouble (line 25679) | typedef struct { char c; long double x; } __Pyx_st_longdouble;
  type __Pyx_st_void_p (line 25680) | typedef struct { char c; void *x; } __Pyx_st_void_p;
  type __Pyx_st_longlong (line 25682) | typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong;
  function __Pyx_BufFmt_TypeCharToAlignment (line 25684) | static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED in...
  type __Pyx_pad_short (line 25706) | typedef struct { short x; char c; } __Pyx_pad_short;
  type __Pyx_pad_int (line 25707) | typedef struct { int x; char c; } __Pyx_pad_int;
  type __Pyx_pad_long (line 25708) | typedef struct { long x; char c; } __Pyx_pad_long;
  type __Pyx_pad_float (line 25709) | typedef struct { float x; char c; } __Pyx_pad_float;
  type __Pyx_pad_double (line 25710) | typedef struct { double x; char c; } __Pyx_pad_double;
  type __Pyx_pad_longdouble (line 25711) | typedef struct { long double x; char c; } __Pyx_pad_longdouble;
  type __Pyx_pad_void_p (line 25712) | typedef struct { void *x; char c; } __Pyx_pad_void_p;
  type __Pyx_pad_longlong (line 25714) | typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong;
  function __Pyx_BufFmt_TypeCharToPadding (line 25716) | static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int ...
  function __Pyx_BufFmt_TypeCharToGroup (line 25734) | static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) {
  function __Pyx_BufFmt_RaiseExpected (line 25755) | static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) {
  function __Pyx_BufFmt_ProcessTypeChunk (line 25779) | static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) {
  function PyObject (line 25881) | static PyObject *
  function CYTHON_INLINE (line 26061) | static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {
  function __Pyx_ZeroBuffer (line 26066) | static void __Pyx_ZeroBuffer(Py_buffer* buf) {
  function __Pyx__GetBufferAndValidate (line 26073) | static int __Pyx__GetBufferAndValidate(
  function __Pyx_div_long (line 26108) | static CYTHON_INLINE long __Pyx_div_long(long a, long b) {
  function CYTHON_INLINE (line 26117) | static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) {
  function CYTHON_INLINE (line 26121) | static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject ...
  function CYTHON_INLINE (line 26133) | static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj...
  function CYTHON_INLINE (line 26145) | static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name)
  function CYTHON_INLINE (line 26177) | static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *typ...
  function PyObject (line 26191) | static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) {
  function PyObject (line 26209) | static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) {
  function _PyErr_StackItem (line 26220) | static _PyErr_StackItem *
  function CYTHON_INLINE (line 26235) | static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, Py...
  function CYTHON_INLINE (line 26250) | static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, P...
  function __Pyx_PyErr_ExceptionMatchesTuple (line 26276) | static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObjec...
  function CYTHON_INLINE (line 26289) | static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadSta...
  function __Pyx_GetException (line 26303) | static int __Pyx_GetException(PyObject **type, PyObject **value, PyObjec...
  function CYTHON_INLINE (line 26374) | static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2...
  function CYTHON_INLINE (line 26421) | static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* ...
  function CYTHON_INLINE (line 26523) | static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ss...
  function CYTHON_INLINE (line 26531) | static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) {
  function CYTHON_INLINE (line 26544) | static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
  function PyObject (line 26577) | static PyObject *__Pyx_GetAttr3Default(PyObject *d) {
  function CYTHON_INLINE (line 26586) | static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, ...
  function CYTHON_INLINE (line 26593) | static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, Py...
  function CYTHON_INLINE (line 26616) | static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject ...
  function PyObject (line 26627) | static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int l...
  function __Pyx_InBases (line 26693) | static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) {
  function CYTHON_INLINE (line 26701) | static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *...
  function __Pyx_inner_PyErr_GivenExceptionMatches2 (line 26717) | static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObj...
  function CYTHON_INLINE (line 26739) | static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObje...
  function __Pyx_PyErr_GivenExceptionMatchesTuple (line 26747) | static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, Py...
  function CYTHON_INLINE (line 26768) | static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err...
  function CYTHON_INLINE (line 26780) | static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *er...
  function PyObject (line 26793) | static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHO...
  function CYTHON_INLINE (line 26916) | static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varna...
  function PyObject (line 26921) | static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
  function CYTHON_INLINE (line 26935) | static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) {
  function PyObject (line 26954) | static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, P...
  function CYTHON_INLINE (line 26965) | static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObj...
  function PyObject (line 26994) | static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* ...
  function __Pyx_SetVtable (line 27003) | static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
  function __Pyx_PyObject_GetAttrStr_ClearAttributeError (line 27021) | static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) {
  function CYTHON_INLINE (line 27027) | static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject...
  function __Pyx_setup_reduce_is_named (line 27043) | static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) {
  function __Pyx_setup_reduce (line 27059) | static int __Pyx_setup_reduce(PyObject* type_obj) {
  function PyTypeObject (line 27129) | static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *modu...
  function PyTypeObject (line 27188) | static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
  function PyObject (line 27228) | static PyObject *
  function __Pyx_CyFunction_set_doc (line 27248) | static int
  function PyObject (line 27260) | static PyObject *
  function __Pyx_CyFunction_set_name (line 27275) | static int
  function PyObject (line 27295) | static PyObject *
  function __Pyx_CyFunction_set_qualname (line 27301) | static int
  function PyObject (line 27321) | static PyObject *
  function PyObject (line 27331) | static PyObject *
  function __Pyx_CyFunction_set_dict (line 27342) | static int
  function PyObject (line 27362) | static PyObject *
  function PyObject (line 27368) | static PyObject *
  function PyObject (line 27374) | static PyObject *
  function __Pyx_CyFunction_init_defaults (line 27381) | static int
  function __Pyx_CyFunction_set_defaults (line 27403) | static int
  function PyObject (line 27419) | static PyObject *
  function __Pyx_CyFunction_set_kwdefaults (line 27433) | static int
  function PyObject (line 27449) | static PyObject *
  function __Pyx_CyFunction_set_annotations (line 27463) | static int
  function PyObject (line 27479) | static PyObject *
  function PyObject (line 27515) | static PyObject *
  function PyObject (line 27533) | static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMet...
  function __Pyx_CyFunction_clear (line 27564) | static int
  function __Pyx__CyFunction_dealloc (line 27589) | static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m)
  function __Pyx_CyFunction_dealloc (line 27596) | static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
  function __Pyx_CyFunction_traverse (line 27601) | static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitpro...
  function PyObject (line 27622) | static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *ob...
  function PyObject (line 27640) | static PyObject*
  function PyObject (line 27651) | static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *...
  function CYTHON_INLINE (line 27705) | static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyO...
  function PyObject (line 27708) | static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject ...
  function __pyx_CyFunction_init (line 27797) | static int __pyx_CyFunction_init(void) {
  function CYTHON_INLINE (line 27804) | static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func,...
  function CYTHON_INLINE (line 27814) | static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *fu...
  function CYTHON_INLINE (line 27819) | static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *f...
  function CYTHON_INLINE (line 27824) | static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *...
  function PyObject (line 27831) | static PyObject *
  function __pyx_FusedFunction_dealloc (line 27850) | static void
  function __pyx_FusedFunction_traverse (line 27859) | static int
  function __pyx_FusedFunction_clear (line 27869) | static int
  function PyObject (line 27877) | static PyObject *
  function PyObject (line 27926) | static PyObject *
  function PyObject (line 27934) | static PyObject *
  function PyObject (line 27998) | static PyObject *
  function PyObject (line 28010) | static PyObject *
  function __pyx_FusedFunction_init (line 28177) | static int __pyx_FusedFunction_init(void) {
  function __Pyx_CLineForTraceback (line 28188) | static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tsta...
  function __pyx_bisect_code_objects (line 28229) | static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries...
  function PyCodeObject (line 28250) | static PyCodeObject *__pyx_find_code_object(int code_line) {
  function __pyx_insert_code_object (line 28264) | static void __pyx_insert_code_object(int code_line, PyCodeObject* code_o...
  function PyCodeObject (line 28312) | static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
  function __Pyx_AddTraceback (line 28364) | static void __Pyx_AddTraceback(const char *funcname, int c_line,
  function __Pyx_GetBuffer (line 28394) | static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) {
  function __Pyx_ReleaseBuffer (line 28401) | static void __Pyx_ReleaseBuffer(Py_buffer *view) {
  function __pyx_memviewslice_is_contig (line 28416) | static int
  function __pyx_get_array_memory_extents (line 28438) | static void
  function __pyx_slices_overlap (line 28462) | static int
  function CYTHON_INLINE (line 28474) | static CYTHON_INLINE PyObject *
  function __pyx_typeinfo_cmp (line 28487) | static int
  function __pyx_check_strides (line 28528) | static int
  function __pyx_check_suboffsets (line 28581) | static int
  function __pyx_verify_contig (line 28604) | static int
  function __Pyx_ValidateAndInit_memviewslice (line 28633) | static int __Pyx_ValidateAndInit_memviewslice(
  function CYTHON_INLINE (line 28709) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 28732) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 28755) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 28778) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 28801) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 28824) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 28869) | static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
  function CYTHON_INLINE (line 28900) | static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
  function CYTHON_INLINE (line 28933) | static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_pa...
  function CYTHON_INLINE (line 28937) | static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_pa...
  function CYTHON_INLINE (line 28942) | static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_pa...
  function CYTHON_INLINE (line 28953) | static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx...
  function CYTHON_INLINE (line 28956) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_flo...
  function CYTHON_INLINE (line 28962) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_fl...
  function CYTHON_INLINE (line 28968) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_fl...
  function CYTHON_INLINE (line 28975) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_fl...
  function CYTHON_INLINE (line 28995) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_fl...
  function CYTHON_INLINE (line 29006) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_flo...
  function CYTHON_INLINE (line 29012) | static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) {
  function CYTHON_INLINE (line 29015) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_fl...
  function CYTHON_INLINE (line 29022) | static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) {
  function CYTHON_INLINE (line 29029) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_flo...
  function CYTHON_INLINE (line 29087) | static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_...
  function CYTHON_INLINE (line 29091) | static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_...
  function CYTHON_INLINE (line 29096) | static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_...
  function CYTHON_INLINE (line 29107) | static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __p...
  function CYTHON_INLINE (line 29110) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_d...
  function CYTHON_INLINE (line 29116) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_...
  function CYTHON_INLINE (line 29122) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_...
  function CYTHON_INLINE (line 29129) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_...
  function CYTHON_INLINE (line 29149) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_...
  function CYTHON_INLINE (line 29160) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_d...
  function CYTHON_INLINE (line 29166) | static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) {
  function CYTHON_INLINE (line 29169) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_...
  function CYTHON_INLINE (line 29176) | static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) {
  function CYTHON_INLINE (line 29183) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_d...
  function __Pyx_memviewslice (line 29239) | static __Pyx_memviewslice
  function __Pyx_init_memviewslice (line 29306) | static int
  function __pyx_fatalerror (line 29358) | static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN {
  function CYTHON_INLINE (line 29370) | static CYTHON_INLINE int
  function CYTHON_INLINE (line 29380) | static CYTHON_INLINE int
  function CYTHON_INLINE (line 29390) | static CYTHON_INLINE void
  function CYTHON_INLINE (line 29411) | static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *memslice,
  function CYTHON_INLINE (line 29627) | static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char chara...
  function PyObject (line 29634) | static PyObject* __Pyx__ImportNumPyArray(void) {
  function CYTHON_INLINE (line 29651) | static CYTHON_INLINE PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(voi...
  function __Pyx_check_binary_version (line 30038) | static int __Pyx_check_binary_version(void) {
  function __Pyx_InitStrings (line 30054) | static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
  function CYTHON_INLINE (line 30086) | static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_...
  function CYTHON_INLINE (line 30089) | static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) {
  function CYTHON_INLINE (line 30116) | static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObjec...
  function CYTHON_INLINE (line 30158) | static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
  function CYTHON_INLINE (line 30163) | static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) {
  function PyObject (line 30170) | static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* resul...
  function CYTHON_INLINE (line 30239) | static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
  function CYTHON_INLINE (line 30301) | static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
  function CYTHON_INLINE (line 30304) | static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {

FILE: cs231n/assignment2/cs231n/layer_utils.py
  function affine_relu_forward (line 10) | def affine_relu_forward(x, w, b):
  function affine_relu_backward (line 28) | def affine_relu_backward(dout, cache):
  function conv_relu_forward (line 38) | def conv_relu_forward(x, w, b, conv_param):
  function conv_relu_backward (line 56) | def conv_relu_backward(dout, cache):
  function conv_bn_relu_forward (line 66) | def conv_bn_relu_forward(x, w, b, gamma, beta, conv_param, bn_param):
  function conv_bn_relu_backward (line 74) | def conv_bn_relu_backward(dout, cache):
  function conv_relu_pool_forward (line 82) | def conv_relu_pool_forward(x, w, b, conv_param, pool_param):
  function conv_relu_pool_backward (line 102) | def conv_relu_pool_backward(dout, cache):

FILE: cs231n/assignment2/cs231n/layers.py
  function affine_forward (line 6) | def affine_forward(x, w, b):
  function affine_backward (line 46) | def affine_backward(dout, cache):
  function relu_forward (line 88) | def relu_forward(x):
  function relu_backward (line 115) | def relu_backward(dout, cache):
  function batchnorm_forward (line 141) | def batchnorm_forward(x, gamma, beta, bn_param):
  function batchnorm_backward (line 285) | def batchnorm_backward(dout, cache):
  function batchnorm_backward_alt (line 368) | def batchnorm_backward_alt(dout, cache):
  function layernorm_forward (line 420) | def layernorm_forward(x, gamma, beta, ln_param):
  function layernorm_backward (line 494) | def layernorm_backward(dout, cache):
  function dropout_forward (line 546) | def dropout_forward(x, dropout_param):
  function dropout_backward (line 612) | def dropout_backward(dout, cache):
  function conv_forward_naive (line 641) | def conv_forward_naive(x, w, b, conv_param):
  function conv_backward_naive (line 725) | def conv_backward_naive(dout, cache):
  function max_pool_forward_naive (line 799) | def max_pool_forward_naive(x, pool_param):
  function max_pool_backward_naive (line 866) | def max_pool_backward_naive(dout, cache):
  function spatial_batchnorm_forward (line 929) | def spatial_batchnorm_forward(x, gamma, beta, bn_param):
  function spatial_batchnorm_backward (line 982) | def spatial_batchnorm_backward(dout, cache):
  function spatial_groupnorm_forward (line 1025) | def spatial_groupnorm_forward(x, gamma, beta, G, gn_param):
  function spatial_groupnorm_backward (line 1107) | def spatial_groupnorm_backward(dout, cache):
  function svm_loss (line 1166) | def svm_loss(x, y):
  function softmax_loss (line 1193) | def softmax_loss(x, y):

FILE: cs231n/assignment2/cs231n/optim.py
  function sgd (line 33) | def sgd(w, dw, config=None):
  function sgd_momentum (line 48) | def sgd_momentum(w, dw, config=None):
  function rmsprop (line 84) | def rmsprop(w, dw, config=None):
  function adam (line 126) | def adam(w, dw, config=None):

FILE: cs231n/assignment2/cs231n/solver.py
  class Solver (line 15) | class Solver(object):
    method __init__ (line 83) | def __init__(self, model, data, **kwargs):
    method _reset (line 150) | def _reset(self):
    method _step (line 169) | def _step(self):
    method _save_checkpoint (line 192) | def _save_checkpoint(self):
    method check_accuracy (line 214) | def check_accuracy(self, X, y, num_samples=None, batch_size=100):
    method train (line 254) | def train(self):

FILE: cs231n/assignment2/cs231n/vis_utils.py
  function visualize_grid (line 8) | def visualize_grid(Xs, ubound=255.0, padding=1):
  function vis_grid (line 43) | def vis_grid(Xs):
  function vis_nn (line 64) | def vis_nn(rows):

FILE: cs231n/assignment3/cs231n/captioning_solver.py
  class CaptioningSolver (line 10) | class CaptioningSolver(object):
    method __init__ (line 67) | def __init__(self, model, data, **kwargs):
    method _reset (line 118) | def _reset(self):
    method _step (line 137) | def _step(self):
    method check_accuracy (line 160) | def check_accuracy(self, X, y, num_samples=None, batch_size=100):
    method train (line 201) | def train(self):

FILE: cs231n/assignment3/cs231n/classifiers/rnn.py
  class CaptioningRNN (line 9) | class CaptioningRNN(object):
    method __init__ (line 21) | def __init__(
    method loss (line 84) | def loss(self, features, captions):
    method sample (line 198) | def sample(self, features, max_length=30):

FILE: cs231n/assignment3/cs231n/classifiers/squeezenet.py
  class Fire (line 5) | class Fire(tf.keras.Model):
    method __init__ (line 6) | def __init__(self, inplanes, squeeze_planes, expand1x1_planes, expand3...
    method call (line 13) | def call(self, x):
  class SqueezeNet (line 21) | class SqueezeNet(tf.keras.Model):
    method __init__ (line 22) | def __init__(self, num_classes=NUM_CLASSES):
    method call (line 43) | def call(self, x, save_path=None):

FILE: cs231n/assignment3/cs231n/coco_utils.py
  function load_coco_data (line 9) | def load_coco_data(base_dir=BASE_DIR, max_train=None, pca_features=True):
  function decode_captions (line 57) | def decode_captions(captions, idx_to_word):
  function sample_coco_minibatch (line 78) | def sample_coco_minibatch(data, batch_size=100, split="train"):

FILE: cs231n/assignment3/cs231n/data_utils.py
  function load_pickle (line 11) | def load_pickle(f):
  function load_CIFAR_batch (line 20) | def load_CIFAR_batch(filename):
  function load_CIFAR10 (line 31) | def load_CIFAR10(ROOT):
  function get_CIFAR10_data (line 47) | def get_CIFAR10_data(
  function load_tiny_imagenet (line 95) | def load_tiny_imagenet(path, dtype=np.float32, subtract_mean=True):
  function load_models (line 220) | def load_models(models_dir):
  function load_imagenet_val (line 243) | def load_imagenet_val(num=None):

FILE: cs231n/assignment3/cs231n/fast_layers.py
  function conv_forward_im2col (line 16) | def conv_forward_im2col(x, w, b, conv_param):
  function conv_forward_strides (line 45) | def conv_forward_strides(x, w, b, conv_param):
  function conv_backward_strides (line 88) | def conv_backward_strides(dout, cache):
  function conv_backward_im2col (line 108) | def conv_backward_im2col(dout, cache):
  function max_pool_forward_fast (line 143) | def max_pool_forward_fast(x, pool_param):
  function max_pool_backward_fast (line 167) | def max_pool_backward_fast(dout, cache):
  function max_pool_forward_reshape (line 183) | def max_pool_forward_reshape(x, pool_param):
  function max_pool_backward_reshape (line 205) | def max_pool_backward_reshape(dout, cache):
  function max_pool_forward_im2col (line 236) | def max_pool_forward_im2col(x, pool_param):
  function max_pool_backward_im2col (line 263) | def max_pool_backward_im2col(dout, cache):

FILE: cs231n/assignment3/cs231n/gan_pytorch.py
  function sample_noise (line 17) | def sample_noise(batch_size, dim, seed=None):
  function discriminator (line 50) | def discriminator(seed=None):
  function generator (line 82) | def generator(noise_dim=NOISE_DIM, seed=None):
  function bce_loss (line 114) | def bce_loss(input, target):
  function discriminator_loss (line 133) | def discriminator_loss(logits_real, logits_fake):
  function generator_loss (line 169) | def generator_loss(logits_fake):
  function get_optimizer (line 196) | def get_optimizer(model):
  function ls_discriminator_loss (line 215) | def ls_discriminator_loss(scores_real, scores_fake):
  function ls_generator_loss (line 240) | def ls_generator_loss(scores_fake):
  function build_dc_classifier (line 261) | def build_dc_classifier(batch_size):
  function build_dc_generator (line 304) | def build_dc_generator(noise_dim=NOISE_DIM):
  function run_a_gan (line 350) | def run_a_gan(D, G, D_solver, G_solver, discriminator_loss, generator_lo...
  class ChunkSampler (line 404) | class ChunkSampler(sampler.Sampler):
    method __init__ (line 410) | def __init__(self, num_samples, start=0):
    method __iter__ (line 414) | def __iter__(self):
    method __len__ (line 417) | def __len__(self):
  class Flatten (line 421) | class Flatten(nn.Module):
    method forward (line 422) | def forward(self, x):
  class Unflatten (line 426) | class Unflatten(nn.Module):
    method __init__ (line 431) | def __init__(self, N=-1, C=128, H=7, W=7):
    method forward (line 437) | def forward(self, x):
  function initialize_weights (line 440) | def initialize_weights(m):
  function preprocess_img (line 444) | def preprocess_img(x):
  function deprocess_img (line 447) | def deprocess_img(x):
  function rel_error (line 450) | def rel_error(x,y):
  function count_params (line 453) | def count_params(model):

FILE: cs231n/assignment3/cs231n/gradient_check.py
  function eval_numerical_gradient (line 9) | def eval_numerical_gradient(f, x, verbose=True, h=0.00001):
  function eval_numerical_gradient_array (line 40) | def eval_numerical_gradient_array(f, x, df, h=1e-5):
  function eval_numerical_gradient_blobs (line 62) | def eval_numerical_gradient_blobs(f, inputs, output, h=1e-5):
  function eval_numerical_gradient_net (line 103) | def eval_numerical_gradient_net(net, inputs, output, h=1e-5):
  function grad_check_sparse (line 109) | def grad_check_sparse(f, x, analytic_grad, num_checks=10, h=1e-5):

FILE: cs231n/assignment3/cs231n/im2col.py
  function get_im2col_indices (line 5) | def get_im2col_indices(x_shape, field_height, field_width, padding=1, st...
  function im2col_indices (line 26) | def im2col_indices(x, field_height, field_width, padding=1, stride=1):
  function col2im_indices (line 40) | def col2im_indices(cols, x_shape, field_height=3, field_width=3, padding...

FILE: cs231n/assignment3/cs231n/image_utils.py
  function blur_image (line 17) | def blur_image(X):
  function preprocess_image (line 43) | def preprocess_image(img):
  function deprocess_image (line 51) | def deprocess_image(img, rescale=False):
  function image_from_url (line 60) | def image_from_url(url):
  function load_image (line 79) | def load_image(filename, size=None):

FILE: cs231n/assignment3/cs231n/layer_utils.py
  function affine_relu_forward (line 5) | def affine_relu_forward(x, w, b):
  function affine_relu_backward (line 23) | def affine_relu_backward(dout, cache):
  function affine_bn_relu_forward (line 33) | def affine_bn_relu_forward(x, w, b, gamma, beta, bn_param):
  function affine_bn_relu_backward (line 57) | def affine_bn_relu_backward(dout, cache):
  function affine_ln_relu_forward (line 68) | def affine_ln_relu_forward(x, w, b, gamma, beta, ln_param):
  function affine_ln_relu_backward (line 92) | def affine_ln_relu_backward(dout, cache):
  function conv_relu_forward (line 103) | def conv_relu_forward(x, w, b, conv_param):
  function conv_relu_backward (line 121) | def conv_relu_backward(dout, cache):
  function conv_bn_relu_forward (line 131) | def conv_bn_relu_forward(x, w, b, gamma, beta, conv_param, bn_param):
  function conv_bn_relu_backward (line 139) | def conv_bn_relu_backward(dout, cache):
  function conv_relu_pool_forward (line 147) | def conv_relu_pool_forward(x, w, b, conv_param, pool_param):
  function conv_relu_pool_backward (line 167) | def conv_relu_pool_backward(dout, cache):

FILE: cs231n/assignment3/cs231n/layers.py
  function affine_forward (line 4) | def affine_forward(x, w, b):
  function affine_backward (line 26) | def affine_backward(dout, cache):
  function relu_forward (line 48) | def relu_forward(x):
  function relu_backward (line 64) | def relu_backward(dout, cache):
  function batchnorm_forward (line 80) | def batchnorm_forward(x, gamma, beta, bn_param):
  function batchnorm_backward (line 161) | def batchnorm_backward(dout, cache):
  function spatial_batchnorm_forward (line 204) | def spatial_batchnorm_forward(x, gamma, beta, bn_param):
  function spatial_batchnorm_backward (line 233) | def spatial_batchnorm_backward(dout, cache):
  function svm_loss (line 253) | def svm_loss(x, y):
  function softmax_loss (line 280) | def softmax_loss(x, y):

FILE: cs231n/assignment3/cs231n/net_visualization_pytorch.py
  function compute_saliency_maps (line 8) | def compute_saliency_maps(X, y, model):
  function make_fooling_image (line 77) | def make_fooling_image(X, target_y, model):
  function class_visualization_update_step (line 154) | def class_visualization_update_step(img, model, target_y, l2_reg, learni...
  function preprocess (line 190) | def preprocess(img, size=224):
  function deprocess (line 200) | def deprocess(img, should_rescale=True):
  function rescale (line 210) | def rescale(x):
  function blur_image (line 215) | def blur_image(X, sigma=1):
  function jitter (line 222) | def jitter(X, ox, oy):

FILE: cs231n/assignment3/cs231n/optim.py
  function sgd (line 33) | def sgd(w, dw, config=None):
  function adam (line 48) | def adam(x, dx, config=None):

FILE: cs231n/assignment3/cs231n/rnn_layers.py
  function rnn_step_forward (line 12) | def rnn_step_forward(x, prev_h, Wx, Wh, b):
  function rnn_step_backward (line 57) | def rnn_step_backward(dnext_h, cache):
  function rnn_forward (line 108) | def rnn_forward(x, h0, Wx, Wh, b):
  function rnn_backward (line 165) | def rnn_backward(dh, cache):
  function word_embedding_forward (line 239) | def word_embedding_forward(x, W):
  function word_embedding_backward (line 274) | def word_embedding_backward(dout, cache):
  function sigmoid (line 312) | def sigmoid(x):
  function lstm_step_forward (line 326) | def lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b):
  function lstm_step_backward (line 388) | def lstm_step_backward(dnext_h, dnext_c, cache):
  function lstm_forward (line 467) | def lstm_forward(x, h0, Wx, Wh, b):
  function lstm_backward (line 531) | def lstm_backward(dh, cache):
  function temporal_affine_forward (line 607) | def temporal_affine_forward(x, w, b):
  function temporal_affine_backward (line 630) | def temporal_affine_backward(dout, cache):
  function temporal_softmax_loss (line 654) | def temporal_softmax_loss(x, y, mask, verbose=False):

FILE: cs231n/assignment3/cs231n/style_transfer_pytorch.py
  function content_loss (line 14) | def content_loss(content_weight, content_current, content_original):
  function gram_matrix (line 38) | def gram_matrix(features, normalize=True):
  function style_loss (line 77) | def style_loss(feats, style_layers, style_targets, style_weights):
  function tv_loss (line 116) | def tv_loss(img, tv_weight):
  function preprocess (line 142) | def preprocess(img, size=512):
  function deprocess (line 162) | def deprocess(img):
  function rescale (line 187) | def rescale(x):
  function rel_error (line 197) | def rel_error(x,y):
  function extract_features (line 202) | def extract_features(x, cnn):
  function features_from_img (line 226) | def features_from_img(imgpath, imgsize, cnn):

FILE: eecs498-007/A4/a4_helper.py
  function preprocess (line 26) | def preprocess(img, size=224):
  function deprocess (line 36) | def deprocess(img, should_rescale=True):
  function rescale (line 57) | def rescale(x):
  function blur_image (line 62) | def blur_image(X, sigma=1):
  function check_scipy (line 72) | def check_scipy():
  function jitter (line 79) | def jitter(X, ox, oy):
  function load_CIFAR (line 100) | def load_CIFAR(path='./datasets/'):
  function load_imagenet_val (line 132) | def load_imagenet_val(num=None, path='./datasets/imagenet_val_25.npz'):
  function load_COCO (line 156) | def load_COCO(path = './datasets/coco.pt'):
  function dump_results (line 195) | def dump_results(submission, path):

FILE: eecs498-007/A4/eecs598/data.py
  function _extract_tensors (line 12) | def _extract_tensors(dset, num=None, x_dtype=torch.float32):
  function cifar10 (line 38) | def cifar10(num_train=None, num_test=None, x_dtype=torch.float32):
  function preprocess_cifar10 (line 65) | def preprocess_cifar10(

FILE: eecs498-007/A4/eecs598/grad.py
  function grad_check_sparse (line 10) | def grad_check_sparse(f, x, analytic_grad, num_checks=10, h=1e-7):
  function compute_numeric_gradient (line 49) | def compute_numeric_gradient(f, x, dLdf=None, h=1e-7):
  function rel_error (line 103) | def rel_error(x, y, eps=1e-10):

FILE: eecs498-007/A4/eecs598/solver.py
  class Solver (line 7) | class Solver(object):
    method __init__ (line 65) | def __init__(self, model, data, **kwargs):
    method _reset (line 127) | def _reset(self):
    method _step (line 146) | def _step(self):
    method _save_checkpoint (line 170) | def _save_checkpoint(self):
    method sgd (line 193) | def sgd(w, dw, config=None):
    method check_accuracy (line 206) | def check_accuracy(self, X, y, num_samples=None, batch_size=100):
    method train (line 247) | def train(self, time_limit=None, return_best_params=True):

FILE: eecs498-007/A4/eecs598/submit.py
  function make_a1_submission (line 51) | def make_a1_submission(assignment_path, uniquename=None, umid=None):
  function make_a2_submission (line 55) | def make_a2_submission(assignment_path, uniquename=None, umid=None):
  function make_a3_submission (line 59) | def make_a3_submission(assignment_path, uniquename=None, umid=None):
  function make_a4_submission (line 62) | def make_a4_submission(assignment_path, uniquename=None, umid=None):
  function _make_submission (line 66) | def _make_submission(
  function _get_user_info (line 82) | def _get_user_info():

FILE: eecs498-007/A4/eecs598/utils.py
  function reset_seed (line 12) | def reset_seed(number):
  function tensor_to_image (line 23) | def tensor_to_image(tensor):
  function visualize_dataset (line 38) | def visualize_dataset(X_data, y_data, samples_per_class, class_list):
  function decode_captions (line 65) | def decode_captions(captions, idx_to_word):
  function attention_visualizer (line 95) | def attention_visualizer(img, attn_weights, token):

FILE: eecs498-007/A4/eecs598/vis.py
  function tensor_to_image (line 13) | def tensor_to_image(tensor):
  function visualize_dataset (line 28) | def visualize_dataset(X_data, y_data, samples_per_class, class_list):

FILE: eecs498-007/A4/network_visualization.py
  function hello (line 17) | def hello():
  function compute_saliency_maps (line 24) | def compute_saliency_maps(X, y, model):
  function make_adversarial_attack (line 90) | def make_adversarial_attack(X, target_y, model, max_iter=100, verbose=Tr...
  function class_visualization_step (line 168) | def class_visualization_step(img, target_y, model, **kwargs):

FILE: eecs498-007/A4/pytorch_autograd_and_nn.py
  function hello (line 12) | def hello():
  function flatten (line 25) | def flatten(x, start_dim=1, end_dim=-1):
  function three_layer_convnet (line 29) | def three_layer_convnet(x, params):
  function initialize_three_layer_conv_part2 (line 85) | def initialize_three_layer_conv_part2(dtype=torch.float, device='cpu'):
  class ThreeLayerConvNet (line 161) | class ThreeLayerConvNet(nn.Module):
    method __init__ (line 162) | def __init__(self, in_channel, channel_1, channel_2, num_classes):
    method forward (line 210) | def forward(self, x):
  function initialize_three_layer_conv_part3 (line 231) | def initialize_three_layer_conv_part3():
  class Flatten (line 274) | class Flatten(nn.Module):
    method forward (line 275) | def forward(self, x):
  function initialize_three_layer_conv_part4 (line 279) | def initialize_three_layer_conv_part4():
  class PlainBlock (line 341) | class PlainBlock(nn.Module):
    method __init__ (line 342) | def __init__(self, Cin, Cout, downsample=False):
    method forward (line 371) | def forward(self, x):
  class ResidualBlock (line 375) | class ResidualBlock(nn.Module):
    method __init__ (line 376) | def __init__(self, Cin, Cout, downsample=False):
    method forward (line 405) | def forward(self, x):
  class ResNet (line 409) | class ResNet(nn.Module):
    method __init__ (line 410) | def __init__(self, stage_args, Cin=3, block=ResidualBlock, num_classes...
    method forward (line 431) | def forward(self, x):
  class ResidualBottleneckBlock (line 462) | class ResidualBottleneckBlock(nn.Module):
    method __init__ (line 463) | def __init__(self, Cin, Cout, downsample=False):
    method forward (line 505) | def forward(self, x):
  class ResNetStem (line 511) | class ResNetStem(nn.Module):
    method __init__ (line 512) | def __init__(self, Cin=3, Cout=8):
    method forward (line 520) | def forward(self, x):
  class ResNetStage (line 523) | class ResNetStage(nn.Module):
    method __init__ (line 524) | def __init__(self, Cin, Cout, num_blocks, downsample=True,
    method forward (line 532) | def forward(self, x):

FILE: eecs498-007/A4/rnn_lstm_attention_captioning.py
  function hello (line 12) | def hello():
  class FeatureExtractor (line 19) | class FeatureExtractor(object):
    method __init__ (line 23) | def __init__(self, pooling=False, verbose=False,
    method extract_mobilenet_feature (line 43) | def extract_mobilenet_feature(self, img, verbose=False):
  function rnn_step_forward (line 78) | def rnn_step_forward(x, prev_h, Wx, Wh, b):
  function rnn_step_backward (line 123) | def rnn_step_backward(dnext_h, cache):
  function rnn_forward (line 173) | def rnn_forward(x, h0, Wx, Wh, b):
  function rnn_backward (line 229) | def rnn_backward(dh, cache):
  class RNN (line 308) | class RNN(nn.Module):
    method __init__ (line 316) | def __init__(self, input_size, hidden_size, device='cpu',
    method forward (line 335) | def forward(self, x, h0):
    method step_forward (line 347) | def step_forward(self, x, prev_h):
  class WordEmbedding (line 360) | class WordEmbedding(nn.Module):
    method __init__ (line 375) | def __init__(self, vocab_size, embed_size,
    method forward (line 383) | def forward(self, x):
  function temporal_softmax_loss (line 401) | def temporal_softmax_loss(x, y, ignore_index=None):
  class CaptioningRNN (line 453) | class CaptioningRNN(nn.Module):
    method __init__ (line 467) | def __init__(self, word_to_idx, input_dim=512, wordvec_dim=128,
    method forward (line 549) | def forward(self, images, captions):
    method sample (line 624) | def sample(self, images, max_length=15):
  function lstm_step_forward (line 772) | def lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b, attn=None, Wattn=None):
  function lstm_forward (line 833) | def lstm_forward(x, h0, Wx, Wh, b):
  class LSTM (line 893) | class LSTM(nn.Module):
    method __init__ (line 901) | def __init__(self, input_size, hidden_size, device='cpu',
    method forward (line 920) | def forward(self, x, h0):
    method step_forward (line 932) | def step_forward(self, x, prev_h, prev_c):
  function dot_product_attention (line 951) | def dot_product_attention(prev_h, A):
  function attention_forward (line 1008) | def attention_forward(x, A, Wx, Wh, Wattn, b):
  class AttentionLSTM (line 1086) | class AttentionLSTM(nn.Module):
    method __init__ (line 1094) | def __init__(self, input_size, hidden_size, device='cpu',
    method forward (line 1116) | def forward(self, x, A):
    method step_forward (line 1128) | def step_forward(self, x, prev_h, prev_c, attn):

FILE: eecs498-007/A4/style_transfer.py
  function hello (line 10) | def hello():
  function content_loss (line 17) | def content_loss(content_weight, content_current, content_original):
  function gram_matrix (line 47) | def gram_matrix(features, normalize=True):
  function style_loss (line 92) | def style_loss(feats, style_layers, style_targets, style_weights):
  function tv_loss (line 138) | def tv_loss(img, tv_weight):

FILE: eecs498-007/A5/a5_helper.py
  function hello_helper (line 14) | def hello_helper():
  function get_pascal_voc2007_data (line 26) | def get_pascal_voc2007_data(image_root, split='train'):
  function pascal_voc2007_loader (line 41) | def pascal_voc2007_loader(dataset, batch_size, num_workers=0):
  function voc_collate_fn (line 55) | def voc_collate_fn(batch_lst, reshape_size=224):
  function coord_trans (line 94) | def coord_trans(bbox, w_pixel, h_pixel, w_amap=7, h_amap=7, mode='a2p'):
  class FeatureExtractor (line 145) | class FeatureExtractor(torch.nn.Module):
    method __init__ (line 149) | def __init__(self, reshape_size=224, pooling=False, verbose=False):
    method forward (line 165) | def forward(self, img, verbose=False):
  function GenerateGrid (line 189) | def GenerateGrid(batch_size, w_amap=7, h_amap=7, dtype=torch.float32, de...
  function ReferenceOnActivatedAnchors (line 214) | def ReferenceOnActivatedAnchors(anchors, bboxes, grid, iou_mat, pos_thre...
  function ObjectClassification (line 346) | def ObjectClassification(class_prob, GT_class, batch_size, anc_per_img, ...
  function DetectionSolver (line 369) | def DetectionSolver(detector, train_loader, learning_rate=3e-3,
  function DetectionEvaluater (line 431) | def DetectionEvaluater(detector, loader, dtype=torch.float32, device='cp...
  function DetectionInference (line 459) | def DetectionInference(detector, data_loader, dataset, idx_to_class, thr...

FILE: eecs498-007/A5/eecs598/data.py
  function _extract_tensors (line 12) | def _extract_tensors(dset, num=None, x_dtype=torch.float32):
  function cifar10 (line 38) | def cifar10(num_train=None, num_test=None, x_dtype=torch.float32):
  function preprocess_cifar10 (line 65) | def preprocess_cifar10(

FILE: eecs498-007/A5/eecs598/grad.py
  function grad_check_sparse (line 10) | def grad_check_sparse(f, x, analytic_grad, num_checks=10, h=1e-7):
  function compute_numeric_gradient (line 49) | def compute_numeric_gradient(f, x, dLdf=None, h=1e-7):
  function rel_error (line 103) | def rel_error(x, y, eps=1e-10):

FILE: eecs498-007/A5/eecs598/solver.py
  class Solver (line 7) | class Solver(object):
    method __init__ (line 65) | def __init__(self, model, data, **kwargs):
    method _reset (line 127) | def _reset(self):
    method _step (line 146) | def _step(self):
    method _save_checkpoint (line 170) | def _save_checkpoint(self):
    method sgd (line 193) | def sgd(w, dw, config=None):
    method check_accuracy (line 206) | def check_accuracy(self, X, y, num_samples=None, batch_size=100):
    method train (line 247) | def train(self, time_limit=None, return_best_params=True):

FILE: eecs498-007/A5/eecs598/submit.py
  function make_a1_submission (line 60) | def make_a1_submission(assignment_path, uniquename=None, umid=None):
  function make_a2_submission (line 64) | def make_a2_submission(assignment_path, uniquename=None, umid=None):
  function make_a3_submission (line 68) | def make_a3_submission(assignment_path, uniquename=None, umid=None):
  function make_a4_submission (line 72) | def make_a4_submission(assignment_path, uniquename=None, umid=None):
  function make_a5_submission (line 76) | def make_a5_submission(assignment_path, uniquename=None, umid=None):
  function _make_submission (line 80) | def _make_submission(
  function _get_user_info (line 96) | def _get_user_info():

FILE: eecs498-007/A5/eecs598/utils.py
  function reset_seed (line 12) | def reset_seed(number):
  function tensor_to_image (line 23) | def tensor_to_image(tensor):
  function visualize_dataset (line 38) | def visualize_dataset(X_data, y_data, samples_per_class, class_list):
  function decode_captions (line 65) | def decode_captions(captions, idx_to_word):
  function attention_visualizer (line 95) | def attention_visualizer(img, attn_weights, token):

FILE: eecs498-007/A5/eecs598/vis.py
  function tensor_to_image (line 15) | def tensor_to_image(tensor):
  function visualize_dataset (line 30) | def visualize_dataset(X_data, y_data, samples_per_class, class_list):
  function detection_visualizer (line 58) | def detection_visualizer(img, idx_to_class, bbox=None, pred=None):

FILE: eecs498-007/A5/single_stage_detector.py
  function hello_single_stage_detector (line 11) | def hello_single_stage_detector():
  function GenerateAnchor (line 15) | def GenerateAnchor(anc, grid):
  function GenerateProposal (line 93) | def GenerateProposal(anchors, offsets, method='YOLO'):
  function IoU (line 165) | def IoU(proposals, bboxes):
  class PredictionNetwork (line 262) | class PredictionNetwork(nn.Module):
    method __init__ (line 263) | def __init__(self, in_dim, hidden_dim=128, num_anchors=9, num_classes=...
    method _extract_anchor_data (line 297) | def _extract_anchor_data(self, anchor_data, anchor_idx):
    method _extract_class_scores (line 313) | def _extract_class_scores(self, all_scores, anchor_idx):
    method forward (line 333) | def forward(self, features, pos_anchor_idx=None, neg_anchor_idx=None):
  class SingleStageDetector (line 441) | class SingleStageDetector(nn.Module):
    method __init__ (line 442) | def __init__(self):
    method forward (line 450) | def forward(self, images, bboxes):
    method inference (line 519) | def inference(self, images, thresh=0.5, nms_thresh=0.7):
  function nms (line 628) | def nms(boxes, scores, iou_threshold=0.5, topk=None):
  function ConfScoreRegression (line 709) | def ConfScoreRegression(conf_scores, GT_conf_scores):
  function BboxRegression (line 727) | def BboxRegression(offsets, GT_offsets):

FILE: eecs498-007/A5/two_stage_detector.py
  function hello_two_stage_detector (line 12) | def hello_two_stage_detector():
  class ProposalModule (line 15) | class ProposalModule(nn.Module):
    method __init__ (line 16) | def __init__(self, in_dim, hidden_dim=256, num_anchors=9, drop_ratio=0...
    method _extract_anchor_data (line 46) | def _extract_anchor_data(self, anchor_data, anchor_idx):
    method forward (line 62) | def forward(self, features, pos_anchor_coord=None, \
  function ConfScoreRegression (line 170) | def ConfScoreRegression(conf_scores, batch_size):
  function BboxRegression (line 192) | def BboxRegression(offsets, GT_offsets, batch_size):
  class RPN (line 207) | class RPN(nn.Module):
    method __init__ (line 208) | def __init__(self):
    method forward (line 216) | def forward(self, images, bboxes, output_mode='loss'):
    method inference (line 314) | def inference(self, images, thresh=0.5, nms_thresh=0.7, mode='RPN'):
  class TwoStageDetector (line 427) | class TwoStageDetector(nn.Module):
    method __init__ (line 428) | def __init__(self, in_dim=1280, hidden_dim=256, num_classes=20, \
    method forward (line 462) | def forward(self, images, bboxes):
    method inference (line 528) | def inference(self, images, thresh=0.5, nms_thresh=0.7):

FILE: eecs498-007/A6/a6_helper.py
  function hello_helper (line 15) | def hello_helper():
  function show_images (line 18) | def show_images(images):
  function count_params (line 36) | def count_params(model):
  function initialize_weights (line 41) | def initialize_weights(m):
  function one_hot (line 47) | def one_hot(labels, class_size):
  function train_vae (line 65) | def train_vae(epoch, model, train_loader, cond=False):

FILE: eecs498-007/A6/eecs598/data.py
  function _extract_tensors (line 12) | def _extract_tensors(dset, num=None, x_dtype=torch.float32):
  function cifar10 (line 38) | def cifar10(num_train=None, num_test=None, x_dtype=torch.float32):
  function preprocess_cifar10 (line 65) | def preprocess_cifar10(

FILE: eecs498-007/A6/eecs598/grad.py
  function grad_check_sparse (line 10) | def grad_check_sparse(f, x, analytic_grad, num_checks=10, h=1e-7):
  function compute_numeric_gradient (line 49) | def compute_numeric_gradient(f, x, dLdf=None, h=1e-7):
  function rel_error (line 103) | def rel_error(x, y, eps=1e-10):

FILE: eecs498-007/A6/eecs598/solver.py
  class Solver (line 7) | class Solver(object):
    method __init__ (line 65) | def __init__(self, model, data, **kwargs):
    method _reset (line 127) | def _reset(self):
    method _step (line 146) | def _step(self):
    method _save_checkpoint (line 170) | def _save_checkpoint(self):
    method sgd (line 193) | def sgd(w, dw, config=None):
    method check_accuracy (line 206) | def check_accuracy(self, X, y, num_samples=None, batch_size=100):
    method train (line 247) | def train(self, time_limit=None, return_best_params=True):

FILE: eecs498-007/A6/eecs598/submit.py
  function make_a1_submission (line 74) | def make_a1_submission(assignment_path, uniquename=None, umid=None):
  function make_a2_submission (line 78) | def make_a2_submission(assignment_path, uniquename=None, umid=None):
  function make_a3_submission (line 82) | def make_a3_submission(assignment_path, uniquename=None, umid=None):
  function make_a4_submission (line 86) | def make_a4_submission(assignment_path, uniquename=None, umid=None):
  function make_a5_submission (line 90) | def make_a5_submission(assignment_path, uniquename=None, umid=None):
  function make_a6_submission (line 93) | def make_a6_submission(assignment_path, uniquename=None, umid=None):
  function _make_submission (line 97) | def _make_submission(
  function _get_user_info (line 113) | def _get_user_info():

FILE: eecs498-007/A6/eecs598/utils.py
  function reset_seed (line 12) | def reset_seed(number):
  function tensor_to_image (line 23) | def tensor_to_image(tensor):
  function visualize_dataset (line 38) | def visualize_dataset(X_data, y_data, samples_per_class, class_list):
  function decode_captions (line 65) | def decode_captions(captions, idx_to_word):
  function attention_visualizer (line 95) | def attention_visualizer(img, attn_weights, token):

FILE: eecs498-007/A6/eecs598/vis.py
  function tensor_to_image (line 15) | def tensor_to_image(tensor):
  function visualize_dataset (line 30) | def visualize_dataset(X_data, y_data, samples_per_class, class_list):
  function detection_visualizer (line 58) | def detection_visualizer(img, idx_to_class, bbox=None, pred=None):

FILE: eecs498-007/A6/gan.py
  function hello_gan (line 14) | def hello_gan():
  function sample_noise (line 20) | def sample_noise(batch_size, noise_dim, dtype=torch.float, device='cpu'):
  function discriminator (line 58) | def discriminator():
  function generator (line 84) | def generator(noise_dim=NOISE_DIM):
  function discriminator_loss (line 109) | def discriminator_loss(logits_real, logits_fake):
  function generator_loss (line 150) | def generator_loss(logits_fake):
  function get_optimizer (line 182) | def get_optimizer(model):
  function ls_discriminator_loss (line 207) | def ls_discriminator_loss(scores_real, scores_fake):
  function ls_generator_loss (line 237) | def ls_generator_loss(scores_fake):
  function build_dc_classifier (line 264) | def build_dc_classifier():
  function build_dc_generator (line 303) | def build_dc_generator(noise_dim=NOISE_DIM):

FILE: eecs498-007/A6/vae.py
  function hello_vae (line 14) | def hello_vae():
  class VAE (line 18) | class VAE(nn.Module):
    method __init__ (line 19) | def __init__(self, input_size, latent_size=15):
    method forward (line 84) | def forward(self, x):
  class CVAE (line 128) | class CVAE(nn.Module):
    method __init__ (line 129) | def __init__(self, input_size, num_classes=10, latent_size=15):
    method forward (line 192) | def forward(self, x, c):
  function reparametrize (line 252) | def reparametrize(mu, logvar):
  function loss_function (line 295) | def loss_function(x_hat, x, mu, logvar):
Copy disabled (too large) Download .json
Condensed preview — 126 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (27,359K chars).
[
  {
    "path": "README.md",
    "chars": 19235,
    "preview": "# Deep Learning for Computer Vision Courses\r\n\r\n## General info\r\n\r\nI present my assignment solutions for both 2020 course"
  },
  {
    "path": "cs231n/assignment1/README.md",
    "chars": 2141,
    "preview": "<div>\r\n  <h2 align=\"center\"><a href=\"https://cs231n.github.io\">CS231n: Convolutional Neural Networks for Visual Recognit"
  },
  {
    "path": "cs231n/assignment1/cs231n/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "cs231n/assignment1/cs231n/classifiers/__init__.py",
    "chars": 103,
    "preview": "from cs231n.classifiers.k_nearest_neighbor import *\nfrom cs231n.classifiers.linear_classifier import *\n"
  },
  {
    "path": "cs231n/assignment1/cs231n/classifiers/k_nearest_neighbor.py",
    "chars": 9010,
    "preview": "from builtins import range\nfrom builtins import object\nimport numpy as np\nfrom past.builtins import xrange\n\n\nclass KNear"
  },
  {
    "path": "cs231n/assignment1/cs231n/classifiers/linear_classifier.py",
    "chars": 5947,
    "preview": "from __future__ import print_function\n\nfrom builtins import range\nfrom builtins import object\nimport numpy as np\nfrom cs"
  },
  {
    "path": "cs231n/assignment1/cs231n/classifiers/linear_svm.py",
    "chars": 4923,
    "preview": "from builtins import range\nimport numpy as np\nfrom random import shuffle\nfrom past.builtins import xrange\n\ndef svm_loss_"
  },
  {
    "path": "cs231n/assignment1/cs231n/classifiers/neural_net.py",
    "chars": 11393,
    "preview": "from __future__ import print_function\n\nfrom builtins import range\nfrom builtins import object\nimport numpy as np\nimport "
  },
  {
    "path": "cs231n/assignment1/cs231n/classifiers/softmax.py",
    "chars": 3567,
    "preview": "from builtins import range\nimport numpy as np\nfrom random import shuffle\nfrom past.builtins import xrange\n\ndef softmax_l"
  },
  {
    "path": "cs231n/assignment1/cs231n/data_utils.py",
    "chars": 9175,
    "preview": "from __future__ import print_function\n\nfrom builtins import range\nfrom six.moves import cPickle as pickle\nimport numpy a"
  },
  {
    "path": "cs231n/assignment1/cs231n/datasets/get_datasets.sh",
    "chars": 160,
    "preview": "# Get CIFAR10\nwget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz -O cifar-10-python.tar.gz\ntar -xzvf cifar-10-p"
  },
  {
    "path": "cs231n/assignment1/cs231n/features.py",
    "chars": 5321,
    "preview": "from __future__ import print_function\nfrom builtins import zip\nfrom builtins import range\nfrom past.builtins import xran"
  },
  {
    "path": "cs231n/assignment1/cs231n/gradient_check.py",
    "chars": 3974,
    "preview": "from __future__ import print_function\nfrom builtins import range\nfrom past.builtins import xrange\n\nimport numpy as np\nfr"
  },
  {
    "path": "cs231n/assignment1/cs231n/vis_utils.py",
    "chars": 2201,
    "preview": "from builtins import range\nfrom past.builtins import xrange\n\nfrom math import sqrt, ceil\nimport numpy as np\n\ndef visuali"
  },
  {
    "path": "cs231n/assignment1/features.ipynb",
    "chars": 338338,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"features.ipynb\",\"provenance\":[],\"collapsed_sections\":[]},\""
  },
  {
    "path": "cs231n/assignment1/knn.ipynb",
    "chars": 415576,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"knn.ipynb\",\"provenance\":[],\"collapsed_sections\":[],\"toc_vi"
  },
  {
    "path": "cs231n/assignment1/requirements.txt",
    "chars": 1090,
    "preview": "attrs==19.1.0\nbackcall==0.1.0\nbleach==3.1.0\ncertifi==2019.3.9\nchardet==3.0.4\ncolorama==0.4.1\ncycler==0.10.0\ndecorator==4"
  },
  {
    "path": "cs231n/assignment1/softmax.ipynb",
    "chars": 67839,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"softmax.ipynb\",\"provenance\":[],\"collapsed_sections\":[],\"to"
  },
  {
    "path": "cs231n/assignment1/svm.ipynb",
    "chars": 440827,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"svm.ipynb\",\"provenance\":[],\"collapsed_sections\":[]},\"kerne"
  },
  {
    "path": "cs231n/assignment1/two_layer_net.ipynb",
    "chars": 684857,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"two_layer_net.ipynb\",\"provenance\":[],\"collapsed_sections\":"
  },
  {
    "path": "cs231n/assignment2/BatchNormalization.ipynb",
    "chars": 411883,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"BatchNormalization.ipynb\",\"provenance\":[],\"collapsed_secti"
  },
  {
    "path": "cs231n/assignment2/ConvolutionalNetworks.ipynb",
    "chars": 390495,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"ConvolutionalNetworks.ipynb\",\"provenance\":[],\"collapsed_se"
  },
  {
    "path": "cs231n/assignment2/Dropout.ipynb",
    "chars": 56142,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"Dropout.ipynb\",\"provenance\":[],\"collapsed_sections\":[],\"to"
  },
  {
    "path": "cs231n/assignment2/FullyConnectedNets.ipynb",
    "chars": 380509,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"FullyConnectedNets.ipynb\",\"provenance\":[],\"collapsed_secti"
  },
  {
    "path": "cs231n/assignment2/PyTorch.ipynb",
    "chars": 92273,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"PyTorch.ipynb\",\"provenance\":[],\"collapsed_sections\":[]},\"k"
  },
  {
    "path": "cs231n/assignment2/README.md",
    "chars": 2226,
    "preview": "<div>\r\n  <h2 align=\"center\"><a href=\"https://cs231n.github.io\">CS231n: Convolutional Neural Networks for Visual Recognit"
  },
  {
    "path": "cs231n/assignment2/cs231n/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "cs231n/assignment2/cs231n/classifiers/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "cs231n/assignment2/cs231n/classifiers/cnn.py",
    "chars": 9122,
    "preview": "from builtins import object\nimport numpy as np\n\nfrom ..layers import *\nfrom ..fast_layers import *\nfrom ..layer_utils im"
  },
  {
    "path": "cs231n/assignment2/cs231n/classifiers/fc_net.py",
    "chars": 20497,
    "preview": "from builtins import range\nfrom builtins import object\nimport numpy as np\n\nfrom ..layers import *\nfrom ..layer_utils imp"
  },
  {
    "path": "cs231n/assignment2/cs231n/data_utils.py",
    "chars": 9264,
    "preview": "from __future__ import print_function\n\nfrom builtins import range\nfrom six.moves import cPickle as pickle\nimport numpy a"
  },
  {
    "path": "cs231n/assignment2/cs231n/datasets/get_datasets.sh",
    "chars": 194,
    "preview": "if [ ! -d \"cifar-10-batches-py\" ]; then\n  wget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz -O cifar-10-python"
  },
  {
    "path": "cs231n/assignment2/cs231n/fast_layers.py",
    "chars": 9971,
    "preview": "from __future__ import print_function\nimport numpy as np\n\ntry:\n    from .im2col_cython import col2im_cython, im2col_cyth"
  },
  {
    "path": "cs231n/assignment2/cs231n/gradient_check.py",
    "chars": 3983,
    "preview": "from __future__ import print_function\nfrom builtins import range\nfrom past.builtins import xrange\n\nimport numpy as np\nfr"
  },
  {
    "path": "cs231n/assignment2/cs231n/im2col.py",
    "chars": 2237,
    "preview": "from builtins import range\nimport numpy as np\n\n\ndef get_im2col_indices(x_shape, field_height, field_width, padding=1, st"
  },
  {
    "path": "cs231n/assignment2/cs231n/im2col_cython.c",
    "chars": 1180441,
    "preview": "/* Generated by Cython 0.29.21 */\n\n/* BEGIN: Cython Metadata\n{\n    \"distutils\": {\n        \"depends\": [\n            \"/usr"
  },
  {
    "path": "cs231n/assignment2/cs231n/im2col_cython.pyx",
    "chars": 4982,
    "preview": "import numpy as np\ncimport numpy as np\ncimport cython\n\n# DTYPE = np.float64\n# ctypedef np.float64_t DTYPE_t\n\nctypedef fu"
  },
  {
    "path": "cs231n/assignment2/cs231n/layer_utils.py",
    "chars": 3276,
    "preview": "# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****\n\npass\n\n# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THI"
  },
  {
    "path": "cs231n/assignment2/cs231n/layers.py",
    "chars": 49663,
    "preview": "from builtins import range\nimport numpy as np\n\n\n\ndef affine_forward(x, w, b):\n    \"\"\"\n    Computes the forward pass for "
  },
  {
    "path": "cs231n/assignment2/cs231n/optim.py",
    "chars": 7103,
    "preview": "import numpy as np\n\n\"\"\"\nThis file implements various first-order update rules that are commonly used\nfor training neural"
  },
  {
    "path": "cs231n/assignment2/cs231n/setup.py",
    "chars": 289,
    "preview": "from distutils.core import setup\nfrom distutils.extension import Extension\nfrom Cython.Build import cythonize\nimport num"
  },
  {
    "path": "cs231n/assignment2/cs231n/solver.py",
    "chars": 12286,
    "preview": "from __future__ import print_function, division\nfrom future import standard_library\n\nstandard_library.install_aliases()\n"
  },
  {
    "path": "cs231n/assignment2/cs231n/vis_utils.py",
    "chars": 2319,
    "preview": "from builtins import range\nfrom past.builtins import xrange\n\nfrom math import sqrt, ceil\nimport numpy as np\n\n\ndef visual"
  },
  {
    "path": "cs231n/assignment2/requirements.txt",
    "chars": 1106,
    "preview": "attrs==19.1.0\nbackcall==0.1.0\nbleach==3.1.0\ncertifi==2019.3.9\nchardet==3.0.4\ncolorama==0.4.1\ncycler==0.10.0\nCython==0.29"
  },
  {
    "path": "cs231n/assignment3/Generative_Adversarial_Networks_PyTorch.ipynb",
    "chars": 1103046,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"Generative_Adversarial_Networks_PyTorch.ipynb\",\"provenance"
  },
  {
    "path": "cs231n/assignment3/LSTM_Captioning.ipynb",
    "chars": 2108076,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"LSTM_Captioning.ipynb\",\"provenance\":[],\"collapsed_sections"
  },
  {
    "path": "cs231n/assignment3/NetworkVisualization-PyTorch.ipynb",
    "chars": 1832871,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"NetworkVisualization-PyTorch.ipynb\",\"provenance\":[],\"colla"
  },
  {
    "path": "cs231n/assignment3/README.md",
    "chars": 2765,
    "preview": "<div>\r\n  <h2 align=\"center\"><a href=\"https://cs231n.github.io\">CS231n: Convolutional Neural Networks for Visual Recognit"
  },
  {
    "path": "cs231n/assignment3/RNN_Captioning.ipynb",
    "chars": 3270718,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"RNN_Captioning.ipynb\",\"provenance\":[],\"collapsed_sections\""
  },
  {
    "path": "cs231n/assignment3/StyleTransfer-PyTorch.ipynb",
    "chars": 3800704,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"colab\":{\"name\":\"StyleTransfer-PyTorch.ipynb\",\"provenance\":[],\"collapsed_se"
  },
  {
    "path": "cs231n/assignment3/cs231n/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "cs231n/assignment3/cs231n/captioning_solver.py",
    "chars": 8630,
    "preview": "from __future__ import print_function, division\nfrom builtins import range\nfrom builtins import object\nimport numpy as n"
  },
  {
    "path": "cs231n/assignment3/cs231n/classifiers/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "cs231n/assignment3/cs231n/classifiers/rnn.py",
    "chars": 15776,
    "preview": "from builtins import range\nfrom builtins import object\nimport numpy as np\n\nfrom ..layers import *\nfrom ..rnn_layers impo"
  },
  {
    "path": "cs231n/assignment3/cs231n/classifiers/squeezenet.py",
    "chars": 2397,
    "preview": "import tensorflow as tf\n\nNUM_CLASSES = 1000\n\nclass Fire(tf.keras.Model):\n    def __init__(self, inplanes, squeeze_planes"
  },
  {
    "path": "cs231n/assignment3/cs231n/coco_utils.py",
    "chars": 2951,
    "preview": "from builtins import range\nimport os, json\nimport numpy as np\nimport h5py\n\ndir_path = os.path.dirname(os.path.realpath(_"
  },
  {
    "path": "cs231n/assignment3/cs231n/data_utils.py",
    "chars": 9563,
    "preview": "from __future__ import print_function\n\nfrom builtins import range\nfrom six.moves import cPickle as pickle\nimport numpy a"
  },
  {
    "path": "cs231n/assignment3/cs231n/datasets/get_assignment3_data.sh",
    "chars": 136,
    "preview": "#!/bin/bash\nif [ ! -d \"coco_captioning\" ]; then\n    sh get_coco_captioning.sh\n    sh get_squeezenet_tf.sh\n    sh get_ima"
  },
  {
    "path": "cs231n/assignment3/cs231n/datasets/get_coco_captioning.sh",
    "chars": 103,
    "preview": "wget \"http://cs231n.stanford.edu/coco_captioning.zip\"\nunzip coco_captioning.zip\nrm coco_captioning.zip\n"
  },
  {
    "path": "cs231n/assignment3/cs231n/datasets/get_dataset.sh",
    "chars": 136,
    "preview": "#!/bin/bash\nif [ ! -d \"coco_captioning\" ]; then\n    sh get_coco_captioning.sh\n    sh get_squeezenet_tf.sh\n    sh get_ima"
  },
  {
    "path": "cs231n/assignment3/cs231n/datasets/get_datasets.sh",
    "chars": 136,
    "preview": "#!/bin/bash\nif [ ! -d \"coco_captioning\" ]; then\n    sh get_coco_captioning.sh\n    sh get_squeezenet_tf.sh\n    sh get_ima"
  },
  {
    "path": "cs231n/assignment3/cs231n/datasets/get_imagenet_val.sh",
    "chars": 52,
    "preview": "wget http://cs231n.stanford.edu/imagenet_val_25.npz\n"
  },
  {
    "path": "cs231n/assignment3/cs231n/datasets/get_squeezenet_tf.sh",
    "chars": 100,
    "preview": "wget \"http://cs231n.stanford.edu/squeezenet_tf2.zip\"\nunzip squeezenet_tf2.zip\nrm squeezenet_tf2.zip\n"
  },
  {
    "path": "cs231n/assignment3/cs231n/fast_layers.py",
    "chars": 9971,
    "preview": "from __future__ import print_function\nimport numpy as np\n\ntry:\n    from .im2col_cython import col2im_cython, im2col_cyth"
  },
  {
    "path": "cs231n/assignment3/cs231n/gan_pytorch.py",
    "chars": 17109,
    "preview": "import numpy as np\n\nimport torch\nimport torch.nn as nn\nimport torchvision\nimport torchvision.transforms as T\nimport torc"
  },
  {
    "path": "cs231n/assignment3/cs231n/gradient_check.py",
    "chars": 3983,
    "preview": "from __future__ import print_function\nfrom builtins import range\nfrom past.builtins import xrange\n\nimport numpy as np\nfr"
  },
  {
    "path": "cs231n/assignment3/cs231n/im2col.py",
    "chars": 2237,
    "preview": "from builtins import range\nimport numpy as np\n\n\ndef get_im2col_indices(x_shape, field_height, field_width, padding=1, st"
  },
  {
    "path": "cs231n/assignment3/cs231n/im2col_cython.pyx",
    "chars": 4982,
    "preview": "import numpy as np\ncimport numpy as np\ncimport cython\n\n# DTYPE = np.float64\n# ctypedef np.float64_t DTYPE_t\n\nctypedef fu"
  },
  {
    "path": "cs231n/assignment3/cs231n/image_utils.py",
    "chars": 2733,
    "preview": "from __future__ import print_function\nfrom future import standard_library\n\nstandard_library.install_aliases()\nfrom built"
  },
  {
    "path": "cs231n/assignment3/cs231n/layer_utils.py",
    "chars": 5569,
    "preview": "from .layers import *\nfrom .fast_layers import *\n\n\ndef affine_relu_forward(x, w, b):\n    \"\"\"\n    Convenience layer that "
  },
  {
    "path": "cs231n/assignment3/cs231n/layers.py",
    "chars": 9691,
    "preview": "import numpy as np\n\n\ndef affine_forward(x, w, b):\n    \"\"\"\n    Computes the forward pass for an affine (fully-connected) "
  },
  {
    "path": "cs231n/assignment3/cs231n/net_visualization_pytorch.py",
    "chars": 10325,
    "preview": "import torch\nimport random\nimport torchvision.transforms as T\nimport numpy as np\nfrom .image_utils import SQUEEZENET_MEA"
  },
  {
    "path": "cs231n/assignment3/cs231n/optim.py",
    "chars": 2836,
    "preview": "import numpy as np\n\n\"\"\"\nThis file implements various first-order update rules that are commonly used for\ntraining neural"
  },
  {
    "path": "cs231n/assignment3/cs231n/rnn_layers.py",
    "chars": 28432,
    "preview": "from __future__ import print_function, division\nfrom builtins import range\nimport numpy as np\n\n\n\"\"\"\nThis file defines la"
  },
  {
    "path": "cs231n/assignment3/cs231n/setup.py",
    "chars": 289,
    "preview": "from distutils.core import setup\nfrom distutils.extension import Extension\nfrom Cython.Build import cythonize\nimport num"
  },
  {
    "path": "cs231n/assignment3/cs231n/style_transfer_pytorch.py",
    "chars": 8924,
    "preview": "import torch\nimport torch.nn as nn\nimport torchvision\nimport torchvision.transforms as T\nimport PIL\n\nimport numpy as np\n"
  },
  {
    "path": "cs231n/assignment3/requirements.txt",
    "chars": 1106,
    "preview": "attrs==19.1.0\nbackcall==0.1.0\nbleach==3.1.0\ncertifi==2019.3.9\nchardet==3.0.4\ncolorama==0.4.1\ncycler==0.10.0\nCython==0.29"
  },
  {
    "path": "eecs498-007/A4/README.md",
    "chars": 2339,
    "preview": "<div>\r\n  <h2 align=\"center\"><a href=\"https://web.eecs.umich.edu/~justincj/teaching/eecs498/\">EECS 498-007 / 598-005: Dee"
  },
  {
    "path": "eecs498-007/A4/a4_helper.py",
    "chars": 7427,
    "preview": "import os\nimport pickle\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nf"
  },
  {
    "path": "eecs498-007/A4/eecs598/__init__.py",
    "chars": 142,
    "preview": "from . import data, grad, submit\nfrom .solver import Solver\nfrom .utils import reset_seed\nfrom .vis import tensor_to_ima"
  },
  {
    "path": "eecs498-007/A4/eecs598/data.py",
    "chars": 6535,
    "preview": "import os\nimport random\n\nimport matplotlib.pyplot as plt\nimport torch\nimport torchvision\nfrom torchvision.datasets impor"
  },
  {
    "path": "eecs498-007/A4/eecs598/grad.py",
    "chars": 4089,
    "preview": "import random\n\nimport torch\n\nimport eecs598\n\n\"\"\" Utilities for computing and checking gradients. \"\"\"\n\n\ndef grad_check_sp"
  },
  {
    "path": "eecs498-007/A4/eecs598/solver.py",
    "chars": 13635,
    "preview": "import pickle\nimport time\n\nimport torch\n\n\nclass Solver(object):\n    \"\"\"\n    A Solver encapsulates all the logic necessar"
  },
  {
    "path": "eecs498-007/A4/eecs598/submit.py",
    "chars": 2636,
    "preview": "import os\nimport zipfile\n\n_A1_FILES = [\n    \"pytorch101.py\",\n    \"pytorch101.ipynb\",\n    \"knn.py\",\n    \"knn.ipynb\",\n]\n\n_"
  },
  {
    "path": "eecs498-007/A4/eecs598/utils.py",
    "chars": 3676,
    "preview": "import torch\nimport random\nfrom torchvision.utils import make_grid\nimport matplotlib.pyplot as plt\nimport cv2\nimport num"
  },
  {
    "path": "eecs498-007/A4/eecs598/vis.py",
    "chars": 1610,
    "preview": "import random\n\nimport matplotlib.pyplot as plt\nimport torch\nfrom torchvision.utils import make_grid\n\n\n\"\"\"\nUtilities to h"
  },
  {
    "path": "eecs498-007/A4/network_visualization.ipynb",
    "chars": 2843209,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"accelerator\":\"GPU\",\"colab\":{\"name\":\"network_visualization.ipynb\",\"provenan"
  },
  {
    "path": "eecs498-007/A4/network_visualization.py",
    "chars": 9551,
    "preview": "\"\"\"\nImplements a network visualization in PyTorch.\nWARNING: you SHOULD NOT use \".to()\" or \".cuda()\" in each implementati"
  },
  {
    "path": "eecs498-007/A4/pytorch_autograd_and_nn.ipynb",
    "chars": 115216,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"accelerator\":\"GPU\",\"colab\":{\"name\":\"pytorch_autograd_and_nn.ipynb\",\"proven"
  },
  {
    "path": "eecs498-007/A4/pytorch_autograd_and_nn.py",
    "chars": 23063,
    "preview": "\"\"\"\nImplements pytorch autograd and nn in PyTorch.\nWARNING: you SHOULD NOT use \".to()\" or \".cuda()\" in each implementati"
  },
  {
    "path": "eecs498-007/A4/rnn_lstm_attention_captioning.ipynb",
    "chars": 2517325,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"accelerator\":\"GPU\",\"colab\":{\"name\":\"rnn_lstm_attention_captioning.ipynb\",\""
  },
  {
    "path": "eecs498-007/A4/rnn_lstm_attention_captioning.py",
    "chars": 52025,
    "preview": "\"\"\"\nImplements rnn lstm attention captioning in PyTorch.\nWARNING: you SHOULD NOT use \".to()\" or \".cuda()\" in each implem"
  },
  {
    "path": "eecs498-007/A4/style_transfer.ipynb",
    "chars": 2800083,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"accelerator\":\"GPU\",\"colab\":{\"name\":\"style_transfer.ipynb\",\"provenance\":[],"
  },
  {
    "path": "eecs498-007/A4/style_transfer.py",
    "chars": 6855,
    "preview": "\"\"\"\nImplements a style transfer in PyTorch.\nWARNING: you SHOULD NOT use \".to()\" or \".cuda()\" in each implementation bloc"
  },
  {
    "path": "eecs498-007/A5/README.md",
    "chars": 1467,
    "preview": "<div>\r\n  <h2 align=\"center\"><a href=\"https://web.eecs.umich.edu/~justincj/teaching/eecs498/\">EECS 498-007 / 598-005: Dee"
  },
  {
    "path": "eecs498-007/A5/a5_helper.py",
    "chars": 20499,
    "preview": "import torch\nimport time\nimport math\nimport os\nimport shutil\nimport torch.optim as optim\nfrom torchvision import models,"
  },
  {
    "path": "eecs498-007/A5/eecs598/__init__.py",
    "chars": 142,
    "preview": "from . import data, grad, submit\nfrom .solver import Solver\nfrom .utils import reset_seed\nfrom .vis import tensor_to_ima"
  },
  {
    "path": "eecs498-007/A5/eecs598/data.py",
    "chars": 6535,
    "preview": "import os\nimport random\n\nimport matplotlib.pyplot as plt\nimport torch\nimport torchvision\nfrom torchvision.datasets impor"
  },
  {
    "path": "eecs498-007/A5/eecs598/grad.py",
    "chars": 4089,
    "preview": "import random\n\nimport torch\n\nimport eecs598\n\n\"\"\" Utilities for computing and checking gradients. \"\"\"\n\n\ndef grad_check_sp"
  },
  {
    "path": "eecs498-007/A5/eecs598/solver.py",
    "chars": 13635,
    "preview": "import pickle\nimport time\n\nimport torch\n\n\nclass Solver(object):\n    \"\"\"\n    A Solver encapsulates all the logic necessar"
  },
  {
    "path": "eecs498-007/A5/eecs598/submit.py",
    "chars": 2994,
    "preview": "import os\nimport zipfile\n\n_A1_FILES = [\n    \"pytorch101.py\",\n    \"pytorch101.ipynb\",\n    \"knn.py\",\n    \"knn.ipynb\",\n]\n\n_"
  },
  {
    "path": "eecs498-007/A5/eecs598/utils.py",
    "chars": 3676,
    "preview": "import torch\nimport random\nfrom torchvision.utils import make_grid\nimport matplotlib.pyplot as plt\nimport cv2\nimport num"
  },
  {
    "path": "eecs498-007/A5/eecs598/vis.py",
    "chars": 3625,
    "preview": "import random\nimport cv2\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport torch\nfrom torchvision.utils import "
  },
  {
    "path": "eecs498-007/A5/single_stage_detector.py",
    "chars": 34745,
    "preview": "import time\nimport math\nimport torch \nimport torch.nn as nn\nfrom torch import optim\nimport torchvision\nfrom a5_helper im"
  },
  {
    "path": "eecs498-007/A5/two_stage_detector.py",
    "chars": 29165,
    "preview": "import time\nimport math\nimport torch \nimport torch.nn as nn\nfrom torch import optim\nimport torchvision\nfrom a5_helper im"
  },
  {
    "path": "eecs498-007/A6/README.md",
    "chars": 1047,
    "preview": "<div>\r\n  <h2 align=\"center\"><a href=\"https://web.eecs.umich.edu/~justincj/teaching/eecs498/\">EECS 498-007 / 598-005: Dee"
  },
  {
    "path": "eecs498-007/A6/a6_helper.py",
    "chars": 3019,
    "preview": "import torch\nimport time\nimport math\nimport os\nimport shutil\nimport torch.optim as optim\nfrom torchvision import models,"
  },
  {
    "path": "eecs498-007/A6/eecs598/__init__.py",
    "chars": 142,
    "preview": "from . import data, grad, submit\nfrom .solver import Solver\nfrom .utils import reset_seed\nfrom .vis import tensor_to_ima"
  },
  {
    "path": "eecs498-007/A6/eecs598/data.py",
    "chars": 6535,
    "preview": "import os\nimport random\n\nimport matplotlib.pyplot as plt\nimport torch\nimport torchvision\nfrom torchvision.datasets impor"
  },
  {
    "path": "eecs498-007/A6/eecs598/grad.py",
    "chars": 4089,
    "preview": "import random\n\nimport torch\n\nimport eecs598\n\n\"\"\" Utilities for computing and checking gradients. \"\"\"\n\n\ndef grad_check_sp"
  },
  {
    "path": "eecs498-007/A6/eecs598/solver.py",
    "chars": 13635,
    "preview": "import pickle\nimport time\n\nimport torch\n\n\nclass Solver(object):\n    \"\"\"\n    A Solver encapsulates all the logic necessar"
  },
  {
    "path": "eecs498-007/A6/eecs598/submit.py",
    "chars": 3410,
    "preview": "import os\nimport zipfile\n\n_A1_FILES = [\n    \"pytorch101.py\",\n    \"pytorch101.ipynb\",\n    \"knn.py\",\n    \"knn.ipynb\",\n]\n\n_"
  },
  {
    "path": "eecs498-007/A6/eecs598/utils.py",
    "chars": 3676,
    "preview": "import torch\nimport random\nfrom torchvision.utils import make_grid\nimport matplotlib.pyplot as plt\nimport cv2\nimport num"
  },
  {
    "path": "eecs498-007/A6/eecs598/vis.py",
    "chars": 3625,
    "preview": "import random\nimport cv2\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport torch\nfrom torchvision.utils import "
  },
  {
    "path": "eecs498-007/A6/gan.py",
    "chars": 13791,
    "preview": "from __future__ import print_function\nimport matplotlib.pyplot as plt\nimport matplotlib.gridspec as gridspec\nimport nump"
  },
  {
    "path": "eecs498-007/A6/generative_adversarial_networks.ipynb",
    "chars": 1390133,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"accelerator\":\"GPU\",\"colab\":{\"name\":\"generative_adversarial_networks.ipynb\""
  },
  {
    "path": "eecs498-007/A6/vae.py",
    "chars": 16721,
    "preview": "from __future__ import print_function\nimport matplotlib.pyplot as plt\nimport matplotlib.gridspec as gridspec\nimport nump"
  },
  {
    "path": "eecs498-007/A6/variational_autoencoders.ipynb",
    "chars": 278014,
    "preview": "{\"nbformat\":4,\"nbformat_minor\":0,\"metadata\":{\"accelerator\":\"GPU\",\"colab\":{\"name\":\"variational_autoencoders.ipynb\",\"prove"
  }
]

// ... and 8 more files (download for full content)

About this extraction

This page contains the full source code of the seloufian/Deep-Learning-Computer-Vision GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 126 files (79.1 MB), approximately 6.8M tokens, and a symbol index with 1101 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!