深度學習 | 後浪 Python 熱力無限,前浪 Java 仍大有可爲

專屬圖1.png

最近幾年,深度學習的爆發帶來了一個讓不少人不曾預料到的結果:Python 這個曾經小衆的語言忽然間變得煊赫一時了。不管資深開發者、計算機專業學生、編程入門新手,甚至地產大佬,都對這個語言表示出極大的熱忱。java

究其緣由,在 Python 生態中咱們能夠容易地找到各種實用資源。例如用於數據計算的 NumPy、用於數據可視化的 Matplotlib,以及 MXNet、PyTorch、TensorFlow 等一衆深度學習框架。相比之下,儘管 Java 還是最流行的語言之一,擁有爲數衆多的開發者,尤爲在企業市場擁有最普遍的應用基礎,但實際上咱們很難找到合適的,用於深度學習的 Java 工具或框架。現有爲數很少的工具仍存在諸多不足,例如易用性不高,使用的還是「低級」API,綁定於具體的深度學習框架,缺少框架無關的特性等。git

java-programmer's-ai-toolkit-deep-java-library-djl1.png
2020年2月的 TIOBE 程序語言指數(來源:https://www.tiobe.com/tiobe-i...github

java-programmer's-ai-toolkit-deep-java-library-djl2.png
2019年 StackOverflow 開發人員調查結果(來源https://insights.stackoverflo...web

那麼深度學習領域就和 Java 這個前浪完全無緣了?那也未必!編程

Deep Java Library 來了

Deep Java Library(簡稱 DJL)是一個於2019年12月初的 AWS re:Invent 大會上首次發佈的新項目。簡單來講,DJL 是一個使用 Java API 簡化模型訓練、測試、部署和使用深度學習模型進行推理的開源庫深度學習工具包,開源的許可協議是 Apache-2.0。架構

對於 Java 開發者而言,能夠在 Java 中開發及應用原生的機器學習和深度學習模型,同時簡化了深度學習開發的難度。經過 DJL 提供的直觀、高級的 API,Java 開發人員能夠訓練本身的模型,或利用數據科學家用 Python 預先訓練好的模型來進行推理。若是您剛好是對學習深度學習感興趣的 Java 開發者,那麼 DJL 無疑將是開始深度學習應用的一個最好的起點。框架

DJL 是在現有深度學習框架的基礎上使用原生 Java 概念構建的的開發庫。它爲開發者提供了深度學習的最新創新和使用前沿硬件的能力,例如GPU、MKL 等。簡單的 API 抽象並簡化了開發深度學習模型所涉及的複雜性,使得這個新的框架更易於學習和應用。有了 Model-zoo 中綁定的預訓練模型集,開發者能夠當即開始將深度學習的 SOTA 成果集成到 Java 應用當中。less

總所周知,Java 的設計思想有這樣的一句:「Write once, run anywhere」(WORE)。一樣,DJL 的設計目標也設定爲不依賴於具體的引擎和深度學習框架,能夠隨時切換框架。原則上,開發人員能夠基於 DJL 編寫能在任何引擎上運行的代碼。DJL 目前提供了 Apache MXNet 的實現,預期 TensorFlow 與 PyTorch 的支持也將在不久後發佈。從目前的實現來看,DJL 使用了 JNA(Java Native Access)來實現 Apache MXNet 操做的調用。機器學習

14.png

DJL 提供了對於基礎環境的管理。爲了保證最佳的性能,提供了基於硬件配置的自動 CPU/GPU 選擇。DJL 提供了對多 GPU 的支持,能夠自動檢測是否有可用的 GPU。若是 GPU 可用,它將默認運行在一個 GPU 上,除非程序中制定使用的 GPU 數量。分佈式

在模型的訓練期間,若是但願在多個 GPU 上進行訓練,或但願限制使用 GPU 的數量(對於較小的數據集,可能但願限制 GPU 的數量),則必須經過設置設備來配置 TrainingConfig。例如,若是有8個可用 GPU,而且但願訓練器在5個 GPU 上進行訓練,可進行以下配置:

int maxNumberOfGpus = 5;
 
TrainingConfig config = new DefaultTrainingConfig(initializer, loss)
 
.setOptimizer(optimizer)
 
.addEvaluator(accuracy)
 
.setBatchSize(batchSize)
 
// Set the devices to run on multi-GPU
 
.setDevices(Device.getDevices(numberOfGpus));

對於 Java 開發者而言,DJL 的 API 抽象了用於開發模型的經常使用函數,使得 Java 開發人員可以利用現有的知識簡化向機器學習以及深度學習的轉換。相信這一點應該是 Java 開發者最但願看到的。關於 DJL 的抽象架構咱們能夠經過下圖進行理解:

java-programmer's-ai-toolkit-deep-java-library-djl4.png
來源:https://miro.medium.com/max/3472/1*ju6OsZqhpAHTnhFHDp4DXQ.png

Deep Java Library 的使用

計算機視覺(CV)是目前深度學習發展最爲成熟的領域。其中,目標檢測是一種與計算機視覺和圖像處理相關的計算機技術,用於在數字圖像和視頻中檢測某一類語義對象(如人、建築物或汽車)的實例。目標檢測在計算機視覺的許多領域都有應用,包括圖像檢索和視頻監控。

接下來,咱們將展現一個目標檢測的例子,體驗一下 DJL 的實際表現。該模型使用來自 DJL 的 Model-zoo 的預先訓練 Single Shot Detector(SSD)模型,可幫助咱們從圖像中識別西雅圖海鷹隊(一支職業美式橄欖球球隊)的隊員。

要將DJL用於應用程序項目,可使用 IntelliJ IDEA 建立 gradle 項目,並將如下內容添加到 build.gradle 配置中。

java-programmer's-ai-toolkit-deep-java-library-djl5.png
源代碼:https://gist.github.com/vrake...

接下來咱們就用這張含橄欖球員的圖片進行處理。

15.png
來源:Offered under Apache-2.0 license on Gluon-CV

針對這張圖片使用下面的這段代碼來進行推理。這段代碼從 Model-zoo 加載一個 SSD 模型,而後從模型中建立一個預測器,並使用 predict 函數來識別圖像中的對象。而後經過一個 helper utility 函數在檢測到的對象周圍畫上框線。

java-programmer's-ai-toolkit-deep-java-library-djl7.png
源代碼:https://gist.github.com/vrakesh/0faacec9e9f8d88c4cb96c8ae812493a#file-simplessdinference-java

這段代碼標識出圖像中的三個橄欖球運動員,並將結果保存爲工做目錄下的圖片文件 ssd.png。

java-programmer's-ai-toolkit-deep-java-library-djl8.png

代碼自己並不長,理解起來也比較容易。咱們能夠很容易地進行調整,能夠測試來自 Model-zoo 的其餘模型或針對本身的須要做出改變。可是 DJL 帶來的但樂趣遠不止如此。咱們還可使用問題問答模型來訓練本身的智能化應用,或者使用圖像分類模型來識別雜貨架上的商品等等。在 DJL 的 GitHub 上有更多有意思的例子

最後,若是本文能讓你對 DJL 產生興趣,也別忘了 DJL 的三個最有趣的特性:

  • 框架無關
  • 爲 Java 開發者而準備
  • 易於開發部署

感興趣的童鞋能夠點擊這裏進一步瞭解 DJL。另外在實際體驗時須要注意:DJL 須要 JDK 8(或更高版本)。建議使用 JDK8,由於 JDK 11 +存在一些已知的問題,包括 SpotBugs 與 JDK 11 +不兼容等。若是使用 JDK 11+,SpotBugs 將沒法執行。另外還請注意,目前 DJL 尚不支持分佈式模型訓練。

底圖2.png

相關文章
相關標籤/搜索