A numpy based CNN implementation for classifying images.
status: archived
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
- data\
- 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
- Import the activations and losses in a similar way, for example
from layers.activation import Elu, Softmax from loss.losses import CategoricalCrossEntropy
- Import the model class from utilities folder
from utilities.model import Model
- 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' )
- Set model loss
model.set_loss(CategoricalCrossEntropy)
- 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
- For prediction, use
prediction = model.predict(data)
- For calculating accuracy, the model class provides its own function
accuracy = model.evaluate(data, labels)
- To load model in a different place with the trained weights, follow till step 5 and then
Note: You will have to have similar directory structure.
model.load_weights()
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