轻松使用 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
(为什么)、 Lambda
(为什么)、 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
模型
照常使用 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)