diff --git a/README.md b/README.md index 5d2e3a4..abc7c56 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Convolutional Neural Network inference library running on CUDA. - [x] Sigmoid activation - [x] ReLU activation - [x] Softmax activation -- [ ] Load weights from file +- [x] Load weights from file ## Usage @@ -38,4 +38,71 @@ make ```sh make test_main ./test/test_main -``` \ No newline at end of file +``` + +### Create Layers and Model + +```cpp +CUDANet::Model *model = + new CUDANet::Model(inputSize, inputChannels, outputSize); + +// Conv2d +CUDANet::Layers::Conv2d *conv2d = new CUDANet::Layers::Conv2d( + inputSize, inputChannels, kernelSize, stride, numFilters, + CUDANet::Layers::Padding::VALID, + CUDANet::Layers::ActivationType::NONE +); + +if (setWeights) { + conv2d->setWeights(getConv1Weights().data()); +} +model->addLayer("conv1", conv2d); +``` + +### Sequential and Functional API + +Run prediction by passing the input through the layers in the order they have been added. + +```cpp +std::vector input = {...}; +model->predict(input.data()); +``` + +If you want to use more complex forward pass, using `Concat` or `Add` layers, you can subclass the model class and override the default `predict` function + +```cpp +class MyModel : public CUDANet::Model { + ... +} + +... + +float* MyModel::predict(const float* input) { + float* d_input = inputLayer->forward(input); + + d_conv1 = getLayer("conv1")->forward(d_input); + d_conv2 = getLayer("conv2")->forward(d_input); + + d_output = concatLayer->forward(d_conv1, d_conv2); + + return outputLayer->forward(d_input); +} +``` + +### Load Pre-trained Weights + +CUDANet uses format similar to safetensors to load weights and biases. + +``` +[int64 header size, header, tensor values] +``` + +where `header` is a csv format + +``` +,, +``` + +To load weights call `load_weights` function on Model object. + +To export weights from pytorch you can use `tools/export_model_weights.py` script \ No newline at end of file