Use modelos Keras em C++ com facilidade
Você gostaria de construir/treinar um modelo usando Keras/Python? E você gostaria de executar a previsão (forward pass) em seu modelo em C++ sem vincular seu aplicativo ao TensorFlow? Então frugalmente profundo é exatamente para você.
frugalmente profundo
model.predict
) não apenas para modelos sequenciais, mas também para gráficos computacionais com topologia mais complexa, criados com a API funcional.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
(por que), Lambda
(por que), 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
Use Keras/Python para construir ( model.compile(...)
), treinar ( model.fit(...)
) e testar ( model.evaluate(...)
) seu modelo como de costume. Em seguida, salve-o em um único arquivo usando model.save('....keras')
. O image_data_format
no seu modelo deve ser channels_last
, que é o padrão ao usar o back-end do TensorFlow. Modelos criados com um image_data_format
diferente e outros back-ends não são suportados.
Agora converta-o para o formato de arquivo frugalmente profundo com keras_export/convert_model.py
Por fim, carregue-o em C++ ( fdeep::load_model(...)
) e use model.predict(...)
para invocar um avanço com seus dados.
O exemplo mínimo a seguir mostra o fluxo de trabalho 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;
}
Ao usar convert_model.py
um caso de teste (valores de entrada e saída correspondentes) é gerado automaticamente e salvo junto com seu modelo. fdeep::load_model
executa este teste para garantir que os resultados de uma passagem direta em frugalmente profundo sejam os mesmos que em Keras.
Para mais exemplos de integração, dê uma olhada no FAQ.
Guias para diferentes maneiras de instalação frugalmente profunda podem ser encontrados em INSTALL.md
.
Veja FAQ.md
A API desta biblioteca ainda pode mudar no futuro. Se você tiver alguma sugestão, encontrar erros ou quiser dar comentários/críticas gerais, adoraria ouvir sua opinião. Claro, contribuições também são muito bem-vindas.
Distribuído sob a licença MIT. (Veja o arquivo LICENSE
que acompanha ou em https://opensource.org/licenses/MIT)