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
, 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
(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)