從剛開始接觸Mxnet這個框架到如今已經大概四個月了。Mxnet最吸引個人地方就是它提供了html
不少語言的接口,其中有Scala(my favorite),這是我從Caffe轉過來的緣由之一。java
Mxnet是我第一個參與的開源項目,能夠說這四個月來我學到了不少東西。linux
本文的其中目的在於介紹一下如何用 Mxnet Scala 包來開發本身的 deep learning 的應用,有git
哪些坑須要注意的,最後就是安利一下Mxnet 這個框架了。github
而後,還有就是Mxnet Scala Package已經開始 Spark了,有興趣能夠嘗試一下。apache
這裏我是直接用ScalaIDE來開發。下面介紹如何配置開發環境,過程很簡單,就是有些小細ubuntu
節須要注意。bash
首先要作的就是要編譯出Mxnet的jar包了,環境配置具體能夠看官方網站上的流程,這裏就oracle
不重複了,https://mxnet.readthedocs.io/en/latest/how_to/build.html,在 Ubuntu的配置按照流框架
程來的話通常沒什麼問題,CentOs的話就有點麻煩,但仍是能夠的。
個人環境是 atlas + cuda 7.5 + cudnn v4 + opencv 3.0。atlas + cuda 8.0 + opencv 3.0。而後修改一下make/config.mk,make -j4 就好了,編譯完Mxnet以後就開始編譯Scala 包了。
首先要安裝 JDK8,http://tecadmin.net/install-oracle-java-8-jdk-8-ubuntu-via-ppa/ 。
而後下載maven,https://maven.apache.org/download.cgi,目前版本是 3.3.9。
下載解壓完成以後,在.bashrc文件中加入如下兩句,而後 source ~/.bashrc:
export M2_HOME=~/apache-maven-3.3.9
export PATH=$M2_HOME/bin:$PATH
假設maven目錄在home目錄下。而後只要可以找到mvn這個可執行文件就好了。
而後在 Mxnet 目錄下執行,make scalapkg便可,而後能夠泡杯茶等了,第一次編譯scala包
的話,會下載不少的jar文件,都放在 ~/.m2/repository/目錄下。以後再編譯的話就很快了。編
譯完成以後,在 scala-package/assembly 目錄下,若是你是在config.mk中設置了GPU支持的
話,那麼編譯好的jar包就在 linux-x86_64-gpu/target目錄下。
這裏咱們先新建一個Scala Project,MxnetTest 。
而後刪除Scala library,接着導入 Mxnet scala jar 包。直接 Add External JARs,
導入 assembly目錄下的
mxnet-full_2.10-linux-x86_64-gpu-0.1.2-SNAPSHOT.jar
mxnet-full_2.11-linux-x86_64-gpu-0.1.2-SNAPSHOT.jar
首先把scala-package/examples/src/main/scala/ml/dmlc/mxnet/examples/neuralstyle
下的兩個Scala文件複製到 工程src目錄下,而後稍微修改一下,把文件的第一行package
去掉。而後就是導入全部依賴包,直接暴力把 scala-package/examples/target/classes/lib
目錄下的全部Jar包導入便可。
還有把 scala-package/examples/src/main/resources/log4j.properties文件拷貝到工程
bin目錄下。
而後編譯一下應該就能夠準備運行了。若是想看看命令行怎麼運行的話能夠看看
scala-package/examples/scripts 目錄下的 run_neuralstyle.sh 腳本。
運行所需的圖片和模型能夠 example/neural-style/download.sh 這個腳原本下載。
右鍵NeuralStyle -> Run As -> Run Configurations,在Arguments 那一欄作以下設置:
而後 run 便可。跑到後面大概要佔 2G左右的顯存。若是顯存不夠的話,能夠把
--max-long-edge 這個參數設置爲小一些。
大概運行600次迭代以後就能獲得最終的結果了,和Python的例子給出的結果有點差距,效
果還能看,以前其實也是根據Python的例子改寫成 Scala版本的,當時大概用了一週時間吧,
寫好代碼以後還要調下參數等等。
用Mxnet Scala 包實現一下矩陣分解,就是推薦系統經常使用到的矩陣分解,主要是參考這位大
神的博客,http://www.jianshu.com/p/ebf7bf53ed3e,
還有http://katbailey.github.io/post/matrix-factorization-with-tensorflow/。
用到的數據集的下載地址:http://grouplens.org/datasets/movielens/100k/。
因爲目前的官方的Mxnet Scala 包尚未支持 sumAxis這個操做,由於實現這個矩陣分解的
功能須要用到這個operator,因此能夠修改本身的Mxnet Scala源碼,向Symbol.scala 中 object
Symbol 這個伴生對象加入
如下函數:
/** * Take sum of the src in the given axis * * Parameters * ---------- * data : Symbol. Input data to sum. * axis : int, default=-1, means to reduce all the dimensions. */ def sumAxis(name: String = null, attr: Map[String, String] = null): SymbolCreateNamedFunc = { createFromNamedSymbolsNoCheck("sum_axis", name, attr) }
而後從新編譯一下Scala 包便可。
下面是完整的實現代碼:
https://github.com/Ldpe2G/DeepLearning/tree/master/Mxnet-Scala/MatrixFactorization
這裏實現上和上面那篇博客有些不同的地方,最終的結果,以RMSE這個指標來衡量的話,
能夠達到 0.95x左右,比博客提到的0.8x差一點。這裏若是不想改代碼直接跑的話,能夠把下
載的ml-100k.zip這個數據集放到project目錄下的datas目錄裏解壓。
其實經過跟着實現一遍代碼,我學會了如何利用深度學習框架來作矩陣分解了,感受真的很
神奇。
最後但願這篇博客可以對想了解 Mxnet Scala Package 開發的讀者提供一些幫助。