C++中用frugally-deep调用keras的模型并进行预测
1、背景
Python語言中的Keras庫搭建深度學習模型非常便捷,但有時需要在 C++ 中調用訓練好的模型,得到測試集的結果。比如將模型部署于FPGA,中間的一個步驟則需要用C++構建模型。但 Keras庫沒有提供 C++ API,其中一種解決方法是使用 TensorFlow 的 C++ API,但編譯過程非常繁瑣,難以成功,而另一種方法,如果不是必須要使用 GPU,frugally-deep是一個不錯的選擇。
2、介紹
frugally-deep是一個用C++實現的庫,只依賴于三個頭文件庫 FunctionalPlus、Eigen、json,它可以將 Keras 保存的 .h5 文件直接轉為 C++ 中可調用的 .json 文件,同時它也是線程安全的,可以很方便的在多 CPU 上進行前向傳播。
3、準備工作
(1)支持 C++14 的編譯器:Visual Studio 2019
(2)python版本在 3.7 或以上,TensorFlow 2.1.1(可使用pip install TensorFlow下載 )
(3)下載源碼:分別前往frugally-deep, FunctionalPlus , Eigen 和 json 點擊右側的 Code,再點擊 Download ZIP 下載這些源碼,
(4)也可以直接到該網盤連接下載:
鏈接:https://pan.baidu.com/s/1HX_tPZxmOhr2BHCwu9Mp8A
提取碼:1x7e
4、使用過程:以下過程是在以上工作準備就緒后進行
(1)在 Python 中訓練好模型后,model.save('....h5', include_optimizer=False) 保存模型,比如frugally-deep 主頁上的例子。創建create_model.py,運行 create_model.py 后,當前目錄下生成了 keras_model.h5
# create_model.pyimport numpy as npfrom tensorflow.keras.layers import Input, Densefrom tensorflow.keras.models import Modelinputs = 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.h5', include_optimizer=False)(2)解壓frugally-deep、FunctionalPlus、Eigen、json,將frugally-deep-master文件夾下的keras_export文件復制到create_model.py同一個目錄下
(3)打開cmd命令窗口(linux系統打開一個終端),使用命令“python keras_export/convert_model.py keras_model.h5 keras_model.json”將模型的.h文件轉為c++可直接調用的.json文件,執行命令后同一個目錄下出現keras_model.json文件。
? ? ? ?轉換過程中,frugally-deep 會自動對模型進行測試,驗證相同的輸入下,模型在 Python 和 C++ 中的輸出是否相同。若輸出不同會直接報錯,則不必擔心轉換出錯。
(4)用vs創建一個空共項目,在項目中創建一個main.cpp文件,在main.cpp文件所在的項目文件夾中創建一個include文件夾。
? ? ? ? 將 frugally-deep-master文件夾中的include 文件夾中的fdeep文件夾、FunctionalPlus-master文件夾中的include 文件夾中的 fplus 文件夾、將 json-develop 文件夾中的include 文件夾中的nlohmann 文件夾、eigen-master文件夾中的Eigen 文件夾復制到剛創建的include空文件夾內。
// 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)),{1, 2, 3, 4})});std::cout << fdeep::show_tensors(result) << std::endl;}(5)在VS創建的項目中,右鍵點擊“解決方案資源管理器”中的項目名稱,選擇屬性 -> 配置屬性 -> C/C++ -> 常規,在右側的附加包含目錄中填上 $(ProjectDir)include; 若使用的是 gcc 編譯器,要在編譯時加上參數 -Iinclude。
(6)運行main.cpp,輸出:
5、注意點
如果要預測多個tensor的值,可增加一個循環,如下示例,內部的兩層循環是給tensor賦值,最外層循環是控制多個tensor的預測
6、參考網址:該作者已經寫的很詳細了,學習后,結合自己的項目模型重新理解的寫了一下
在 C++ 中調用 keras | iqhy's Blog
C++中用frugally-deep讀取keras的模型并進行預測(詳細)_1037號森林里一段干木頭的博客-CSDN博客
總結
以上是生活随笔為你收集整理的C++中用frugally-deep调用keras的模型并进行预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达作业6:梯度检验
- 下一篇: 坦克大战实现