輕鬆使用 C++ 中的 Keras 模型
您想使用 Keras/Python 建立/訓練模型嗎?您是否希望在 C++ 中對您的模型運行預測(前向傳遞),而不將您的應用程式與 TensorFlow 連結?那麼節儉深度正是適合您的。
節儉深
model.predict ),還支援使用函數式 API 建立的具有更複雜拓撲的計算圖。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 StackedRNNCells為什麼)、 Lambda (為什麼)、 Conv3D 、 ConvLSTM1D 、 ConvLSTM2D 、 Discretization RNN GRUCell SimpleRNN Hashing SimpleRNNCell IntegerLookup 、 LocallyConnected1D 、 LocallyConnected2D 、 LSTMCell 、 RepeatVector Masking 、 StringLookup 、 TextVectorization , Bidirectional , GRU , LSTM 、 CuDNNGRU 、 CuDNNLSTM 、 ThresholdedReLU 、 Upsampling3D 、 temporal模型
照常使用 Keras/Python 建構( model.compile(...) )、訓練( model.fit(...) )和測試( model.evaluate(...) )模型。然後使用model.save('....keras')將其儲存到單一檔案。模型中的image_data_format必須是channels_last ,這是使用 TensorFlow 後端時的預設值。不支援使用不同image_data_format和其他後端建立的模型。
現在使用keras_export/convert_model.py將其轉換為節儉深度檔案格式
最後用 C++ ( fdeep::load_model(...) ) 載入它並使用model.predict(...)呼叫資料的前向傳遞。
以下最小範例顯示了完整的工作流程:
# 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;
}使用convert_model.py時,會自動產生測試案例(輸入和對應的輸出值)並與模型一起儲存。 fdeep::load_model執行此測試以確保 frugally-deep 中的前向傳遞結果與 Keras 中的結果相同。
有關更多整合範例,請查看常見問題。
可以在INSTALL.md中找到有關深度節儉安裝的不同方法的指南。
請參閱FAQ.md
該庫的 API 將來仍然可能會發生變化。如果您有任何建議、發現錯誤或想要提供一般回饋/批評,我很樂意聽取您的意見。當然,也非常歡迎貢獻。
根據 MIT 許可證分發。 (請參閱隨附文件LICENSE或造訪 https://opensource.org/licenses/MIT)