轻松使用 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 (为什么)、 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)