Verwenden Sie Keras-Modelle problemlos in C++
Möchten Sie ein Modell mit Keras/Python erstellen/trainieren? Und möchten Sie die Vorhersage (Vorwärtsdurchlauf) für Ihr Modell in C++ ausführen, ohne Ihre Anwendung mit TensorFlow zu verknüpfen? Dann ist frugally-deep genau das Richtige für Sie.
sparsam-tief
model.predict ) nicht nur für sequentielle Modelle, sondern auch für Rechendiagramme mit einer komplexeren Topologie, die mit der funktionalen API erstellt wurden.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 (warum), Lambda (warum), 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 Modelle
Verwenden Sie Keras/Python, um Ihr Modell wie gewohnt zu erstellen ( model.compile(...) ), zu trainieren ( model.fit(...) ) und zu testen ( model.evaluate(...) ). Speichern Sie es dann mit model.save('....keras') in einer einzelnen Datei. Das image_data_format in Ihrem Modell muss channels_last sein. Dies ist die Standardeinstellung bei Verwendung des TensorFlow-Backends. Modelle, die mit einem anderen image_data_format und anderen Backends erstellt wurden, werden nicht unterstützt.
Konvertieren Sie es nun mit keras_export/convert_model.py in das sparsam tiefe Dateiformat
Laden Sie es schließlich in C++ ( fdeep::load_model(...) ) und verwenden Sie model.predict(...) um einen Vorwärtsdurchlauf mit Ihren Daten aufzurufen.
Das folgende Minimalbeispiel zeigt den vollständigen Workflow:
# 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;
} Bei Verwendung convert_model.py wird automatisch ein Testfall (Eingabe- und entsprechende Ausgabewerte) generiert und zusammen mit Ihrem Modell gespeichert. fdeep::load_model führt diesen Test aus, um sicherzustellen, dass die Ergebnisse eines Vorwärtsdurchlaufs in frugally-deep die gleichen sind wie in Keras.
Weitere Integrationsbeispiele finden Sie in den FAQ.
Anleitungen für verschiedene Möglichkeiten der sparsamen Tiefeninstallation finden Sie in INSTALL.md .
Siehe FAQ.md
Die API dieser Bibliothek könnte sich in Zukunft noch ändern. Wenn Sie Anregungen haben, Fehler finden oder allgemeines Feedback/Kritik abgeben möchten, freue ich mich über Ihre Nachricht. Natürlich sind auch Beiträge herzlich willkommen.
Verteilt unter der MIT-Lizenz. (Siehe Begleitdatei LICENSE oder unter https://opensource.org/licenses/MIT)