MLask
A custom c++ deep learning library.
Explore the docs ยป
View Demo · Report Bug
Table of Contents
-
About The Project
About The Project
This is a custom c++ deep learning library. It was meant to be a challenge to understand how all the professional ML libraries work under the hood.
Features
- Fully connected layers
- Activation functions
- Backpropagation algorithm
- Export to ONNX format
(back to top)
Built With
(back to top)
Getting Started
Prerequisites
- CMake 3.28 or higher
- c++23 compatible compiler
Installation
# add these to install faster, however protobuf is pretty big, so it will take a while. Be patient.
set(protobuf_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(protobuf_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(protobuf_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set(ONNX_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(EIGEN_BUILD_TESTING OFF CACHE BOOL "" FORCE)
include(FetchContent)
FetchContent_Declare(MLask
GIT_REPOSITORY https://gitlab.com/Kamzie1/MLask.git
GIT_TAG 1.0.3
GIT_SHALLOW ON
EXCLUDE_FROM_ALL
SYSTEM)
FetchContent_MakeAvailable(MLask)
(back to top)
Usage
Defining a model
You need to create a model with in, out, parameters. Optionally you can add number of layers, and whether to draw progress bar while learning. Then you add layers.
Model model(1, 1, 1,);
model.addFullyConnectedLayer<1, 1>();
model.addActivationFunction(InternalActivationFunction::Relu);
model.addLambdaActivationFunction([](float_t x){ return 0.5*x*x; }, [](float_t x){ return x; } );
Adding your own layer
You can define and add your own layer. All you need to do is create a class that derives from abstract Layer class.
class CustomLayer : public Layer{
public:
vectorOut forward(vectorIn input) override;
vectorIn backward(vectorOut error) override;
void fit(float_t learning_rate) override {}
};
model.addLayer<CustomLayer>();
model.addLayer(std::make_unique<CustomLayer>());
Training the model
float_t learning_rate = 0.001;
for(std::size_t epochs=0; epochs < EPOCHS; epochs++){
for(int x = 0;x<=SIZE;x++){
model.backprop<DerivedStandardMean>(vectorIn{{(x-(SIZE/2.f))/(SIZE/2.f)}},
vectorOut{{Y[x]}});
}
model.fit(learning_rate);
}
Eigen::Matrix< float_t, Eigen::Dynamic, 1 > vectorOut
Definition types.hpp:17
Exporting the model
std::cout<<model.str();
model.exportToONNX("onnx_format.onnx", "One Neuron Neural Network");
For more examples, please refer to the Documentation
(back to top)
License
Distributed under the MIT. See LICENSE for more information.
(back to top)