使用環境是WSL(Ubuntu 18.04),g++ 7.5.0
1、下載Mxnet源碼
git clone --recursive https://github.com/apache/incubator-mxnet mxnet
此處一定要把recursive確保把子模塊一同下載下來,解壓,如果下載速度較慢或者網絡連接不順利時,比如出現
建議使用mxnet的鏡像,網址鏈接:https://gitlab.com/jackwish/mxnet
2、添加相應的依賴庫
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install libopencv-dev libatlas-base-dev libopenblas-dev
由於用的是自己的小破電腦,所以主要編譯cpu版,如果需要GPU版本,還需安裝GPU有關的cuda、cudnn
3、編譯
這裏使用make編譯Mxnet,首先修改配置,對mxnet/make/config.mk進行修改,
USE_CPP_PACKAGE=1
再對編譯選項進行修改,對mxnet源碼下的CMakeLists.txt進行修改,將有關cuda的選項關閉(因爲編譯的cpu版本)
mxnet_option(USE_CUDA "Build with CUDA support" OFF)
mxnet_option(USE_OLDCMAKECUDA "Build with old cmake cuda" OFF)
mxnet_option(USE_NCCL "Use NVidia NCCL with CUDA" OFF)
mxnet_option(USE_OPENCV "Build with OpenCV support" ON)
mxnet_option(USE_OPENMP "Build with Openmp support" ON)
mxnet_option(USE_CUDNN "Build with cudnn support" OFF)
mxnet_option(USE_CPP_PACKAGE "Build C++ Package" ON)
之後進行編譯,
cd mxnet
cp make/config.mk .
make -j4
編譯後會在mxnet/lib文件中出現libmxnet.a和libmxnet.so
4、運行cpp-pakeage中的例子
這裏就編譯了很經典的例子:用mlp識別mnist手寫字體
4.1 下載數據
這裏下載數據有幾種辦法
第一種,運行mxnet/cpp-package/exmaple中的get_data.sh腳本,
sh get_data.sh
這裏運行時,會出現Syntax error: "(" unexpected**的錯誤,原因:兼容性問題,因爲linux將sh默認指向了dash,而不是bash,解決方法:在root下運行以下代碼,並選擇no,再次運行shell腳本
sudo dpkg-reconfigure dash
這種方法下載數據有點慢,建議直接在網站上下載,mnist的數據集挺好找的,不過注意下載mnist_train.csv,下載後並保存在data/mnist_data文件中,一定要解壓!!!不然後面運行程序會報錯,說找不到數據文件
4.2 編譯
下載數據後,在cpp-package/example中進行編譯
make all MXNET_USE_CPU=1
注意將MXNet共享庫的路徑添加到操作系統特定的環境變量中,否則會報錯: error while loading shared libraries: libmxnet.so: cannot open shared object file: No such file or directory
cd build
export LD_LIBRARY_PATH=../lib/:$LD_LIBRARY_PATH
在運行程序前,將mnist數據拷貝到build目錄下,否則會報錯: Error: File does not exist: ./data/mnist_data/train-images-idx3-ubyte,注意將data/mnist_data文件夾全部拷貝進去,再運行
./mlp_cpu
最後訓練結果如下:
以上標紅的地方几乎都是踩坑的地方,一定要注意,最好的建議看官方的手冊,介紹的很全,能遇到的問題幾乎上面都有解決方法,https://mxnet.apache.org/api/cpp/docs/tutorials/basics,可惜當初自己就是死活不看orz,所以說一定要看官方教程,它不香嗎