Легко используйте модели Keras на C++
Хотели бы вы построить/обучить модель с помощью Keras/Python? Хотели бы вы выполнить прогнозирование (прямой проход) для вашей модели на C++, не связывая свое приложение с TensorFlow? Тогда экономно-глубокий вариант именно для вас.
экономно-глубокий
model.predict
) не только для последовательных моделей, но и для вычислительных графов с более сложной топологией, созданных с помощью функционального API.Add
, Concatenate
, Subtract
, Multiply
, Average
, Maximum
, Minimum
, Dot
AveragePooling1D/2D/3D
, GlobalAveragePooling1D/2D/3D
TimeDistributed
Conv1D/2D
, SeparableConv2D
, DepthwiseConv2D
Cropping1D/2D/3D
, ZeroPadding1D/2D/3D
, CenterCrop
BatchNormalization
, Dense
, Flatten
, Normalization
Dropout
, AlphaDropout
, GaussianDropout
, GaussianNoise
SpatialDropout1D
, SpatialDropout2D
, SpatialDropout3D
ActivityRegularization
, LayerNormalization
, UnitNormalization
RandomContrast
, RandomFlip
, RandomHeight
RandomRotation
, RandomTranslation
, RandomWidth
, RandomZoom
MaxPooling1D/2D/3D
, GlobalMaxPooling1D/2D/3D
ELU
, LeakyReLU
, ReLU
, SeLU
, PReLU
Sigmoid
, Softmax
, Softplus
, Tanh
Exponential
, GELU
, Softsign
, Rescaling
UpSampling1D/2D
, Resizing
Reshape
, Permute
, RepeatVector
Embedding
, CategoryEncoding
Attention
, AdditiveAttention
, MultiHeadAttention
load_model
) Conv2DTranspose
(почему), Lambda
(почему), Conv3D
, ConvLSTM1D
, ConvLSTM2D
, Discretization
, GRUCell
, Hashing
, IntegerLookup
, LocallyConnected1D
, LocallyConnected2D
, LSTMCell
, Masking
, RepeatVector
, RNN
, SimpleRNN
, SimpleRNNCell
, StackedRNNCells
, StringLookup
, TextVectorization
, Bidirectional
, GRU
, LSTM
, CuDNNGRU
, CuDNNLSTM
, ThresholdedReLU
, Upsampling3D
, temporal
модели
Используйте Keras/Python для построения ( model.compile(...)
), обучения ( model.fit(...)
) и тестирования ( model.evaluate(...)
) вашей модели как обычно. Затем сохраните его в один файл, используя model.save('....keras')
. image_data_format
в вашей модели должен быть channels_last
, который используется по умолчанию при использовании бэкэнда TensorFlow. Модели, созданные с другим image_data_format
и другими серверными модулями, не поддерживаются.
Теперь преобразуйте его в экономичный формат файла с помощью keras_export/convert_model.py
Наконец загрузите его на C++ ( fdeep::load_model(...)
) и используйте model.predict(...)
для вызова прямого прохода с вашими данными.
Следующий минимальный пример демонстрирует полный рабочий процесс:
# create_model.py
import numpy as np
from tensorflow . keras . layers import Input , Dense
from tensorflow . keras . models import Model
inputs = Input ( shape = ( 4 ,))
x = Dense ( 5 , activation = 'relu' )( inputs )
predictions = Dense ( 3 , activation = 'softmax' )( x )
model = Model ( inputs = inputs , outputs = predictions )
model . compile ( loss = 'categorical_crossentropy' , optimizer = 'nadam' )
model . fit (
np . asarray ([[ 1 , 2 , 3 , 4 ], [ 2 , 3 , 4 , 5 ]]),
np . asarray ([[ 1 , 0 , 0 ], [ 0 , 0 , 1 ]]), epochs = 10 )
model . save ( 'keras_model.keras' )
python3 keras_export/convert_model.py keras_model.keras fdeep_model.json
// main.cpp
# include < fdeep/fdeep.hpp >
int main ()
{
const auto model = fdeep::load_model ( " fdeep_model.json " );
const auto result = model. predict (
{ fdeep::tensor ( fdeep::tensor_shape ( static_cast <std:: size_t >( 4 )),
std::vector< float >{ 1 , 2 , 3 , 4 })});
std::cout << fdeep::show_tensors (result) << std::endl;
}
При использовании convert_model.py
тестовый пример (входные и соответствующие выходные значения) генерируется автоматически и сохраняется вместе с вашей моделью. fdeep::load_model
запускает этот тест, чтобы убедиться, что результаты прямого прохода в бережливой глубине такие же, как в Keras.
Дополнительные примеры интеграции можно найти в FAQ.
Руководства по различным способам экономичной и глубокой установки можно найти в INSTALL.md
.
См FAQ.md
API этой библиотеки может измениться в будущем. Если у вас есть какие-либо предложения, вы нашли ошибки или хотите дать общий отзыв/критику, я буду рад услышать ваше мнение. Конечно, вклады также очень приветствуются.
Распространяется по лицензии MIT. (См. прилагаемый файл LICENSE
или https://opensource.org/licenses/MIT)