C++ で Keras モデルを簡単に使用する
Keras/Python を使用してモデルを構築/トレーニングしたいですか?また、アプリケーションを TensorFlow にリンクせずに、C++ でモデルの予測 (フォワード パス) を実行したいですか?そんなあなたには、「質素にディープ」がぴったりです。
倹約深い
model.predict ) もサポートします。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は、tensorFlow バックエンドを使用する場合のデフォルトであるchannels_lastである必要があります。異なる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 での結果と同じであることを確認します。
その他の統合例については、FAQ をご覧ください。
frugally-deep をインストールするさまざまな方法のガイドは、 INSTALL.mdにあります。
FAQ.md参照してください。
このライブラリの API は将来的に変更される可能性があります。ご提案がある場合、間違いを見つけた場合、または一般的なフィードバック/批判をお寄せになりたい場合は、ぜひご連絡ください。もちろん、投稿も大歓迎です。
MIT ライセンスに基づいて配布されます。 (添付ファイルLICENSEまたは https://opensource.org/licenses/MIT を参照してください)