jacobian

a basic keras-like neural network library for c++/python
Log | Files | Refs | README

pybind.cpp (4809B)


      1 #include <pybind11/pybind11.h>
      2 #include <pybind11/stl.h>
      3 #include <pybind11/functional.h>
      4 #include <pybind11/eigen.h>
      5 
      6 #include "bpnn.hpp"
      7 #include "utils.hpp"
      8 using namespace Jacobian;
      9 namespace py = pybind11;
     10 
     11 PYBIND11_MODULE(_jacobian, m)
     12 {
     13     m.doc() = "Fast machine learning in C++"; // optional module docstring
     14     py::enum_<Regularization>(m, "Regularization")
     15         .value("L1", Regularization::L1)
     16         .value("L2", Regularization::L2)
     17         .export_values();
     18     py::class_<Layer>(m, "Layer")
     19         .def(py::init<int, int>())
     20         .def_readonly("contents", &Layer::contents)
     21         .def_readonly("weights", &Layer::weights)
     22         .def_readonly("bias", &Layer::bias)
     23         .def_readonly("v", &Layer::v)
     24         .def_readonly("m", &Layer::m)
     25         .def_readonly("dZ", &Layer::dZ)
     26         .def_readonly("activation", &Layer::activation)
     27         .def_readonly("activation_deriv", &Layer::activation);
     28     py::class_<Network>(m, "Network")
     29         .def(py::init<char *, int, float, float, Regularization, float,
     30                   float, bool, float>(),
     31              py::arg("path"), py::arg("batch"), py::arg("learn_rate"),
     32              py::arg("bias_rate"), py::arg("regularization"),
     33              py::arg("lambda"), py::arg("ratio"),
     34              py::arg("early_exit") = true, py::arg("cutoff") = 0)
     35         .def("add_layer", &Network::add_layer, py::arg("nodes"),
     36              py::arg("activation"), py::arg("activation_deriv"))
     37         .def("initialize", &Network::initialize)
     38         .def("init_optimizer", &Network::init_optimizer, py::arg("optimizer"))
     39         .def("init_decay", &Network::init_decay, py::arg("decay"))
     40         .def("set_activation", &Network::set_activation,
     41              py::arg("index"), py::arg("custom"),
     42              py::arg("custom_deriv"))
     43         .def("feedforward", &Network::feedforward)
     44         .def("backpropagate", &Network::backpropagate)
     45         .def("list_net", &Network::list_net)
     46         .def("next_batch", &Network::interactive_next_batch)
     47         .def("cost", &Network::cost)
     48         .def("accuracy", &Network::accuracy)
     49         .def("train", &Network::train)
     50         .def("get_cost", &Network::get_cost)
     51         .def("get_acc", &Network::get_acc)
     52         .def("get_val_cost", &Network::get_val_cost)
     53         .def("get_val_acc", &Network::get_val_acc)
     54         .def_readonly("layers", &Network::layers);
     55     auto a = m.def_submodule("activations", "Submodule supplying built-in activation functions.");
     56     a.def("linear", &activations::linear, py::arg("x"));
     57     a.def("linear_deriv", &activations::linear_deriv, py::arg("x"));
     58     a.def("sigmoid", &activations::sigmoid, py::arg("x"));
     59     a.def("sigmoid_deriv", &activations::sigmoid_deriv, py::arg("x"));
     60     a.def("lecun_tanh", &activations::lecun_tanh, py::arg("x"));
     61     a.def("lecun_tanh_deriv", &activations::lecun_tanh_deriv, py::arg("x"));
     62     a.def("softplus", &activations::softplus, py::arg("x"));
     63     a.def("softplus_deriv", &activations::softplus_deriv, py::arg("x"));
     64     a.def("inverse_logit", &activations::inverse_logit, py::arg("x"));
     65     a.def("inverse_logit_deriv", &activations::inverse_logit_deriv, py::arg("x"));
     66     a.def("cloglog", &activations::cloglog, py::arg("x"));
     67     a.def("cloglog_deriv", &activations::cloglog_deriv, py::arg("x"));
     68     a.def("bipolar", &activations::bipolar, py::arg("x"));
     69     a.def("bipolar_deriv", &activations::bipolar_deriv, py::arg("x"));
     70     a.def("step", &activations::step, py::arg("x"));
     71     a.def("step_deriv", &activations::step_deriv, py::arg("x"));
     72     a.def("hard_tanh", &activations::hard_tanh, py::arg("x"));
     73     a.def("hard_tanh_deriv", &activations::hard_tanh_deriv, py::arg("x"));
     74     a.def("leaky_relu", &activations::leaky_relu, py::arg("x"));
     75     a.def("leaky_relu_deriv", &activations::leaky_relu_deriv, py::arg("x"));
     76     a.def("relu", (activations::rectifier(activations::linear)), py::arg("x"));
     77     a.def("relu_deriv", (activations::rectifier(activations::linear_deriv)), py::arg("x"));
     78     auto o = m.def_submodule("optimizers", "Submodule supplying built-in gradient descent optimizers.");
     79     o.def("momentum", &optimizers::momentum, py::arg("beta"));
     80     o.def("demon", &optimizers::demon, py::arg("beta"), py::arg("max_ep"));
     81     o.def("adam", &optimizers::adam, py::arg("beta1"), py::arg("beta2"), py::arg("epsilon"));
     82     o.def("adamax", &optimizers::adamax, py::arg("beta1"), py::arg("beta2"), py::arg("epsilon"));
     83     auto d = m.def_submodule("decays", "Submodule supplying built-in learning rate annealing functions.");
     84     d.def("step", &decays::step, py::arg("a_0"), py::arg("k"));
     85     d.def("exponential", &decays::exponential, py::arg("a_0"), py::arg("k"));
     86     d.def("fractional", &decays::fractional, py::arg("a_0"), py::arg("k"));
     87     d.def("linear", &decays::linear, py::arg("max_ep"));
     88 }