Skip to content

Small library for running Keras models from a C++ application

License

Notifications You must be signed in to change notification settings

moof2k/kerasify

Repository files navigation

Kerasify

Kerasify is a small library for running trained Keras models from a C++ application.

Design goals:

  • Compatibility with image processing Sequential networks generated by Keras using Theano backend.
  • CPU only, no GPU
  • No external dependencies, standard library, C++11 features OK.
  • Model stored on disk in binary format that can be quickly read.
  • Model stored in memory in contiguous block for better cache performance.
  • Doesn't throw exceptions, returns only bool on error.
  • Unit testable, rigorous unit tests.

Looking for more Keras/C++ libraries? Check out https://github.com/pplonski/keras2cpp/

Example

make_model.py:

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

test_x = np.random.rand(10, 10).astype('f')
test_y = np.random.rand(10).astype('f')

model = Sequential()
model.add(Dense(1, input_dim=10))

model.compile(loss='mean_squared_error', optimizer='adamax')
model.fit(test_x, test_y, nb_epoch=1, verbose=False)

print model.predict(np.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]))

from kerasify import export_model
export_model(model, 'example.model')

test.cc:

#include "keras_model.h"

int main() {
    // Initialize model.
    KerasModel model;
    model.LoadModel("example.model");

    // Create a 1D Tensor on length 10 for input data.
    Tensor in(10);
    in.data_ = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};

    // Run prediction.
    Tensor out;
    model.Apply(&in, &out);
    out.Print();
    return 0;
}

To test:

$ python make_model.py
[[-1.85735667]]

$ g++ --std=c++11 -Wall -O3 test.cc keras_model.cc
$ ./a.out 
[ -1.857357 ]

Unit tests

To run the unit tests, generate the unit test models and then run keras_model_test:

$ python make_tests.py
...

$ make
cppcheck --error-exitcode=1 keras_model.cc
Checking keras_model.cc...
Checking keras_model.cc: DEBUG...
g++ --std=c++11 -I. -Wall -Werror -MMD -O3 -mtune=core2 -o keras_model.o -c keras_model.cc
cppcheck --error-exitcode=1 keras_model_test.cc
Checking keras_model_test.cc...
Checking keras_model_test.cc: DEBUG...
g++ --std=c++11 -I. -Wall -Werror -MMD -O3 -mtune=core2 -o keras_model_test.o -c keras_model_test.cc
g++ -o keras_model_test keras_model_test.o keras_model.o

$ ./keras_model_test
TEST dense_1x1
TEST dense_10x1
TEST dense_2x2
TEST dense_10x10
TEST dense_10x10x10
TEST conv_2x2
TEST conv_3x3
TEST conv_3x3x3
TEST elu_10
TEST benchmark
TEST benchmark
TEST benchmark
TEST benchmark
TEST benchmark
Benchmark network loads in 0.022415s
Benchmark network runs in 0.022597s

License

MIT

About

Small library for running Keras models from a C++ application

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages