輕鬆使用 C++ 中的 Keras 模型
您想使用 Keras/Python 建立/訓練模型嗎?您是否希望在 C++ 中對您的模型運行預測(前向傳遞),而不將您的應用程式與 TensorFlow 連結?那麼節儉深度正是適合您的。
節儉深
model.predict
),還支援使用函數式 API 建立的具有更複雜拓撲的計算圖。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
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)