master 3f5c85398663 cached
83 files
13.3 MB
3.5M tokens
823 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (13,932K chars total). Download the full file to get everything.
Repository: 0809zheng/CS231n-assignment2019
Branch: master
Commit: 3f5c85398663
Files: 83
Total size: 13.3 MB

Directory structure:
gitextract_bcs05ngm/

├── README.md
├── assignment1/
│   ├── README.md
│   ├── collectSubmission.sh
│   ├── cs231n/
│   │   ├── 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
│   ├── frameworkpython
│   ├── knn.ipynb
│   ├── requirements.txt
│   ├── softmax.ipynb
│   ├── start_ipython_osx.sh
│   ├── svm.ipynb
│   └── two_layer_net.ipynb
├── assignment2/
│   ├── BatchNormalization.ipynb
│   ├── ConvolutionalNetworks.ipynb
│   ├── Dropout.ipynb
│   ├── FullyConnectedNets.ipynb
│   ├── PyTorch.ipynb
│   ├── TensorFlow.ipynb
│   ├── collectSubmission.sh
│   ├── cs231n/
│   │   ├── classifiers/
│   │   │   ├── 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.cp37-win_amd64.pyd
│   │   ├── im2col_cython.pyx
│   │   ├── layer_utils.py
│   │   ├── layers.py
│   │   ├── optim.py
│   │   ├── setup.py
│   │   ├── solver.py
│   │   └── vis_utils.py
│   ├── frameworkpython
│   ├── requirements.txt
│   └── start_ipython_osx.sh
└── assignment3/
    ├── Generative_Adversarial_Networks_PyTorch.ipynb
    ├── Generative_Adversarial_Networks_TF.ipynb
    ├── LSTM_Captioning.ipynb
    ├── NetworkVisualization-PyTorch.ipynb
    ├── NetworkVisualization-TensorFlow.ipynb
    ├── RNN_Captioning.ipynb
    ├── StyleTransfer-PyTorch.ipynb
    ├── StyleTransfer-TensorFlow.ipynb
    ├── collectSubmission_pytorch.sh
    ├── collectSubmission_tensorflow.sh
    ├── cs231n/
    │   ├── captioning_solver.py
    │   ├── classifiers/
    │   │   ├── rnn.py
    │   │   └── squeezenet.py
    │   ├── coco_utils.py
    │   ├── data_utils.py
    │   ├── datasets/
    │   │   ├── get_assignment3_data.sh
    │   │   ├── get_coco_captioning.sh
    │   │   ├── get_imagenet_val.sh
    │   │   └── get_squeezenet_tf.sh
    │   ├── fast_layers.py
    │   ├── gradient_check.py
    │   ├── im2col.py
    │   ├── im2col_cython.pyx
    │   ├── image_utils.py
    │   ├── layer_utils.py
    │   ├── layers.py
    │   ├── optim.py
    │   ├── rnn_layers.py
    │   └── setup.py
    ├── frameworkpython
    ├── gan-checks-tf.npz
    ├── requirements.txt
    ├── start_ipython_osx.sh
    ├── style-transfer-checks-tf.npz
    └── style-transfer-checks.npz

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

================================================
FILE: README.md
================================================
# CS231n-assignment2019
CS231n 2019春季学期课程作业。
课程网站:http://cs231n.stanford.edu/syllabus.html


================================================
FILE: assignment1/README.md
================================================
Details about this assignment can be found [on the course webpage](http://cs231n.github.io/), under Assignment #1 of Spring 2019.


================================================
FILE: assignment1/collectSubmission.sh
================================================
#!/bin/bash
#NOTE: DO NOT EDIT THIS FILE-- MAY RESULT IN INCOMPLETE SUBMISSIONS

NOTEBOOKS="knn.ipynb 
svm.ipynb 
softmax.ipynb 
two_layer_net.ipynb 
features.ipynb"

CODE="cs231n/classifiers/k_nearest_neighbor.py
cs231n/classifiers/linear_classifier.py
cs231n/classifiers/linear_svm.py
cs231n/classifiers/softmax.py
cs231n/classifiers/neural_net.py"

LOCAL_DIR=`pwd`
REMOTE_DIR="cs231n-2019-assignment1"
ASSIGNMENT_NO=1
ZIP_FILENAME="a1.zip"

C_R="\e[31m"
C_G="\e[32m"
C_BLD="\e[1m"
C_E="\e[0m"

FILES=""
for FILE in "${NOTEBOOKS} ${CODE}"
do
	if [ ! -f ${F} ]; then
		echo -e "${C_R}Required file ${FILE} not found, Exiting.${C_E}"
		exit 0
	fi
	FILES="${FILES} ${LOCAL_DIR}/${FILE}"
done

echo -e "${C_BLD}### Zipping file ###${C_E}"
rm -f ${ZIP_FILENAME}
zip -r ${ZIP_FILENAME} . -x "*.git*" "*cs231n/datasets*" "*.ipynb_checkpoints*" "*README.md" "collectSubmission.sh" "*requirements.txt" "*__pycache__*" ".env/*" > assignment_zip.log
echo ""

echo -e "${C_BLD}### Submitting to myth ###${C_E}"
echo "Type in your Stanford student ID (alphanumeric, *not* the 8-digit ID):"
read -p "Student ID: " SUID
echo ""

echo -e "${C_BLD}### Copying to ${SUID}@myth.stanford.edu:${REMOTE_DIR} ###${C_E}"
echo -e "${C_G}Note: if myth is under heavy use, this may hang: If this happens, rerun the script.${C_E}"
FILES="${FILES} ${LOCAL_DIR}/${ZIP_FILENAME}"
rsync -avP ${FILES} ${SUID}@myth.stanford.edu:${REMOTE_DIR}
echo ""

echo -e "${C_BLD}### Running remote submission script from ${SUID}@myth.stanford.edu:${REMOTE_DIR} ###${C_E}"
ssh ${SUID}@myth.stanford.edu "cd ${REMOTE_DIR} && /afs/ir/class/cs231n/grading/submit ${ASSIGNMENT_NO} ${SUID} ${ZIP_FILENAME} && exit"

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


================================================
FILE: 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)*****
                
                dists[i, j] = np.sqrt(np.sum(np.square((X[i] - self.X_train[j]))))
                
                # *****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)*****

        num_test = X.shape[0]
        num_train = self.X_train.shape[0]
        dists = np.zeros((num_test, num_train)) 
        dists = np.sqrt(
                np.sum(X**2, axis = 1, keepdims = True)
                + np.sum(self.X_train**2, axis = 1, keepdims = True).T
                - 2*np.dot(X, self.X_train.T)
                )
        

        # *****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)*****
            
            max_index = np.argsort(dists[i])
            for j in range(k):
                index = max_index[j]
                closest_y.append(self.y_train[index])
                
            # *****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)*****
            
            maxdir = {}
            sy = set(closest_y)
            for s in sy:
                count = closest_y.count(s)
                maxdir[s] = count 
            y_pred[i] = int(max(maxdir, key = maxdir.get)) 
            
            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        return y_pred

================================================
FILE: 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)*****

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

            # *****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)*****

            loss, grad = self.loss(X_batch, y_batch, reg)
            loss_history.append(loss)
            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)*****

        scores = X.dot(self.W)
        y_pred = np.argsort(scores,axis = 1)[:,-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: 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]]
        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

    # 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 that 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)*****

    for i in range(num_train):
        scores = X[i].dot(W)
        index = y[i]
        for j in range(num_classes):
            if j != index and scores[j] >= scores[index]-1:
                dW[:,j] += X[i]
                dW[:,index] -= X[i]
 
    dW /= num_train
    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)*****

    num_train = X.shape[0]
    scores = X.dot(W)
    rightscore = scores[np.arange(num_train), y]
    scores = scores - rightscore.reshape(-1, 1) + 1.
    scores[scores <= 0] = 0
    scores[np.arange(num_train), y] = 0
    loss = np.sum(scores)/num_train

    # *****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)*****

    C = W.shape[1]
    mask = np.zeros((num_train, C))
    scores[scores > 0] = 1
    mask += scores
    mask[np.arange(num_train), y] = -np.sum(scores,axis = 1)
    dW = X.T.dot(mask)/num_train
    dW += 2*reg*W

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

    return loss, dW


================================================
FILE: 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)*****

        z1 = X.dot(W1)+b1
        a1 = np.maximum(0, z1)
        scores = a1.dot(W2)+b2

        # *****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)*****

        exp_scores = np.exp(scores-np.max(scores, axis = 1, keepdims = True))
        final_scores = exp_scores/np.sum(exp_scores, axis=1, keepdims = True)
        loss = np.sum(-np.log(final_scores[np.arange(N),y]))/N
        loss += reg*np.sum(np.square(W1))
        loss += reg*np.sum(np.square(W2))

        # *****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)*****

        dexp_scores = np.ones(exp_scores.shape)/np.sum(exp_scores, axis=1, keepdims = True)
        dexp_scores[np.arange(N), y] -= 1/exp_scores[np.arange(N), y]
        dexp_scores /= N
        dscores = exp_scores*dexp_scores
        db2 = np.sum(dscores,axis=0)
        dW2 = a1.T.dot(dscores)
        da1 = dscores.dot(W2.T)
        dz1 = da1
        dz1[z1 <= 0] = 0 
        db1 = np.sum(dz1, axis=0)
        dW1 = X.T.dot(dz1)
        
        dW1 += 2*reg*W1   
        dW2 += 2*reg*W2
        grads['W1'] = dW1
        grads['b1'] = db1
        grads['W2'] = dW2
        grads['b2'] = db2   

        # *****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)*****

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

            # *****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['W2'] -= learning_rate*grads['W2']
            self.params['b1'] -= learning_rate*grads['b1']
            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)*****

        scores = np.maximum(X.dot(self.params['W1']) + self.params['b1'], 0).dot(self.params['W2']) + self.params['b2']
        y_pred = np.argsort(scores,axis = 1)[:,-1]

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

        return y_pred


================================================
FILE: 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)*****

    num_train, dim = X.shape
    classes = W.shape[1]
    scores = X.dot(W)
    
    sta_scores = scores - np.max(scores, axis = 1, keepdims = True) #Numerical Stability
    exp_scores = np.exp(sta_scores)
    final_scores = exp_scores/np.sum(exp_scores, axis = 1, keepdims = True)
  
    for i in range(num_train):
        loss -= np.log(final_scores[i,y[i]])
  
    loss /= num_train
    loss += reg*np.sum(np.square(W))
  
    for i in range(num_train):
        for d in range(dim):
            for c in range(classes):
                dW[d, c] += (final_scores[i, c]*X[i, d])
                if c == y[i]:
                    dW[d, c] -= X[i, d]
          
    dW /= num_train
    dW += 2*reg*W

    # *****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)*****

    num_train, dim = X.shape
    classes = W.shape[1]
    scores = X.dot(W)
    
    sta_scores = scores - np.max(scores, axis = 1, keepdims = True) #Numerical Stability
    exp_scores = np.exp(sta_scores)
    final_scores = exp_scores/np.sum(exp_scores, axis = 1, keepdims = True)
    loss = -np.sum(np.log(final_scores[np.arange(num_train), y]))/num_train
    loss += reg*np.sum(np.square(W))
  
    mask = final_scores.copy()
    mask[np.arange(num_train), y] -= 1
    dW = X.T.dot(mask)/num_train
    dW += 2*reg*W

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

    return loss, dW


================================================
FILE: 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: assignment1/cs231n/datasets/get_datasets.sh
================================================
# Get CIFAR10
wget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
tar -xzvf cifar-10-python.tar.gz
rm cifar-10-python.tar.gz 


================================================
FILE: 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


================================================
FILE: 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: 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: assignment1/features.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "pdf-title"
    ]
   },
   "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",
   "execution_count": 1,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [],
   "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"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "source": [
    "## Load data\n",
    "Similar to previous exercises, we will load CIFAR-10 data from disk."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [],
   "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()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "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",
   "execution_count": 3,
   "metadata": {
    "scrolled": true,
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "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"
     ]
    }
   ],
   "source": [
    "from cs231n.features import *\n",
    "\n",
    "num_color_bins = 10 # Number of bins in the color histogram\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))])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "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",
   "execution_count": 4,
   "metadata": {
    "tags": [
     "code"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lr 1.000000e-09 reg 5.000000e+04 train accuracy: 0.090714 val accuracy: 0.093000\n",
      "lr 1.000000e-09 reg 5.000000e+05 train accuracy: 0.111184 val accuracy: 0.101000\n",
      "lr 1.000000e-09 reg 5.000000e+06 train accuracy: 0.413245 val accuracy: 0.414000\n",
      "lr 1.000000e-08 reg 5.000000e+04 train accuracy: 0.106082 val accuracy: 0.092000\n",
      "lr 1.000000e-08 reg 5.000000e+05 train accuracy: 0.416102 val accuracy: 0.417000\n",
      "lr 1.000000e-08 reg 5.000000e+06 train accuracy: 0.412061 val accuracy: 0.421000\n",
      "lr 1.000000e-07 reg 5.000000e+04 train accuracy: 0.413184 val accuracy: 0.414000\n",
      "lr 1.000000e-07 reg 5.000000e+05 train accuracy: 0.410347 val accuracy: 0.403000\n",
      "lr 1.000000e-07 reg 5.000000e+06 train accuracy: 0.336694 val accuracy: 0.323000\n",
      "best validation accuracy achieved during cross-validation: 0.421000\n"
     ]
    }
   ],
   "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-9, 1e-8, 1e-7]\n",
    "regularization_strengths = [5e4, 5e5, 5e6]\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",
    "for learning_rate in learning_rates:\n",
    "    for regularization_strength in regularization_strengths:\n",
    "        svm = LinearSVM()\n",
    "        loss_hist = svm.train(X_train_feats, y_train, learning_rate=learning_rate, \n",
    "                              reg=regularization_strength, num_iters=1500, verbose=False)\n",
    "        y_train_pred = svm.predict(X_train_feats)\n",
    "        training_accuracy = np.mean(y_train == y_train_pred)\n",
    "        y_val_pred = svm.predict(X_val_feats)\n",
    "        validation_accuracy = np.mean(y_val == y_val_pred)\n",
    "        results[(learning_rate, regularization_strength)] = (training_accuracy, validation_accuracy)\n",
    "        if best_val < validation_accuracy:\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)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.427\n"
     ]
    }
   ],
   "source": [
    "# Evaluate your trained SVM on the test set\n",
    "y_test_pred = best_svm.predict(X_test_feats)\n",
    "test_accuracy = np.mean(y_test == y_test_pred)\n",
    "print(test_accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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
Download .txt
gitextract_bcs05ngm/

├── README.md
├── assignment1/
│   ├── README.md
│   ├── collectSubmission.sh
│   ├── cs231n/
│   │   ├── 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
│   ├── frameworkpython
│   ├── knn.ipynb
│   ├── requirements.txt
│   ├── softmax.ipynb
│   ├── start_ipython_osx.sh
│   ├── svm.ipynb
│   └── two_layer_net.ipynb
├── assignment2/
│   ├── BatchNormalization.ipynb
│   ├── ConvolutionalNetworks.ipynb
│   ├── Dropout.ipynb
│   ├── FullyConnectedNets.ipynb
│   ├── PyTorch.ipynb
│   ├── TensorFlow.ipynb
│   ├── collectSubmission.sh
│   ├── cs231n/
│   │   ├── classifiers/
│   │   │   ├── 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.cp37-win_amd64.pyd
│   │   ├── im2col_cython.pyx
│   │   ├── layer_utils.py
│   │   ├── layers.py
│   │   ├── optim.py
│   │   ├── setup.py
│   │   ├── solver.py
│   │   └── vis_utils.py
│   ├── frameworkpython
│   ├── requirements.txt
│   └── start_ipython_osx.sh
└── assignment3/
    ├── Generative_Adversarial_Networks_PyTorch.ipynb
    ├── Generative_Adversarial_Networks_TF.ipynb
    ├── LSTM_Captioning.ipynb
    ├── NetworkVisualization-PyTorch.ipynb
    ├── NetworkVisualization-TensorFlow.ipynb
    ├── RNN_Captioning.ipynb
    ├── StyleTransfer-PyTorch.ipynb
    ├── StyleTransfer-TensorFlow.ipynb
    ├── collectSubmission_pytorch.sh
    ├── collectSubmission_tensorflow.sh
    ├── cs231n/
    │   ├── captioning_solver.py
    │   ├── classifiers/
    │   │   ├── rnn.py
    │   │   └── squeezenet.py
    │   ├── coco_utils.py
    │   ├── data_utils.py
    │   ├── datasets/
    │   │   ├── get_assignment3_data.sh
    │   │   ├── get_coco_captioning.sh
    │   │   ├── get_imagenet_val.sh
    │   │   └── get_squeezenet_tf.sh
    │   ├── fast_layers.py
    │   ├── gradient_check.py
    │   ├── im2col.py
    │   ├── im2col_cython.pyx
    │   ├── image_utils.py
    │   ├── layer_utils.py
    │   ├── layers.py
    │   ├── optim.py
    │   ├── rnn_layers.py
    │   └── setup.py
    ├── frameworkpython
    ├── gan-checks-tf.npz
    ├── requirements.txt
    ├── start_ipython_osx.sh
    ├── style-transfer-checks-tf.npz
    └── style-transfer-checks.npz
Download .txt
SYMBOL INDEX (823 symbols across 34 files)

FILE: 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 85) | def compute_distances_one_loop(self, X):
    method compute_distances_no_loops (line 109) | def compute_distances_no_loops(self, X):
    method predict_labels (line 147) | def predict_labels(self, dists, k=1):

FILE: 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 88) | def predict(self, X):
    method loss (line 115) | def loss(self, X_batch, y_batch, reg):
  class LinearSVM (line 133) | class LinearSVM(LinearClassifier):
    method loss (line 136) | def loss(self, X_batch, y_batch, reg):
  class Softmax (line 140) | class Softmax(LinearClassifier):
    method loss (line 143) | def loss(self, X_batch, y_batch, reg):

FILE: 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 74) | def svm_loss_vectorized(W, X, y, reg):

FILE: 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 143) | def train(self, X, y, X_val, y_val,
    method predict (line 227) | def predict(self, X):

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

FILE: 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: 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: 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: 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: assignment2/cs231n/classifiers/cnn.py
  class ThreeLayerConvNet (line 9) | class ThreeLayerConvNet(object):
    method __init__ (line 20) | def __init__(self, input_dim=(3, 32, 32), num_filters=32, filter_size=7,
    method loss (line 80) | def loss(self, X, y=None):

FILE: assignment2/cs231n/classifiers/fc_net.py
  class TwoLayerNet (line 9) | class TwoLayerNet(object):
    method __init__ (line 25) | def __init__(self, input_dim=3*32*32, hidden_dim=100, num_classes=10,
    method loss (line 67) | def loss(self, X, y=None):
  class FullyConnectedNet (line 143) | class FullyConnectedNet(object):
    method __init__ (line 159) | def __init__(self, hidden_dims, input_dim=3*32*32, num_classes=10,
    method loss (line 248) | def loss(self, X, y=None):

FILE: assignment2/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: assignment2/cs231n/fast_layers.py
  function conv_forward_im2col (line 16) | def conv_forward_im2col(x, w, b, conv_param):
  function conv_forward_pytorch (line 45) | def conv_forward_pytorch(x, w, b, conv_param):
  function conv_backward_pytorch (line 57) | def conv_backward_pytorch(dout, cache):
  function conv_forward_strides (line 65) | def conv_forward_strides(x, w, b, conv_param):
  function conv_backward_strides (line 109) | def conv_backward_strides(dout, cache):
  function conv_backward_im2col (line 129) | def conv_backward_im2col(dout, cache):
  function max_pool_forward_fast (line 155) | def max_pool_forward_fast(x, pool_param):
  function max_pool_backward_fast (line 179) | def max_pool_backward_fast(dout, cache):
  function max_pool_forward_reshape (line 195) | def max_pool_forward_reshape(x, pool_param):
  function max_pool_backward_reshape (line 216) | def max_pool_backward_reshape(dout, cache):
  function max_pool_forward_im2col (line 247) | def max_pool_forward_im2col(x, pool_param):
  function max_pool_backward_im2col (line 274) | def max_pool_backward_im2col(dout, cache):

FILE: assignment2/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: 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 41) | def col2im_indices(cols, x_shape, field_height=3, field_width=3, padding=1,

FILE: assignment2/cs231n/im2col_cython.c
  type PyObject (line 355) | typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *co...
  type PyObject (line 356) | typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, ...
  type Py_tss_t (line 417) | typedef int Py_tss_t;
  function CYTHON_INLINE (line 418) | static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) {
  function CYTHON_INLINE (line 422) | static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) {
  function CYTHON_INLINE (line 427) | static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) {
  function CYTHON_INLINE (line 430) | static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) {
  function CYTHON_INLINE (line 433) | static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) {
  function CYTHON_INLINE (line 437) | static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) {
  function CYTHON_INLINE (line 440) | static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) {
  type Py_hash_t (line 564) | typedef long Py_hash_t;
  type __Pyx_PyAsyncMethodsStruct (line 587) | typedef struct {
  function CYTHON_INLINE (line 601) | 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 665) | static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t l...
  function CYTHON_INLINE (line 714) | static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) {
  function __Pyx_init_sys_getdefaultencoding_params (line 746) | static int __Pyx_init_sys_getdefaultencoding_params(void) {
  function __Pyx_init_sys_getdefaultencoding_params (line 796) | static int __Pyx_init_sys_getdefaultencoding_params(void) {
  function CYTHON_INLINE (line 828) | static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void...
  type __Pyx_StructField_ (line 873) | struct __Pyx_StructField_
  type __Pyx_TypeInfo (line 875) | typedef struct {
  type __Pyx_StructField (line 885) | typedef struct __Pyx_StructField_ {
  type __Pyx_BufFmt_StackElem (line 890) | typedef struct {
  type __Pyx_BufFmt_Context (line 894) | typedef struct {
  type __pyx_atomic_int_type (line 955) | typedef volatile __pyx_atomic_int_type __pyx_atomic_int;
  type __pyx_memoryview_obj (line 969) | struct __pyx_memoryview_obj
  type __Pyx_memviewslice (line 970) | typedef struct {
  type npy_int8 (line 987) | typedef npy_int8 __pyx_t_5numpy_int8_t;
  type npy_int16 (line 996) | typedef npy_int16 __pyx_t_5numpy_int16_t;
  type npy_int32 (line 1005) | typedef npy_int32 __pyx_t_5numpy_int32_t;
  type npy_int64 (line 1014) | typedef npy_int64 __pyx_t_5numpy_int64_t;
  type npy_uint8 (line 1023) | typedef npy_uint8 __pyx_t_5numpy_uint8_t;
  type npy_uint16 (line 1032) | typedef npy_uint16 __pyx_t_5numpy_uint16_t;
  type npy_uint32 (line 1041) | typedef npy_uint32 __pyx_t_5numpy_uint32_t;
  type npy_uint64 (line 1050) | typedef npy_uint64 __pyx_t_5numpy_uint64_t;
  type npy_float32 (line 1059) | typedef npy_float32 __pyx_t_5numpy_float32_t;
  type npy_float64 (line 1068) | typedef npy_float64 __pyx_t_5numpy_float64_t;
  type npy_long (line 1077) | typedef npy_long __pyx_t_5numpy_int_t;
  type npy_longlong (line 1086) | typedef npy_longlong __pyx_t_5numpy_long_t;
  type npy_longlong (line 1095) | typedef npy_longlong __pyx_t_5numpy_longlong_t;
  type npy_ulong (line 1104) | typedef npy_ulong __pyx_t_5numpy_uint_t;
  type npy_ulonglong (line 1113) | typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
  type npy_ulonglong (line 1122) | typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;
  type npy_intp (line 1131) | typedef npy_intp __pyx_t_5numpy_intp_t;
  type npy_uintp (line 1140) | typedef npy_uintp __pyx_t_5numpy_uintp_t;
  type npy_double (line 1149) | typedef npy_double __pyx_t_5numpy_float_t;
  type npy_double (line 1158) | typedef npy_double __pyx_t_5numpy_double_t;
  type npy_longdouble (line 1167) | typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
  type std (line 1171) | typedef ::std::complex< float > __pyx_t_float_complex;
  type __pyx_t_float_complex (line 1173) | typedef float _Complex __pyx_t_float_complex;
  type __pyx_t_float_complex (line 1176) | typedef struct { float real, imag; } __pyx_t_float_complex;
  type std (line 1183) | typedef ::std::complex< double > __pyx_t_double_complex;
  type __pyx_t_double_complex (line 1185) | typedef double _Complex __pyx_t_double_complex;
  type __pyx_t_double_complex (line 1188) | typedef struct { double real, imag; } __pyx_t_double_complex;
  type __pyx_array_obj (line 1194) | struct __pyx_array_obj
  type __pyx_MemviewEnum_obj (line 1195) | struct __pyx_MemviewEnum_obj
  type __pyx_memoryview_obj (line 1196) | struct __pyx_memoryview_obj
  type __pyx_memoryviewslice_obj (line 1197) | struct __pyx_memoryviewslice_obj
  type npy_cfloat (line 1206) | typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
  type npy_cdouble (line 1215) | typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
  type npy_clongdouble (line 1224) | typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
  type npy_cdouble (line 1233) | typedef npy_cdouble __pyx_t_5numpy_complex_t;
  type __pyx_array_obj (line 1242) | struct __pyx_array_obj {
  type __pyx_MemviewEnum_obj (line 1267) | struct __pyx_MemviewEnum_obj {
  type __pyx_memoryview_obj (line 1280) | struct __pyx_memoryview_obj {
  type __pyx_memoryviewslice_obj (line 1303) | struct __pyx_memoryviewslice_obj {
  type __pyx_vtabstruct_array (line 1321) | struct __pyx_vtabstruct_array {
  type __pyx_vtabstruct_array (line 1324) | struct __pyx_vtabstruct_array
  type __pyx_vtabstruct_memoryview (line 1335) | struct __pyx_vtabstruct_memoryview {
  type __pyx_vtabstruct_memoryview (line 1344) | struct __pyx_vtabstruct_memoryview
  type __pyx_vtabstruct__memoryviewslice (line 1355) | struct __pyx_vtabstruct__memoryviewslice {
  type __pyx_vtabstruct__memoryviewslice (line 1358) | struct __pyx_vtabstruct__memoryviewslice
  type __Pyx_RefNannyAPIStruct (line 1366) | typedef struct {
  function CYTHON_INLINE (line 1469) | static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObjec...
  function CYTHON_INLINE (line 1645) | static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
  type __pyx_array_obj (line 1780) | struct __pyx_array_obj
  function CYTHON_INLINE (line 1785) | static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s...
  function CYTHON_INLINE (line 1789) | static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char ...
  function CYTHON_INLINE (line 1793) | static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char ...
  function CYTHON_INLINE (line 1834) | static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject*...
  function CYTHON_INLINE (line 1858) | static CYTHON_INLINE int __Pyx_PyList_Extend(PyObject* L, PyObject* v) {
  type __Pyx_ImportType_CheckSize (line 1907) | enum __Pyx_ImportType_CheckSize {
  type __Pyx_ImportType_CheckSize (line 1912) | enum __Pyx_ImportType_CheckSize
  type __pyx_CyFunctionObject (line 1931) | typedef struct {
  type __pyx_FusedFunctionObject (line 1973) | typedef struct {
  type __Pyx_CodeObjectCacheEntry (line 1999) | typedef struct {
  type __Pyx_CodeObjectCache (line 2003) | struct __Pyx_CodeObjectCache {
  type __Pyx_CodeObjectCache (line 2008) | struct __Pyx_CodeObjectCache
  type __Pyx_Buf_DimInfo (line 2027) | typedef struct {
  type __Pyx_Buffer (line 2030) | typedef struct {
  type __Pyx_LocalBuf_ND (line 2034) | typedef struct {
  type NPY_TYPES (line 2188) | enum NPY_TYPES
  type __pyx_memoryview_obj (line 2208) | struct __pyx_memoryview_obj
  type __pyx_array_obj (line 2245) | struct __pyx_array_obj
  type __pyx_memoryview_obj (line 2246) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2247) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2248) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2249) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2249) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2250) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2251) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2252) | struct __pyx_memoryview_obj
  type __pyx_memoryviewslice_obj (line 2253) | struct __pyx_memoryviewslice_obj
  type __pyx_memoryviewslice_obj (line 2254) | struct __pyx_memoryviewslice_obj
  type __pyx_array_obj (line 2305) | struct __pyx_array_obj
  type __pyx_memoryview_obj (line 2311) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2311) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2316) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2317) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2318) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 2319) | struct __pyx_memoryview_obj
  type __pyx_MemviewEnum_obj (line 2337) | 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 2754) | static PyObject *__pyx_pw_13im2col_cython_1im2col_cython(PyObject *__pyx...
  function PyObject (line 2835) | static PyObject *__pyx_pf_13im2col_cython_im2col_cython(CYTHON_UNUSED Py...
  function PyObject (line 3281) | static PyObject *__pyx_fuse_0__pyx_pw_13im2col_cython_7im2col_cython(PyO...
  function PyObject (line 3378) | static PyObject *__pyx_pf_13im2col_cython_6im2col_cython(CYTHON_UNUSED P...
  function PyObject (line 3765) | static PyObject *__pyx_fuse_1__pyx_pw_13im2col_cython_9im2col_cython(PyO...
  function PyObject (line 3862) | static PyObject *__pyx_pf_13im2col_cython_8im2col_cython(CYTHON_UNUSED P...
  function __pyx_fuse_0__pyx_f_13im2col_cython_im2col_cython_inner (line 4254) | 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 4460) | static int __pyx_fuse_1__pyx_f_13im2col_cython_im2col_cython_inner(PyArr...
  function PyObject (line 4677) | static PyObject *__pyx_pw_13im2col_cython_3col2im_cython(PyObject *__pyx...
  function PyObject (line 4758) | static PyObject *__pyx_pf_13im2col_cython_2col2im_cython(CYTHON_UNUSED P...
  function PyObject (line 5204) | static PyObject *__pyx_fuse_0__pyx_pw_13im2col_cython_13col2im_cython(Py...
  function PyObject (line 5345) | static PyObject *__pyx_pf_13im2col_cython_12col2im_cython(CYTHON_UNUSED ...
  function PyObject (line 5676) | static PyObject *__pyx_fuse_1__pyx_pw_13im2col_cython_15col2im_cython(Py...
  function PyObject (line 5817) | static PyObject *__pyx_pf_13im2col_cython_14col2im_cython(CYTHON_UNUSED ...
  function __pyx_fuse_0__pyx_f_13im2col_cython_col2im_cython_inner (line 6153) | 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 6359) | static int __pyx_fuse_1__pyx_f_13im2col_cython_col2im_cython_inner(PyArr...
  function PyObject (line 6573) | static PyObject *__pyx_fuse_0__pyx_f_13im2col_cython_col2im_6d_cython_in...
  function PyObject (line 6762) | static PyObject *__pyx_fuse_1__pyx_f_13im2col_cython_col2im_6d_cython_in...
  function PyObject (line 6962) | static PyObject *__pyx_pw_13im2col_cython_5col2im_6d_cython(PyObject *__...
  function PyObject (line 7043) | static PyObject *__pyx_pf_13im2col_cython_4col2im_6d_cython(CYTHON_UNUSE...
  function PyObject (line 7489) | static PyObject *__pyx_fuse_0__pyx_pw_13im2col_cython_19col2im_6d_cython...
  function PyObject (line 7630) | static PyObject *__pyx_pf_13im2col_cython_18col2im_6d_cython(CYTHON_UNUS...
  function PyObject (line 7959) | static PyObject *__pyx_fuse_1__pyx_pw_13im2col_cython_21col2im_6d_cython...
  function PyObject (line 8100) | static PyObject *__pyx_pf_13im2col_cython_20col2im_6d_cython(CYTHON_UNUS...
  function CYTHON_UNUSED (line 8436) | static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObjec...
  function __pyx_pf_5numpy_7ndarray___getbuffer__ (line 8447) | static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v...
  function CYTHON_UNUSED (line 9200) | static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(Py...
  function __pyx_pf_5numpy_7ndarray_2__releasebuffer__ (line 9209) | static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *_...
  function CYTHON_INLINE (line 9290) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyOb...
  function CYTHON_INLINE (line 9337) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyOb...
  function CYTHON_INLINE (line 9384) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyOb...
  function CYTHON_INLINE (line 9431) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyOb...
  function CYTHON_INLINE (line 9478) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyOb...
  function CYTHON_INLINE (line 9525) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_D...
  function CYTHON_INLINE (line 9599) | static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Desc...
  function CYTHON_INLINE (line 10345) | static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *_...
  function CYTHON_INLINE (line 10387) | static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObje...
  function CYTHON_INLINE (line 10468) | static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) {
  function CYTHON_INLINE (line 10597) | static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) {
  function CYTHON_INLINE (line 10726) | static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) {
  function __pyx_array___cinit__ (line 10854) | static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx...
  function __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__ (line 10979) | static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(s...
  function CYTHON_UNUSED (line 11599) | static CYTHON_UNUSED int __pyx_array_getbuffer(PyObject *__pyx_v_self, P...
  function __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__ (line 11610) | static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffe...
  function __pyx_array___dealloc__ (line 11903) | static void __pyx_array___dealloc__(PyObject *__pyx_v_self) {
  function __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__ (line 11912) | static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc...
  function PyObject (line 12034) | static PyObject *__pyx_pw_15View_dot_MemoryView_5array_7memview_1__get__...
  function PyObject (line 12045) | static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(...
  function PyObject (line 12092) | static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v...
  function Py_ssize_t (line 12171) | static Py_ssize_t __pyx_array___len__(PyObject *__pyx_v_self) {
  function Py_ssize_t (line 12182) | static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__l...
  function PyObject (line 12221) | static PyObject *__pyx_array___getattr__(PyObject *__pyx_v_self, PyObjec...
  function PyObject (line 12232) | static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__ge...
  function PyObject (line 12286) | static PyObject *__pyx_array___getitem__(PyObject *__pyx_v_self, PyObjec...
  function PyObject (line 12297) | static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__g...
  function __pyx_array___setitem__ (line 12351) | static int __pyx_array___setitem__(PyObject *__pyx_v_self, PyObject *__p...
  function __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__ (line 12362) | static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem...
  function PyObject (line 12408) | static PyObject *__pyx_pw___pyx_array_1__reduce_cython__(PyObject *__pyx...
  function PyObject (line 12419) | static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED st...
  function PyObject (line 12462) | static PyObject *__pyx_pw___pyx_array_3__setstate_cython__(PyObject *__p...
  function PyObject (line 12473) | static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED...
  type __pyx_array_obj (line 12515) | struct __pyx_array_obj
  type __pyx_array_obj (line 12516) | struct __pyx_array_obj
  type __pyx_array_obj (line 12517) | struct __pyx_array_obj
  type __pyx_array_obj (line 12566) | struct __pyx_array_obj
  type __pyx_array_obj (line 12630) | struct __pyx_array_obj
  function __pyx_MemviewEnum___init__ (line 12689) | static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *...
  function __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__ (line 12737) | static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init...
  function PyObject (line 12779) | static PyObject *__pyx_MemviewEnum___repr__(PyObject *__pyx_v_self) {
  function PyObject (line 12790) | static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_...
  function PyObject (line 12830) | static PyObject *__pyx_pw___pyx_MemviewEnum_1__reduce_cython__(PyObject ...
  function PyObject (line 12841) | static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __p...
  function PyObject (line 13062) | static PyObject *__pyx_pw___pyx_MemviewEnum_3__setstate_cython__(PyObjec...
  function PyObject (line 13073) | static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct ...
  function __pyx_memoryview___cinit__ (line 13202) | static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *...
  function __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit__ (line 13279) | static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_...
  function __pyx_memoryview___dealloc__ (line 13575) | static void __pyx_memoryview___dealloc__(PyObject *__pyx_v_self) {
  function __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__dealloc__ (line 13584) | static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview...
  type __pyx_memoryview_obj (line 13765) | struct __pyx_memoryview_obj
  function PyObject (line 13902) | static PyObject *__pyx_memoryview___getitem__(PyObject *__pyx_v_self, Py...
  function PyObject (line 13913) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function __pyx_memoryview___setitem__ (line 14088) | static int __pyx_memoryview___setitem__(PyObject *__pyx_v_self, PyObject...
  function __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setitem__ (line 14099) | static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_...
  function PyObject (line 14311) | static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *...
  function PyObject (line 14518) | static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_...
  function PyObject (line 14601) | static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __p...
  function PyObject (line 14886) | static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryvie...
  function PyObject (line 14944) | static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_me...
  function PyObject (line 15218) | static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_m...
  function CYTHON_UNUSED (line 15456) | static CYTHON_UNUSED int __pyx_memoryview_getbuffer(PyObject *__pyx_v_se...
  function __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbuffer__ (line 15467) | static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_...
  function PyObject (line 15797) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_1T_1__get__...
  function PyObject (line 15808) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(...
  function PyObject (line 15880) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4base_1__ge...
  function PyObject (line 15891) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get...
  function PyObject (line 15933) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_5shape_1__g...
  function PyObject (line 15944) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___ge...
  function PyObject (line 16011) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_7strides_1_...
  function PyObject (line 16022) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___...
  function PyObject (line 16122) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_10suboffset...
  function PyObject (line 16133) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffset...
  function PyObject (line 16237) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4ndim_1__ge...
  function PyObject (line 16248) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get...
  function PyObject (line 16297) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_8itemsize_1...
  function PyObject (line 16308) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize__...
  function PyObject (line 16357) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_6nbytes_1__...
  function PyObject (line 16368) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___g...
  function PyObject (line 16427) | static PyObject *__pyx_pw_15View_dot_MemoryView_10memoryview_4size_1__ge...
  function PyObject (line 16438) | static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get...
  function Py_ssize_t (line 16565) | static Py_ssize_t __pyx_memoryview___len__(PyObject *__pyx_v_self) {
  function Py_ssize_t (line 16576) | static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memo...
  function PyObject (line 16645) | static PyObject *__pyx_memoryview___repr__(PyObject *__pyx_v_self) {
  function PyObject (line 16656) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 16744) | static PyObject *__pyx_memoryview___str__(PyObject *__pyx_v_self) {
  function PyObject (line 16755) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 16820) | static PyObject *__pyx_memoryview_is_c_contig(PyObject *__pyx_v_self, CY...
  function PyObject (line 16831) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 16891) | static PyObject *__pyx_memoryview_is_f_contig(PyObject *__pyx_v_self, CY...
  function PyObject (line 16902) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 16962) | static PyObject *__pyx_memoryview_copy(PyObject *__pyx_v_self, CYTHON_UN...
  function PyObject (line 16973) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 17053) | static PyObject *__pyx_memoryview_copy_fortran(PyObject *__pyx_v_self, C...
  function PyObject (line 17064) | static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memor...
  function PyObject (line 17143) | static PyObject *__pyx_pw___pyx_memoryview_1__reduce_cython__(PyObject *...
  function PyObject (line 17154) | static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUS...
  function PyObject (line 17197) | static PyObject *__pyx_pw___pyx_memoryview_3__setstate_cython__(PyObject...
  function PyObject (line 17208) | static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_U...
  function PyObject (line 17250) | static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_f...
  function CYTHON_INLINE (line 17338) | static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) {
  function PyObject (line 17377) | static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) {
  function PyObject (line 17831) | static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets...
  type __pyx_memoryview_obj (line 17916) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 17916) | struct __pyx_memoryview_obj
  type __pyx_memoryviewslice_obj (line 17923) | struct __pyx_memoryviewslice_obj
  type __pyx_memoryview_obj (line 17933) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 17938) | struct __pyx_memoryview_obj
  type __pyx_memoryviewslice_obj (line 18005) | struct __pyx_memoryviewslice_obj
  type __pyx_memoryview_obj (line 18417) | struct __pyx_memoryview_obj
  type __pyx_memoryview_obj (line 18458) | struct __pyx_memoryview_obj
  function __pyx_memoryview_slice_memviewslice (line 18493) | static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx...
  function __pyx_memslice_transpose (line 19580) | static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) {
  function __pyx_memoryviewslice___dealloc__ (line 19753) | static void __pyx_memoryviewslice___dealloc__(PyObject *__pyx_v_self) {
  function __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewslice___dealloc__ (line 19762) | static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memo...
  function PyObject (line 19795) | static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __p...
  function PyObject (line 19878) | static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __...
  function PyObject (line 19960) | static PyObject *__pyx_pw_15View_dot_MemoryView_16_memoryviewslice_4base...
  function PyObject (line 19971) | static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base...
  function PyObject (line 20011) | static PyObject *__pyx_pw___pyx_memoryviewslice_1__reduce_cython__(PyObj...
  function PyObject (line 20022) | static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON...
  function PyObject (line 20065) | static PyObject *__pyx_pw___pyx_memoryviewslice_3__setstate_cython__(PyO...
  function PyObject (line 20076) | static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYT...
  function PyObject (line 20118) | static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_m...
  function __Pyx_memviewslice (line 20501) | static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(st...
  function __pyx_memoryview_slice_copy (line 20601) | static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__p...
  function PyObject (line 20727) | static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_ob...
  function PyObject (line 20784) | static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_me...
  function Py_ssize_t (line 20907) | static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) {
  function __pyx_get_best_slice_order (line 20973) | static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslic...
  function _copy_strided_to_strided (line 21163) | static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t ...
  function copy_strided_to_strided (line 21400) | static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __P...
  function Py_ssize_t (line 21430) | static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__...
  function Py_ssize_t (line 21502) | static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_sh...
  type __pyx_memoryview_obj (line 21633) | struct __pyx_memoryview_obj
  function __pyx_memoryview_err_extents (line 21876) | static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_...
  function __pyx_memoryview_err_dim (line 21961) | static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx...
  function __pyx_memoryview_err (line 22042) | static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_m...
  function __pyx_memoryview_copy_contents (line 22149) | static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src...
  function __pyx_memoryview_broadcast_leading (line 22725) | static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx...
  function __pyx_memoryview_refcount_copying (line 22838) | static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_...
  function __pyx_memoryview_refcount_objects_in_slice_with_gil (line 22888) | static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__...
  function __pyx_memoryview_refcount_objects_in_slice (line 22927) | static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_dat...
  function __pyx_memoryview_slice_assign_scalar (line 23059) | static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__p...
  function __pyx_memoryview__slice_assign_scalar (line 23107) | static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py...
  function PyObject (line 23239) | static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyO...
  function PyObject (line 23309) | static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTH...
  function PyObject (line 23497) | static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum...
  type __pyx_vtabstruct_array (line 23617) | struct __pyx_vtabstruct_array
  function PyObject (line 23619) | static PyObject *__pyx_tp_new_array(PyTypeObject *t, PyObject *a, PyObje...
  function __pyx_tp_dealloc_array (line 23639) | static void __pyx_tp_dealloc_array(PyObject *o) {
  function PyObject (line 23658) | static PyObject *__pyx_sq_item_array(PyObject *o, Py_ssize_t i) {
  function __pyx_mp_ass_subscript_array (line 23666) | static int __pyx_mp_ass_subscript_array(PyObject *o, PyObject *i, PyObje...
  function PyObject (line 23677) | static PyObject *__pyx_tp_getattro_array(PyObject *o, PyObject *n) {
  function PyObject (line 23686) | static PyObject *__pyx_getprop___pyx_array_memview(PyObject *o, CYTHON_U...
  type PyGetSetDef (line 23697) | struct PyGetSetDef
  type __pyx_array_obj (line 23741) | struct __pyx_array_obj
  function PyObject (line 23796) | static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObje...
  function __pyx_tp_dealloc_Enum (line 23810) | static void __pyx_tp_dealloc_Enum(PyObject *o) {
  function __pyx_tp_traverse_Enum (line 23822) | static int __pyx_tp_traverse_Enum(PyObject *o, visitproc v, void *a) {
  function __pyx_tp_clear_Enum (line 23831) | static int __pyx_tp_clear_Enum(PyObject *o) {
  type __pyx_MemviewEnum_obj (line 23849) | struct __pyx_MemviewEnum_obj
  type __pyx_vtabstruct_memoryview (line 23903) | struct __pyx_vtabstruct_memoryview
  function PyObject (line 23905) | static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, P...
  function __pyx_tp_dealloc_memoryview (line 23927) | static void __pyx_tp_dealloc_memoryview(PyObject *o) {
  function __pyx_tp_traverse_memoryview (line 23949) | static int __pyx_tp_traverse_memoryview(PyObject *o, visitproc v, void *...
  function __pyx_tp_clear_memoryview (line 23967) | static int __pyx_tp_clear_memoryview(PyObject *o) {
  function PyObject (line 23982) | static PyObject *__pyx_sq_item_memoryview(PyObject *o, Py_ssize_t i) {
  function __pyx_mp_ass_subscript_memoryview (line 23990) | static int __pyx_mp_ass_subscript_memoryview(PyObject *o, PyObject *i, P...
  function PyObject (line 24001) | static PyObject *__pyx_getprop___pyx_memoryview_T(PyObject *o, CYTHON_UN...
  function PyObject (line 24005) | static PyObject *__pyx_getprop___pyx_memoryview_base(PyObject *o, CYTHON...
  function PyObject (line 24009) | static PyObject *__pyx_getprop___pyx_memoryview_shape(PyObject *o, CYTHO...
  function PyObject (line 24013) | static PyObject *__pyx_getprop___pyx_memoryview_strides(PyObject *o, CYT...
  function PyObject (line 24017) | static PyObject *__pyx_getprop___pyx_memoryview_suboffsets(PyObject *o, ...
  function PyObject (line 24021) | static PyObject *__pyx_getprop___pyx_memoryview_ndim(PyObject *o, CYTHON...
  function PyObject (line 24025) | static PyObject *__pyx_getprop___pyx_memoryview_itemsize(PyObject *o, CY...
  function PyObject (line 24029) | static PyObject *__pyx_getprop___pyx_memoryview_nbytes(PyObject *o, CYTH...
  function PyObject (line 24033) | static PyObject *__pyx_getprop___pyx_memoryview_size(PyObject *o, CYTHON...
  type PyGetSetDef (line 24047) | struct PyGetSetDef
  type __pyx_memoryview_obj (line 24099) | struct __pyx_memoryview_obj
  type __pyx_vtabstruct__memoryviewslice (line 24153) | struct __pyx_vtabstruct__memoryviewslice
  function PyObject (line 24155) | static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject...
  function __pyx_tp_dealloc__memoryviewslice (line 24166) | static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) {
  function __pyx_tp_traverse__memoryviewslice (line 24187) | static int __pyx_tp_traverse__memoryviewslice(PyObject *o, visitproc v, ...
  function __pyx_tp_clear__memoryviewslice (line 24197) | static int __pyx_tp_clear__memoryviewslice(PyObject *o) {
  function PyObject (line 24208) | static PyObject *__pyx_getprop___pyx_memoryviewslice_base(PyObject *o, C...
  type PyGetSetDef (line 24218) | struct PyGetSetDef
  type __pyx_memoryviewslice_obj (line 24226) | struct __pyx_memoryviewslice_obj
  type PyModuleDef (line 24304) | struct PyModuleDef
  function CYTHON_SMALL_CODE (line 24475) | static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) {
  function CYTHON_SMALL_CODE (line 24491) | static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) {
  function CYTHON_SMALL_CODE (line 24935) | static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) {
  function __Pyx_modinit_global_init_code (line 24956) | static int __Pyx_modinit_global_init_code(void) {
  function __Pyx_modinit_variable_export_code (line 24969) | static int __Pyx_modinit_variable_export_code(void) {
  function __Pyx_modinit_function_export_code (line 24977) | static int __Pyx_modinit_function_export_code(void) {
  function __Pyx_modinit_type_init_code (line 24985) | static int __Pyx_modinit_type_init_code(void) {
  function __Pyx_modinit_type_import_code (line 25039) | static int __Pyx_modinit_type_import_code(void) {
  function __Pyx_modinit_variable_import_code (line 25076) | static int __Pyx_modinit_variable_import_code(void) {
  function __Pyx_modinit_function_import_code (line 25084) | static int __Pyx_modinit_function_import_code(void) {
  function __Pyx_PyMODINIT_FUNC (line 25113) | __Pyx_PyMODINIT_FUNC PyInit_im2col_cython(void)
  function CYTHON_SMALL_CODE (line 25118) | static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) {
  function CYTHON_SMALL_CODE (line 25141) | static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, P...
  function CYTHON_SMALL_CODE (line 25156) | static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CY...
  function __Pyx_RefNannyAPIStruct (line 25584) | static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modn...
  function CYTHON_INLINE (line 25601) | static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, ...
  function PyObject (line 25614) | static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
  function __Pyx_RaiseArgtupleInvalid (line 25628) | static void __Pyx_RaiseArgtupleInvalid(
  function __Pyx_RaiseDoubleKeywordsError (line 25654) | static void __Pyx_RaiseDoubleKeywordsError(
  function __Pyx_ParseOptionalKeywords (line 25668) | static int __Pyx_ParseOptionalKeywords(
  function PyObject (line 25770) | static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
  function CYTHON_INLINE (line 25777) | static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, P...
  function CYTHON_INLINE (line 25795) | static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, ...
  function CYTHON_INLINE (line 25813) | static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssi...
  function PyObject (line 25858) | static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
  function CYTHON_INLINE (line 25882) | static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *fun...
  function PyObject (line 25905) | static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObjec...
  function CYTHON_INLINE (line 26024) | static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObj...
  function CYTHON_INLINE (line 26044) | static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, ...
  function PyObject (line 26064) | static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *ar...
  function CYTHON_INLINE (line 26074) | static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func,...
  function CYTHON_INLINE (line 26092) | static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func,...
  function CYTHON_INLINE (line 26104) | static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate,...
  function CYTHON_INLINE (line 26116) | static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, P...
  function __Pyx_Raise (line 26128) | static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
  function __Pyx_Raise (line 26179) | static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, P...
  function CYTHON_INLINE (line 26286) | static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) {
  function __Pyx__PyObject_Ord (line 26317) | static long __Pyx__PyObject_Ord(PyObject* c) {
  function __Pyx_SetItemInt_Generic (line 26346) | static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *...
  function CYTHON_INLINE (line 26353) | static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i...
  function CYTHON_INLINE (line 26395) | static CYTHON_INLINE int __Pyx_IterFinish(void) {
  function CYTHON_INLINE (line 26431) | static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
  function __Pyx_PyObject_GetMethod (line 26452) | static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObj...
  function PyObject (line 26548) | static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* met...
  function CYTHON_INLINE (line 26564) | static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t inde...
  function CYTHON_INLINE (line 26571) | static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expec...
  function __Pyx_IternextUnpackEndCheck (line 26577) | static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t exp...
  function CYTHON_INLINE (line 26589) | static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
  function __Pyx_UnpackTupleError (line 26594) | static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
  function CYTHON_INLINE (line 26605) | static CYTHON_INLINE int __Pyx_unpack_tuple2_exact(
  function __Pyx_unpack_tuple2_generic (line 26629) | static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalu...
  function CYTHON_INLINE (line 26657) | static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, i...
  function CYTHON_INLINE (line 26701) | static CYTHON_INLINE int __Pyx_dict_iter_next(
  function CYTHON_UNUSED (line 26770) | static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* functi...
  function __Pyx__ArgTypeTest (line 26799) | static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const c...
  function CYTHON_INLINE (line 26820) | static CYTHON_INLINE int __Pyx_Is_Little_Endian(void)
  function __Pyx_BufFmt_Init (line 26831) | static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,
  function __Pyx_BufFmt_ParseNumber (line 26858) | static int __Pyx_BufFmt_ParseNumber(const char** ts) {
  function __Pyx_BufFmt_ExpectNumber (line 26873) | static int __Pyx_BufFmt_ExpectNumber(const char **ts) {
  function __Pyx_BufFmt_RaiseUnexpectedChar (line 26880) | static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) {
  function __Pyx_BufFmt_TypeCharToStandardSize (line 26908) | static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_comple...
  function __Pyx_BufFmt_TypeCharToNativeSize (line 26926) | static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) {
  type __Pyx_st_short (line 26945) | typedef struct { char c; short x; } __Pyx_st_short;
  type __Pyx_st_int (line 26946) | typedef struct { char c; int x; } __Pyx_st_int;
  type __Pyx_st_long (line 26947) | typedef struct { char c; long x; } __Pyx_st_long;
  type __Pyx_st_float (line 26948) | typedef struct { char c; float x; } __Pyx_st_float;
  type __Pyx_st_double (line 26949) | typedef struct { char c; double x; } __Pyx_st_double;
  type __Pyx_st_longdouble (line 26950) | typedef struct { char c; long double x; } __Pyx_st_longdouble;
  type __Pyx_st_void_p (line 26951) | typedef struct { char c; void *x; } __Pyx_st_void_p;
  type __Pyx_st_longlong (line 26953) | typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong;
  function __Pyx_BufFmt_TypeCharToAlignment (line 26955) | static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED in...
  type __Pyx_pad_short (line 26977) | typedef struct { short x; char c; } __Pyx_pad_short;
  type __Pyx_pad_int (line 26978) | typedef struct { int x; char c; } __Pyx_pad_int;
  type __Pyx_pad_long (line 26979) | typedef struct { long x; char c; } __Pyx_pad_long;
  type __Pyx_pad_float (line 26980) | typedef struct { float x; char c; } __Pyx_pad_float;
  type __Pyx_pad_double (line 26981) | typedef struct { double x; char c; } __Pyx_pad_double;
  type __Pyx_pad_longdouble (line 26982) | typedef struct { long double x; char c; } __Pyx_pad_longdouble;
  type __Pyx_pad_void_p (line 26983) | typedef struct { void *x; char c; } __Pyx_pad_void_p;
  type __Pyx_pad_longlong (line 26985) | typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong;
  function __Pyx_BufFmt_TypeCharToPadding (line 26987) | static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int ...
  function __Pyx_BufFmt_TypeCharToGroup (line 27005) | static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) {
  function __Pyx_BufFmt_RaiseExpected (line 27026) | static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) {
  function __Pyx_BufFmt_ProcessTypeChunk (line 27050) | static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) {
  function PyObject (line 27152) | static PyObject *
  function CYTHON_INLINE (line 27333) | static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {
  function __Pyx_ZeroBuffer (line 27338) | static void __Pyx_ZeroBuffer(Py_buffer* buf) {
  function __Pyx__GetBufferAndValidate (line 27345) | static int __Pyx__GetBufferAndValidate(
  function __Pyx_div_long (line 27380) | static CYTHON_INLINE long __Pyx_div_long(long a, long b) {
  function CYTHON_INLINE (line 27391) | static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name)
  function CYTHON_INLINE (line 27423) | static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *typ...
  function PyObject (line 27437) | static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) {
  function PyObject (line 27455) | static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) {
  function _PyErr_StackItem (line 27466) | static _PyErr_StackItem *
  function CYTHON_INLINE (line 27481) | static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, Py...
  function CYTHON_INLINE (line 27496) | static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, P...
  function __Pyx_PyErr_ExceptionMatchesTuple (line 27522) | static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObjec...
  function CYTHON_INLINE (line 27535) | static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadSta...
  function __Pyx_GetException (line 27549) | static int __Pyx_GetException(PyObject **type, PyObject **value, PyObjec...
  function CYTHON_INLINE (line 27620) | static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2...
  function CYTHON_INLINE (line 27667) | static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* ...
  function CYTHON_INLINE (line 27769) | static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ss...
  function CYTHON_INLINE (line 27777) | static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) {
  function CYTHON_INLINE (line 27790) | static CYTHON_INLINE PyObject* __Pyx_decode_c_string(
  function PyObject (line 27823) | static PyObject *__Pyx_GetAttr3Default(PyObject *d) {
  function CYTHON_INLINE (line 27832) | static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, ...
  function CYTHON_INLINE (line 27839) | static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, Py...
  function CYTHON_INLINE (line 27862) | static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject ...
  function PyObject (line 27873) | static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int l...
  function __Pyx_InBases (line 27939) | static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) {
  function CYTHON_INLINE (line 27947) | static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *...
  function __Pyx_inner_PyErr_GivenExceptionMatches2 (line 27963) | static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObj...
  function CYTHON_INLINE (line 27985) | static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObje...
  function __Pyx_PyErr_GivenExceptionMatchesTuple (line 27993) | static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, Py...
  function CYTHON_INLINE (line 28014) | static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err...
  function CYTHON_INLINE (line 28026) | static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *er...
  function PyObject (line 28039) | static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHO...
  function CYTHON_INLINE (line 28160) | static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varna...
  function __Pyx_WriteUnraisable (line 28165) | static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int cl...
  function PyObject (line 28207) | static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
  function CYTHON_INLINE (line 28221) | static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) {
  function PyObject (line 28240) | static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, P...
  function CYTHON_INLINE (line 28251) | static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObj...
  function PyObject (line 28280) | static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* ...
  function __Pyx_SetVtable (line 28289) | static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
  function __Pyx_setup_reduce_is_named (line 28307) | static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) {
  function __Pyx_setup_reduce (line 28323) | static int __Pyx_setup_reduce(PyObject* type_obj) {
  function PyTypeObject (line 28385) | static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *modu...
  function PyTypeObject (line 28444) | static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
  function PyObject (line 28484) | static PyObject *
  function __Pyx_CyFunction_set_doc (line 28504) | static int
  function PyObject (line 28516) | static PyObject *
  function __Pyx_CyFunction_set_name (line 28531) | static int
  function PyObject (line 28551) | static PyObject *
  function __Pyx_CyFunction_set_qualname (line 28557) | static int
  function PyObject (line 28577) | static PyObject *
  function PyObject (line 28587) | static PyObject *
  function __Pyx_CyFunction_set_dict (line 28598) | static int
  function PyObject (line 28618) | static PyObject *
  function PyObject (line 28624) | static PyObject *
  function PyObject (line 28630) | static PyObject *
  function __Pyx_CyFunction_init_defaults (line 28637) | static int
  function __Pyx_CyFunction_set_defaults (line 28659) | static int
  function PyObject (line 28675) | static PyObject *
  function __Pyx_CyFunction_set_kwdefaults (line 28689) | static int
  function PyObject (line 28705) | static PyObject *
  function __Pyx_CyFunction_set_annotations (line 28719) | static int
  function PyObject (line 28735) | static PyObject *
  function PyObject (line 28771) | static PyObject *
  function PyObject (line 28789) | static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *m...
  function __Pyx_CyFunction_clear (line 28821) | static int
  function __Pyx__CyFunction_dealloc (line 28846) | static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m)
  function __Pyx_CyFunction_dealloc (line 28853) | static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
  function __Pyx_CyFunction_traverse (line 28858) | static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitpro...
  function PyObject (line 28879) | static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *ob...
  function PyObject (line 28895) | static PyObject*
  function PyObject (line 28906) | static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *...
  function CYTHON_INLINE (line 28960) | static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyO...
  function PyObject (line 28963) | static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject ...
  function __pyx_CyFunction_init (line 29046) | static int __pyx_CyFunction_init(void) {
  function CYTHON_INLINE (line 29053) | static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func,...
  function CYTHON_INLINE (line 29062) | static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *fu...
  function CYTHON_INLINE (line 29067) | static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *f...
  function CYTHON_INLINE (line 29072) | static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *...
  function PyObject (line 29079) | static PyObject *
  function __pyx_FusedFunction_dealloc (line 29095) | static void
  function __pyx_FusedFunction_traverse (line 29104) | static int
  function __pyx_FusedFunction_clear (line 29114) | static int
  function PyObject (line 29122) | static PyObject *
  function PyObject (line 29157) | static PyObject *
  function PyObject (line 29165) | static PyObject *
  function PyObject (line 29227) | static PyObject *
  function PyObject (line 29239) | static PyObject *
  function __pyx_FusedFunction_init (line 29400) | static int __pyx_FusedFunction_init(void) {
  function __Pyx_CLineForTraceback (line 29410) | static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) {
  function __pyx_bisect_code_objects (line 29451) | static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries...
  function PyCodeObject (line 29472) | static PyCodeObject *__pyx_find_code_object(int code_line) {
  function __pyx_insert_code_object (line 29486) | static void __pyx_insert_code_object(int code_line, PyCodeObject* code_o...
  function PyCodeObject (line 29534) | static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
  function __Pyx_AddTraceback (line 29586) | static void __Pyx_AddTraceback(const char *funcname, int c_line,
  function __Pyx_GetBuffer (line 29616) | static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) {
  function __Pyx_ReleaseBuffer (line 29624) | static void __Pyx_ReleaseBuffer(Py_buffer *view) {
  function __pyx_memviewslice_is_contig (line 29640) | static int
  function __pyx_get_array_memory_extents (line 29662) | static void
  function __pyx_slices_overlap (line 29686) | static int
  function CYTHON_INLINE (line 29698) | static CYTHON_INLINE PyObject *
  function __pyx_typeinfo_cmp (line 29711) | static int
  function __pyx_check_strides (line 29752) | static int
  function __pyx_check_suboffsets (line 29805) | static int
  function __pyx_verify_contig (line 29828) | static int
  function __Pyx_ValidateAndInit_memviewslice (line 29860) | static int __Pyx_ValidateAndInit_memviewslice(
  function CYTHON_INLINE (line 29934) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 29957) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 29980) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 30003) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 30026) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 30049) | static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlic...
  function CYTHON_INLINE (line 30094) | static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
  function CYTHON_INLINE (line 30125) | static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
  function CYTHON_INLINE (line 30158) | static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_pa...
  function CYTHON_INLINE (line 30162) | static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_pa...
  function CYTHON_INLINE (line 30167) | static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_pa...
  function CYTHON_INLINE (line 30178) | static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx...
  function CYTHON_INLINE (line 30181) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_flo...
  function CYTHON_INLINE (line 30187) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_fl...
  function CYTHON_INLINE (line 30193) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_fl...
  function CYTHON_INLINE (line 30200) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_fl...
  function CYTHON_INLINE (line 30220) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_fl...
  function CYTHON_INLINE (line 30231) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_flo...
  function CYTHON_INLINE (line 30237) | static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) {
  function CYTHON_INLINE (line 30240) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_fl...
  function CYTHON_INLINE (line 30247) | static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) {
  function CYTHON_INLINE (line 30254) | static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_flo...
  function CYTHON_INLINE (line 30313) | static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_...
  function CYTHON_INLINE (line 30317) | static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_...
  function CYTHON_INLINE (line 30322) | static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_...
  function CYTHON_INLINE (line 30333) | static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __p...
  function CYTHON_INLINE (line 30336) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_d...
  function CYTHON_INLINE (line 30342) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_...
  function CYTHON_INLINE (line 30348) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_...
  function CYTHON_INLINE (line 30355) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_...
  function CYTHON_INLINE (line 30375) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_...
  function CYTHON_INLINE (line 30386) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_d...
  function CYTHON_INLINE (line 30392) | static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) {
  function CYTHON_INLINE (line 30395) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_...
  function CYTHON_INLINE (line 30402) | static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) {
  function CYTHON_INLINE (line 30409) | static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_d...
  function CYTHON_INLINE (line 30466) | static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY...
  function __Pyx_memviewslice (line 30497) | static __Pyx_memviewslice
  function __Pyx_init_memviewslice (line 30564) | static int
  function __pyx_fatalerror (line 30620) | static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN {
  function CYTHON_INLINE (line 30632) | static CYTHON_INLINE int
  function CYTHON_INLINE (line 30642) | static CYTHON_INLINE int
  function CYTHON_INLINE (line 30652) | static CYTHON_INLINE void
  function CYTHON_INLINE (line 30673) | static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *memslice,
  function CYTHON_INLINE (line 30891) | static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char chara...
  function PyObject (line 30898) | static PyObject* __Pyx__ImportNumPyArray(void) {
  function CYTHON_INLINE (line 30915) | static CYTHON_INLINE PyObject* __Pyx_ImportNumPyArrayTypeIfAvailable(voi...
  function __Pyx_check_binary_version (line 31302) | static int __Pyx_check_binary_version(void) {
  function __Pyx_InitStrings (line 31318) | static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
  function CYTHON_INLINE (line 31350) | static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_...
  function CYTHON_INLINE (line 31353) | static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) {
  function CYTHON_INLINE (line 31380) | static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObjec...
  function CYTHON_INLINE (line 31422) | static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
  function CYTHON_INLINE (line 31427) | static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) {
  function PyObject (line 31434) | static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* resul...
  function CYTHON_INLINE (line 31503) | static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
  function CYTHON_INLINE (line 31565) | static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) {
  function CYTHON_INLINE (line 31568) | static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {

FILE: assignment2/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 conv_relu_forward (line 33) | def conv_relu_forward(x, w, b, conv_param):
  function conv_relu_backward (line 51) | def conv_relu_backward(dout, cache):
  function conv_bn_relu_forward (line 61) | def conv_bn_relu_forward(x, w, b, gamma, beta, conv_param, bn_param):
  function conv_bn_relu_backward (line 69) | def conv_bn_relu_backward(dout, cache):
  function conv_relu_pool_forward (line 77) | def conv_relu_pool_forward(x, w, b, conv_param, pool_param):
  function conv_relu_pool_backward (line 97) | def conv_relu_pool_backward(dout, cache):

FILE: assignment2/cs231n/layers.py
  function affine_forward (line 5) | def affine_forward(x, w, b):
  function affine_backward (line 42) | def affine_backward(dout, cache):
  function relu_forward (line 78) | def relu_forward(x):
  function relu_backward (line 105) | def relu_backward(dout, cache):
  function batchnorm_forward (line 132) | def batchnorm_forward(x, gamma, beta, bn_param):
  function batchnorm_backward (line 241) | def batchnorm_backward(dout, cache):
  function batchnorm_backward_alt (line 288) | def batchnorm_backward_alt(dout, cache):
  function layernorm_forward (line 343) | def layernorm_forward(x, gamma, beta, ln_param):
  function layernorm_backward (line 393) | def layernorm_backward(dout, cache):
  function dropout_forward (line 439) | def dropout_forward(x, dropout_param):
  function dropout_backward (line 507) | def dropout_backward(dout, cache):
  function conv_forward_naive (line 536) | def conv_forward_naive(x, w, b, conv_param):
  function conv_backward_naive (line 596) | def conv_backward_naive(dout, cache):
  function max_pool_forward_naive (line 645) | def max_pool_forward_naive(x, pool_param):
  function max_pool_backward_naive (line 692) | def max_pool_backward_naive(dout, cache):
  function spatial_batchnorm_forward (line 735) | def spatial_batchnorm_forward(x, gamma, beta, bn_param):
  function spatial_batchnorm_backward (line 781) | def spatial_batchnorm_backward(dout, cache):
  function spatial_groupnorm_forward (line 818) | def spatial_groupnorm_forward(x, gamma, beta, G, gn_param):
  function spatial_groupnorm_backward (line 875) | def spatial_groupnorm_backward(dout, cache):
  function svm_loss (line 928) | def svm_loss(x, y):
  function softmax_loss (line 955) | def softmax_loss(x, y):

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

FILE: assignment2/cs231n/solver.py
  class Solver (line 14) | class Solver(object):
    method __init__ (line 82) | def __init__(self, model, data, **kwargs):
    method _reset (line 150) | def _reset(self):
    method _step (line 170) | def _step(self):
    method _save_checkpoint (line 194) | def _save_checkpoint(self):
    method check_accuracy (line 216) | def check_accuracy(self, X, y, num_samples=None, batch_size=100):
    method train (line 257) | def train(self):

FILE: assignment2/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: 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 119) | def _reset(self):
    method _step (line 139) | def _step(self):
    method check_accuracy (line 163) | def check_accuracy(self, X, y, num_samples=None, batch_size=100):
    method train (line 205) | def train(self):

FILE: assignment3/cs231n/classifiers/rnn.py
  class CaptioningRNN (line 9) | class CaptioningRNN(object):
    method __init__ (line 21) | def __init__(self, word_to_idx, input_dim=512, wordvec_dim=128,
    method loss (line 78) | def loss(self, features, captions):
    method sample (line 184) | def sample(self, features, max_length=30):

FILE: 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: assignment3/cs231n/coco_utils.py
  function load_coco_data (line 8) | def load_coco_data(base_dir=BASE_DIR,
  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: assignment3/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: assignment3/cs231n/fast_layers.py
  function conv_forward_im2col (line 14) | def conv_forward_im2col(x, w, b, conv_param):
  function conv_forward_strides (line 43) | def conv_forward_strides(x, w, b, conv_param):
  function conv_backward_strides (line 87) | def conv_backward_strides(dout, cache):
  function conv_backward_im2col (line 107) | def conv_backward_im2col(dout, cache):
  function max_pool_forward_fast (line 133) | def max_pool_forward_fast(x, pool_param):
  function max_pool_backward_fast (line 157) | def max_pool_backward_fast(dout, cache):
  function max_pool_forward_reshape (line 173) | def max_pool_forward_reshape(x, pool_param):
  function max_pool_backward_reshape (line 194) | def max_pool_backward_reshape(dout, cache):
  function max_pool_forward_im2col (line 225) | def max_pool_forward_im2col(x, pool_param):
  function max_pool_backward_im2col (line 252) | def max_pool_backward_im2col(dout, cache):

FILE: assignment3/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: 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 41) | def col2im_indices(cols, x_shape, field_height=3, field_width=3, padding=1,

FILE: assignment3/cs231n/image_utils.py
  function blur_image (line 15) | def blur_image(X):
  function preprocess_image (line 40) | def preprocess_image(img):
  function deprocess_image (line 48) | def deprocess_image(img, rescale=False):
  function image_from_url (line 57) | def image_from_url(url):
  function load_image (line 79) | def load_image(filename, size=None):

FILE: 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 102) | def conv_relu_forward(x, w, b, conv_param):
  function conv_relu_backward (line 120) | def conv_relu_backward(dout, cache):
  function conv_bn_relu_forward (line 130) | def conv_bn_relu_forward(x, w, b, gamma, beta, conv_param, bn_param):
  function conv_bn_relu_backward (line 138) | def conv_bn_relu_backward(dout, cache):
  function conv_relu_pool_forward (line 146) | def conv_relu_pool_forward(x, w, b, conv_param, pool_param):
  function conv_relu_pool_backward (line 166) | def conv_relu_pool_backward(dout, cache):

FILE: 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: assignment3/cs231n/optim.py
  function sgd (line 33) | def sgd(w, dw, config=None):
  function adam (line 47) | def adam(x, dx, config=None):

FILE: 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 50) | def rnn_step_backward(dnext_h, cache):
  function rnn_forward (line 89) | def rnn_forward(x, h0, Wx, Wh, b):
  function rnn_backward (line 133) | def rnn_backward(dh, cache):
  function word_embedding_forward (line 183) | def word_embedding_forward(x, W):
  function word_embedding_backward (line 219) | def word_embedding_backward(dout, cache):
  function sigmoid (line 257) | def sigmoid(x):
  function lstm_step_forward (line 271) | def lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b):
  function lstm_step_backward (line 322) | def lstm_step_backward(dnext_h, dnext_c, cache):
  function lstm_forward (line 380) | def lstm_forward(x, h0, Wx, Wh, b):
  function lstm_backward (line 428) | def lstm_backward(dh, cache):
  function temporal_affine_forward (line 476) | def temporal_affine_forward(x, w, b):
  function temporal_affine_backward (line 499) | def temporal_affine_backward(dout, cache):
  function temporal_softmax_loss (line 523) | def temporal_softmax_loss(x, y, mask, verbose=False):
Copy disabled (too large) Download .json
Condensed preview — 83 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (14,033K chars).
[
  {
    "path": "README.md",
    "chars": 91,
    "preview": "# CS231n-assignment2019\nCS231n 2019春季学期课程作业。\n课程网站:http://cs231n.stanford.edu/syllabus.html\n"
  },
  {
    "path": "assignment1/README.md",
    "chars": 130,
    "preview": "Details about this assignment can be found [on the course webpage](http://cs231n.github.io/), under Assignment #1 of Spr"
  },
  {
    "path": "assignment1/collectSubmission.sh",
    "chars": 1666,
    "preview": "#!/bin/bash\n#NOTE: DO NOT EDIT THIS FILE-- MAY RESULT IN INCOMPLETE SUBMISSIONS\n\nNOTEBOOKS=\"knn.ipynb \nsvm.ipynb \nsoftma"
  },
  {
    "path": "assignment1/cs231n/classifiers/__init__.py",
    "chars": 103,
    "preview": "from cs231n.classifiers.k_nearest_neighbor import *\nfrom cs231n.classifiers.linear_classifier import *\n"
  },
  {
    "path": "assignment1/cs231n/classifiers/k_nearest_neighbor.py",
    "chars": 9242,
    "preview": "from builtins import range\nfrom builtins import object\nimport numpy as np\nfrom past.builtins import xrange\n\n\nclass KNear"
  },
  {
    "path": "assignment1/cs231n/classifiers/linear_classifier.py",
    "chars": 6034,
    "preview": "from __future__ import print_function\n\nfrom builtins import range\nfrom builtins import object\nimport numpy as np\nfrom cs"
  },
  {
    "path": "assignment1/cs231n/classifiers/linear_svm.py",
    "chars": 4752,
    "preview": "from builtins import range\nimport numpy as np\nfrom random import shuffle\nfrom past.builtins import xrange\n\ndef svm_loss_"
  },
  {
    "path": "assignment1/cs231n/classifiers/neural_net.py",
    "chars": 11285,
    "preview": "from __future__ import print_function\n\nfrom builtins import range\nfrom builtins import object\nimport numpy as np\nimport "
  },
  {
    "path": "assignment1/cs231n/classifiers/softmax.py",
    "chars": 3621,
    "preview": "from builtins import range\nimport numpy as np\nfrom random import shuffle\nfrom past.builtins import xrange\n\ndef softmax_l"
  },
  {
    "path": "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": "assignment1/cs231n/datasets/get_datasets.sh",
    "chars": 134,
    "preview": "# Get CIFAR10\nwget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\ntar -xzvf cifar-10-python.tar.gz\nrm cifar-10-p"
  },
  {
    "path": "assignment1/cs231n/features.py",
    "chars": 5186,
    "preview": "from __future__ import print_function\nfrom builtins import zip\nfrom builtins import range\nfrom past.builtins import xran"
  },
  {
    "path": "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": "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": "assignment1/features.ipynb",
    "chars": 182867,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment1/frameworkpython",
    "chars": 487,
    "preview": "#!/bin/bash\n\n# what real Python executable to use\n#PYVER=2.7\n#PATHTOPYTHON=/usr/local/bin/\n#PYTHON=${PATHTOPYTHON}python"
  },
  {
    "path": "assignment1/knn.ipynb",
    "chars": 255521,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment1/requirements.txt",
    "chars": 1075,
    "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": "assignment1/softmax.ipynb",
    "chars": 61905,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment1/start_ipython_osx.sh",
    "chars": 113,
    "preview": "# Assume the virtualenv is called .env\n\ncp frameworkpython .env/bin\n.env/bin/frameworkpython -m IPython notebook\n"
  },
  {
    "path": "assignment1/svm.ipynb",
    "chars": 430650,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment1/two_layer_net.ipynb",
    "chars": 762314,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment2/BatchNormalization.ipynb",
    "chars": 443711,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment2/ConvolutionalNetworks.ipynb",
    "chars": 210194,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment2/Dropout.ipynb",
    "chars": 49462,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment2/FullyConnectedNets.ipynb",
    "chars": 391423,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment2/PyTorch.ipynb",
    "chars": 67647,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment2/TensorFlow.ipynb",
    "chars": 73611,
    "preview": "{\n \"nbformat_minor\": 2, \n \"nbformat\": 4, \n \"cells\": [\n  {\n   \"source\": [\n    \"# What's this TensorFlow business?\\n\", \n  "
  },
  {
    "path": "assignment2/collectSubmission.sh",
    "chars": 1416,
    "preview": "#!/bin/bash\n#NOTE: DO NOT EDIT THIS FILE-- MAY RESULT IN INCOMPLETE SUBMISSIONS\n\nNOTEBOOKS=\"FullyConnectedNets.ipynb\nBat"
  },
  {
    "path": "assignment2/cs231n/classifiers/cnn.py",
    "chars": 7832,
    "preview": "from builtins import object\nimport numpy as np\n\nfrom cs231n.layers import *\nfrom cs231n.fast_layers import *\nfrom cs231n"
  },
  {
    "path": "assignment2/cs231n/classifiers/fc_net.py",
    "chars": 18837,
    "preview": "from builtins import range\nfrom builtins import object\nimport numpy as np\n\nfrom cs231n.layers import *\nfrom cs231n.layer"
  },
  {
    "path": "assignment2/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": "assignment2/cs231n/datasets/get_datasets.sh",
    "chars": 134,
    "preview": "# Get CIFAR10\nwget http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz\ntar -xzvf cifar-10-python.tar.gz\nrm cifar-10-p"
  },
  {
    "path": "assignment2/cs231n/fast_layers.py",
    "chars": 10484,
    "preview": "from __future__ import print_function\nimport numpy as np\nimport torch\nimport torch.nn as nn\ntry:\n    from cs231n.im2col_"
  },
  {
    "path": "assignment2/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": "assignment2/cs231n/im2col.py",
    "chars": 2187,
    "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": "assignment2/cs231n/im2col_cython.c",
    "chars": 1245247,
    "preview": "/* Generated by Cython 0.29.2 */\n\n/* BEGIN: Cython Metadata\n{\n    \"distutils\": {\n        \"depends\": [\n            \"C:\\\\U"
  },
  {
    "path": "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": "assignment2/cs231n/layer_utils.py",
    "chars": 3155,
    "preview": "from cs231n.layers import *\nfrom cs231n.fast_layers import *\n\n\ndef affine_relu_forward(x, w, b):\n    \"\"\"\n    Convenience"
  },
  {
    "path": "assignment2/cs231n/layers.py",
    "chars": 41741,
    "preview": "from builtins import range\nimport numpy as np\n\n\ndef affine_forward(x, w, b):\n    \"\"\"\n    Computes the forward pass for a"
  },
  {
    "path": "assignment2/cs231n/optim.py",
    "chars": 6898,
    "preview": "import numpy as np\n\n\"\"\"\nThis file implements various first-order update rules that are commonly used\nfor training neural"
  },
  {
    "path": "assignment2/cs231n/setup.py",
    "chars": 298,
    "preview": "from distutils.core import setup\nfrom distutils.extension import Extension\nfrom Cython.Build import cythonize\nimport num"
  },
  {
    "path": "assignment2/cs231n/solver.py",
    "chars": 12148,
    "preview": "from __future__ import print_function, division\nfrom future import standard_library\nstandard_library.install_aliases()\nf"
  },
  {
    "path": "assignment2/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": "assignment2/frameworkpython",
    "chars": 487,
    "preview": "#!/bin/bash\n\n# what real Python executable to use\n#PYVER=2.7\n#PATHTOPYTHON=/usr/local/bin/\n#PYTHON=${PATHTOPYTHON}python"
  },
  {
    "path": "assignment2/requirements.txt",
    "chars": 1301,
    "preview": "absl-py==0.7.1\nastor==0.7.1\nattrs==19.1.0\nbackcall==0.1.0\nbleach==3.1.0\ncycler==0.10.0\nCython==0.29.7\ndecorator==4.4.0\nd"
  },
  {
    "path": "assignment2/start_ipython_osx.sh",
    "chars": 113,
    "preview": "# Assume the virtualenv is called .env\n\ncp frameworkpython .env/bin\n.env/bin/frameworkpython -m IPython notebook\n"
  },
  {
    "path": "assignment3/Generative_Adversarial_Networks_PyTorch.ipynb",
    "chars": 1005814,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment3/Generative_Adversarial_Networks_TF.ipynb",
    "chars": 41226,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment3/LSTM_Captioning.ipynb",
    "chars": 617345,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment3/NetworkVisualization-PyTorch.ipynb",
    "chars": 2883012,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true,\n    \"tags\": [\n     \"pdf-title\"\n   "
  },
  {
    "path": "assignment3/NetworkVisualization-TensorFlow.ipynb",
    "chars": 27829,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment3/RNN_Captioning.ipynb",
    "chars": 1261145,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment3/StyleTransfer-PyTorch.ipynb",
    "chars": 3584655,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment3/StyleTransfer-TensorFlow.ipynb",
    "chars": 28869,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": [\n     \"pdf-title\"\n    ]\n   },\n   \"source\": ["
  },
  {
    "path": "assignment3/collectSubmission_pytorch.sh",
    "chars": 1362,
    "preview": "#!/bin/bash\n#NOTE: DO NOT EDIT THIS FILE-- MAY RESULT IN INCOMPLETE SUBMISSIONS\n\nNOTEBOOKS=\"RNN_Captioning.ipynb\n    LST"
  },
  {
    "path": "assignment3/collectSubmission_tensorflow.sh",
    "chars": 1366,
    "preview": "#!/bin/bash\n#NOTE: DO NOT EDIT THIS FILE-- MAY RESULT IN INCOMPLETE SUBMISSIONS\n\nNOTEBOOKS=\"RNN_Captioning.ipynb\n    LST"
  },
  {
    "path": "assignment3/cs231n/captioning_solver.py",
    "chars": 8634,
    "preview": "from __future__ import print_function, division\nfrom builtins import range\nfrom builtins import object\nimport numpy as n"
  },
  {
    "path": "assignment3/cs231n/classifiers/rnn.py",
    "chars": 13305,
    "preview": "from builtins import range\nfrom builtins import object\nimport numpy as np\n\nfrom cs231n.layers import *\nfrom cs231n.rnn_l"
  },
  {
    "path": "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": "assignment3/cs231n/coco_utils.py",
    "chars": 2884,
    "preview": "from builtins import range\nimport os, json\nimport numpy as np\nimport h5py\n\nBASE_DIR = 'cs231n/datasets/coco_captioning'\n"
  },
  {
    "path": "assignment3/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": "assignment3/cs231n/datasets/get_assignment3_data.sh",
    "chars": 83,
    "preview": "#!/bin/bash\n./get_coco_captioning.sh\n./get_squeezenet_tf.sh\n./get_imagenet_val.sh\n\n"
  },
  {
    "path": "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": "assignment3/cs231n/datasets/get_imagenet_val.sh",
    "chars": 52,
    "preview": "wget http://cs231n.stanford.edu/imagenet_val_25.npz\n"
  },
  {
    "path": "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": "assignment3/cs231n/fast_layers.py",
    "chars": 9733,
    "preview": "from __future__ import print_function\nimport numpy as np\ntry:\n    from cs231n.im2col_cython import col2im_cython, im2col"
  },
  {
    "path": "assignment3/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": "assignment3/cs231n/im2col.py",
    "chars": 2321,
    "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": "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": "assignment3/cs231n/image_utils.py",
    "chars": 2845,
    "preview": "from __future__ import print_function\nfrom future import standard_library\nstandard_library.install_aliases()\nfrom builti"
  },
  {
    "path": "assignment3/cs231n/layer_utils.py",
    "chars": 5580,
    "preview": "from cs231n.layers import *\nfrom cs231n.fast_layers import *\n\n\ndef affine_relu_forward(x, w, b):\n    \"\"\"\n    Convenience"
  },
  {
    "path": "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": "assignment3/cs231n/optim.py",
    "chars": 2820,
    "preview": "import numpy as np\n\n\"\"\"\nThis file implements various first-order update rules that are commonly used for\ntraining neural"
  },
  {
    "path": "assignment3/cs231n/rnn_layers.py",
    "chars": 22532,
    "preview": "from __future__ import print_function, division\nfrom builtins import range\nimport numpy as np\n\n\n\"\"\"\nThis file defines la"
  },
  {
    "path": "assignment3/cs231n/setup.py",
    "chars": 298,
    "preview": "from distutils.core import setup\nfrom distutils.extension import Extension\nfrom Cython.Build import cythonize\nimport num"
  },
  {
    "path": "assignment3/frameworkpython",
    "chars": 487,
    "preview": "#!/bin/bash\n\n# what real Python executable to use\n#PYVER=2.7\n#PATHTOPYTHON=/usr/local/bin/\n#PYTHON=${PATHTOPYTHON}python"
  },
  {
    "path": "assignment3/requirements.txt",
    "chars": 1112,
    "preview": "absl-py==0.2.0\naiocoap==0.3\naiohttp==3.2.0\nappnope==0.1.0\nastor==0.6.2\nasync-timeout==3.0.0\nattrs==18.1.0\nbackports-abc="
  },
  {
    "path": "assignment3/start_ipython_osx.sh",
    "chars": 113,
    "preview": "# Assume the virtualenv is called .env\n\ncp frameworkpython .env/bin\n.env/bin/frameworkpython -m IPython notebook\n"
  }
]

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

About this extraction

This page contains the full source code of the 0809zheng/CS231n-assignment2019 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 83 files (13.3 MB), approximately 3.5M tokens, and a symbol index with 823 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!