Skip to content

A numpy based CNN implementation for classifying images

Notifications You must be signed in to change notification settings

ElefHead/numpy-cnn

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Numpy CNN

A numpy based CNN implementation for classifying images.

status: archived

Usage

Follow the steps listed below for using this repository after cloning it.
For examples, you can look at the code in fully_connected_network.py and cnn.py.
I placed the data inside a folder called data within the project root folder (this code works by default with cifar10, for other datasets, the filereader in utilities can't be used).

After placing data, the directory structure looks as follows

  • root
    • data\
      • data_batch_1
      • data_batch_2
      • ..
    • layers\
    • loss\
    • utilities\
    • cnn.py
    • fully_connected_network.py

  1. Import the required layer classes from layers folder, for example
    from layers.fully_connected import FullyConnected
    from layers.convolution import Convolution
    from layers.flatten import Flatten
  2. Import the activations and losses in a similar way, for example
    from layers.activation import Elu, Softmax
    from loss.losses import CategoricalCrossEntropy
  3. Import the model class from utilities folder
    from utilities.model import Model
  4. Create a model using Model and layer classes
    model = Model(
        Convolution(filters=5, padding='same'),
        Elu(),
        Pooling(mode='max', kernel_shape=(2, 2), stride=2),
        Flatten(),
        FullyConnected(units=10),
        Softmax(),
        name='cnn-model'
    )
  5. Set model loss
    model.set_loss(CategoricalCrossEntropy)
  6. Train the model using
    model.train(data, labels)
    • set load_and_continue = True for loading trained weights and continue training
    • By default the model uses AdamOptimization with AMSgrad
    • It also saves the weights after each epoch to a models folder within the project
  7. For prediction, use
    prediction = model.predict(data)
  8. For calculating accuracy, the model class provides its own function
    accuracy = model.evaluate(data, labels)
  9. To load model in a different place with the trained weights, follow till step 5 and then
    model.load_weights()
    Note: You will have to have similar directory structure.

This was a fun project that started out as me trying to implement a CNN by myself for classifying cifar10 images. In process, I was able to implement a reusable (numpy based) library-ish code for creating CNNs with adam optimization.

Anyone wanting to understand how backpropagation works in CNNs is welcome to try out this code, but for all practical usage there are better frameworks with performances that this code cannot even come close to replicating.

The CNN implemented here is based on Andrej Karpathy's notes