Utilisez facilement les modèles Keras en C++
Souhaitez-vous créer/entraîner un modèle à l’aide de Keras/Python ? Et souhaitez-vous exécuter la prédiction (forward pass) sur votre modèle en C++ sans lier votre application à TensorFlow ? Alors frugaly-deep est exactement pour vous.
frugalement-profond
model.predict ) non seulement pour les modèles séquentiels mais également pour les graphiques informatiques avec une topologie plus complexe, créés avec l'API fonctionnelle.Add , Concatenate , Subtract , Multiply , Average , Maximum , Minimum , DotAveragePooling1D/2D/3D , GlobalAveragePooling1D/2D/3DTimeDistributedConv1D/2D , SeparableConv2D , DepthwiseConv2DCropping1D/2D/3D , ZeroPadding1D/2D/3D , CenterCropBatchNormalization , Dense , Flatten , NormalizationDropout , AlphaDropout , GaussianDropout , GaussianNoiseSpatialDropout1D , SpatialDropout2D , SpatialDropout3DActivityRegularization , LayerNormalization , UnitNormalizationRandomContrast , RandomFlip , RandomHeightRandomRotation , RandomTranslation , RandomWidth , RandomZoomMaxPooling1D/2D/3D , GlobalMaxPooling1D/2D/3DELU , LeakyReLU , ReLU , SeLU , PReLUSigmoid , Softmax , Softplus , TanhExponential , GELU , Softsign , RescalingUpSampling1D/2D , ResizingReshape , Permute , RepeatVectorEmbedding , CategoryEncodingAttention , AdditiveAttention , MultiHeadAttentionload_model ) Conv2DTranspose (pourquoi), Lambda (pourquoi), 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 , modèles temporal
Utilisez Keras/Python pour construire ( model.compile(...) ), entraîner ( model.fit(...) ) et tester ( model.evaluate(...) ) votre modèle comme d'habitude. Enregistrez-le ensuite dans un seul fichier en utilisant model.save('....keras') . Le image_data_format dans votre modèle doit channels_last , qui est la valeur par défaut lors de l'utilisation du backend TensorFlow. Les modèles créés avec un autre image_data_format et d'autres backends ne sont pas pris en charge.
Maintenant, convertissez-le au format de fichier économe avec keras_export/convert_model.py
Enfin, chargez-le en C++ ( fdeep::load_model(...) ) et utilisez model.predict(...) pour invoquer une passe avant avec vos données.
L'exemple minimal suivant montre le flux de travail complet :
# 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;
} Lorsque vous utilisez convert_model.py un scénario de test (valeurs d'entrée et de sortie correspondantes) est généré automatiquement et enregistré avec votre modèle. fdeep::load_model exécute ce test pour s'assurer que les résultats d'une passe avant dans frugally-deep sont les mêmes que dans Keras.
Pour plus d’exemples d’intégration, veuillez consulter la FAQ.
Des guides sur les différentes manières d’installer de manière économe et approfondie peuvent être trouvés dans INSTALL.md .
Voir FAQ.md
L'API de cette bibliothèque pourrait encore changer dans le futur. Si vous avez des suggestions, trouvez des erreurs ou souhaitez formuler des commentaires/critiques d'ordre général, j'aimerais avoir de vos nouvelles. Bien entendu, les contributions sont également les bienvenues.
Distribué sous licence MIT. (Voir le fichier d'accompagnement LICENSE ou sur https://opensource.org/licenses/MIT)