Utilice modelos Keras en C++ con facilidad
¿Le gustaría construir/entrenar un modelo usando Keras/Python? ¿Y le gustaría ejecutar la predicción (paso hacia adelante) en su modelo en C++ sin vincular su aplicación con TensorFlow? Entonces frugalmente profundo es exactamente para ti.
frugalmente profundo
model.predict ) no solo para modelos secuenciales sino también para gráficos computacionales con una topología más compleja, creados con la API funcional.Add , Concatenate , Subtract , Multiply , Average , Maximum , Minimum , DotAveragePooling1D/2D/3D , GlobalAveragePooling1D/2D/3DTimeDistributedConv1D/2D , SeparableConv2D , DepthwiseConv2DCropping1D/2D/3D , CenterCrop ZeroPadding1D/2D/3D , Recorte centralBatchNormalization , 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 (por qué), Lambda (por qué), 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 , modelos temporal
Utilice Keras/Python para construir ( model.compile(...) ), entrenar ( model.fit(...) ) y probar ( model.evaluate(...) ) su modelo como de costumbre. Luego guárdelo en un solo archivo usando model.save('....keras') . El image_data_format en tu modelo debe channels_last , que es el valor predeterminado cuando se usa el backend de TensorFlow. No se admiten modelos creados con un image_data_format diferente ni con otros backends.
Ahora conviértalo al formato de archivo frugalmente profundo con keras_export/convert_model.py
Finalmente cárguelo en C++ ( fdeep::load_model(...) ) y use model.predict(...) para invocar un pase directo con sus datos.
El siguiente ejemplo mínimo muestra el flujo de trabajo completo:
# 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;
} Cuando se utiliza convert_model.py se genera automáticamente un caso de prueba (valores de entrada y salida correspondientes) y se guarda junto con su modelo. fdeep::load_model ejecuta esta prueba para asegurarse de que los resultados de un pase hacia adelante en frugally-deep sean los mismos que en Keras.
Para obtener más ejemplos de integración, consulte las preguntas frecuentes.
Se pueden encontrar guías sobre diferentes formas de instalación frugalmente profunda en INSTALL.md .
Ver FAQ.md
La API de esta biblioteca aún podría cambiar en el futuro. Si tiene alguna sugerencia, encuentra errores o desea brindar comentarios o críticas generales, me encantaría saber de usted. Por supuesto, las contribuciones también son bienvenidas.
Distribuido bajo la licencia MIT. (Ver archivo adjunto LICENSE o en https://opensource.org/licenses/MIT)