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 }