Mxnet Scala Package 學習筆記 一

前言

    從剛開始接觸Mxnet這個框架到如今已經大概四個月了。Mxnet最吸引個人地方就是它提供了html

不少語言的接口,其中有Scala(my favorite),這是我從Caffe轉過來的緣由之一。java

Mxnet是我第一個參與的開源項目,能夠說這四個月來我學到了不少東西。linux

    本文的其中目的在於介紹一下如何用 Mxnet Scala 包來開發本身的 deep learning 的應用,有git

哪些坑須要注意的,最後就是安利一下Mxnet 這個框架了。github

    而後,還有就是Mxnet Scala Package已經開始 Spark了,有興趣能夠嘗試一下。apache

 

正文

Eclipse配置Mxnet scala的開發環境

    這裏我是直接用ScalaIDE來開發。下面介紹如何配置開發環境,過程很簡單,就是有些小細ubuntu

節須要注意。bash

 

編譯Mxnet Scala 包

    首先要作的就是要編譯出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目錄下。

    

配置ScalaIDE

    這裏咱們先新建一個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的例子 --- NeuralStyle

    首先把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實現矩陣分解(Matrix Factorization With Mxnet)

    用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 開發的讀者提供一些幫助。

相關文章
相關標籤/搜索