在近期雷鋒網AI研習社的線上分享會,來自蘇寧易購搜索技術研發部的資深算法工程師萬宮璽為大家介紹了Deeplearning4框架的構成、主要功能模塊並結合實例講述具體的使用方法。
視頻回放鏈接:http://www.mooc.ai/open/course/333
萬宮璽,蘇州大學碩士,現就職於蘇寧易購搜索技術研發部,從事自然語言處理、機器視覺等領域的應用開發工作。熟悉諸如Deeplearning4j、Keras等開源深度學習框架。
以下為主要分享內容:
分享主題為:基於Java的開源深度學習框架-Deeplearning4j的介紹與實例分享。(
分享內容可概括以下四方面:
Deeplearning4j生態圈主要功能模塊的介紹
Deeplearning4j單機/并行/分佈式建模過程介紹
Deeplearning4j對遷移學習、強化學習的支持
基於Fashion Mnist數據集的圖像分類應用的開發、部署、上線實例
第一部分內容具體為DL4j的開源庫背景,目前的項目進展情況和背後的支撐團隊。
第二部分為DL4j的生態圈,主要介紹生態圈中最重要的三個模塊:DL4j本身,它所依賴的張量預算庫ND4j、DL4j當中做數據ETL的庫DataVec。
DL4j本身,它定義並且實現了比較經典的神經網絡結構,比如圖片中比較常用的卷積神經網絡。機器學習都需要依賴一個張量運算框架,對於DL4j,他依賴的是ND4j這樣一個框架,libnd4j是ND4j調用的一個庫。
Model Zoo 是官方給出的經典神經網絡結構的實現。包括AlexNet,GoogLenet ,DeepFace,YOLO等。Modle Zoo在0.9.0版本之前是作為一個獨立的工程存在的,0.9.0之後的版本作為DL4j本身的一個模塊,已經嵌入進去。
DL4j所依賴的張量運算庫ND4J,ND4j可當作JAVA 版的Numpy。
ND4j內存管理情況:
ND4j利用了堆外內存和堆上內存兩個部分的內存做相應的計算。當用ND4j去聲明一個具體的張量時候,是在堆外內存存儲張量對象,堆上內存只存儲張量對象的引用。設計的原因主要是我們所依賴張量運算庫,大部分的運算空間都是在堆外內存上,把數據放到堆外內存可提高運行效率。
需要注意的是,用ND4j做神經網絡的訓練時,堆外內存一定要調的非常大,因為大量的工作都是在堆外內存做相應的張量運算。堆外內存要遠遠大於堆上內存。
ND4j具體例子,第一個是如何去創建一個張量,並且把這個張量在底層存儲的順序打印出來。
第二個是hadmard乘積實現。用直白的話解釋就是,兩個張量相應的位置去做乘積,把這個結果形成新的向量,作為下一部分利用的結果,這個操作在包括卷積上面都是比較常用的。
數據ETL庫,稱之為DataVec, 它的主要功能就是把語音信號,圖片文件,文本文檔轉化為張量形式,做數據ETL.
總結DataVec庫的作用:它可以將非結構化數據經過處理轉化變成張量型數據,也支持結構化數據的讀取。
第三個部分怎麼建模。分三個場景,第一個是本地單機建模;第二個是有多個CPU或多個GPU卡情況下怎麼做并行建模;第三個是怎麼和Spark結合做分佈式的DL4j模型的建模。
建模的四個步驟並不是固定的,可以根據實際情況做靈活的處理。大致思路首先是生成這樣一個訓練,測試,驗證數據集。
本地單機建模,首先是加載數據(包括本地數據和測試數據),其次是配置模型結構以及超參數,並初始化模型參數。最後,訓練神經網絡模型,並利用測試數據集進行評估。
數據并行化:
并行建模如圖所示:
怎麼和Spark結合做一個分佈式的Dp4j模型的建模:
想要在Spark上面開發的同學,需要注意Spark的版本,因為DL4j支持1.5、1.6 還有2.0之後的版本。框架接近1.0版本的發佈,真正原生態支持Spark 並不多,DL4j和Spark的結合是它的一大亮點。
第四部分是強化學習模塊,稱之為RL4j ,也是生態系統當中的一個組件。
遷移學習和強化學習在DL4j的支持情況:
具體應用實例分享:
關於Deeplearning4j 的總結:
個人在做AI方面的心得體會:
機器學習是AI的主要解決方案,但不是唯一方案。
深度學習並不是萬能的,對於非結構化數據:圖像、文本、語音會有出色的效果,但傳統機器學習模型同樣很重要。
數據的質和量在實際的應用中共同決定了模型的泛化能力。
轉型AI同樣可以從Hello World 入手。
提升AI內功必須精通原理,而不僅僅跑出Demo。
不要局限於某一特定工具框架,可以取長補短。
遷移學習和強化學習可能代表AI的未來。
如果想詳細了解深度學習的應用,如何做開發,怎麼去訓練他的模型,怎麼去調優,怎麼去部署上線點擊下面的視頻可回顧本期內容。
雷鋒網AI慕課學院視頻回放鏈接:http://www.mooc.ai/open/course/333