DL4J實戰之六:圖形化展示訓練過程
歡迎訪問我的GitHub
這裡分類和彙總了欣宸的全部原創(含配套原始碼):http://github.com/zq2599/blog_demos
本篇概覽
- 本篇是《DL4J實戰》系列的第六篇,咱們繼續夯實基本功,這次學習的是如何更加形象完整的展示訓練過程:圖形化頁面,效果如下圖所示:
-
接下來選擇一個已有的子工程,為其增加圖形化介面的效果,我這裡選的是《DL4J實戰之三:經典卷積例項(LeNet-5)》一文中的<font color="blue">simple-convolution</font>子工程
-
總的來說本篇由以下內容構成:
- 基本的圖形化功能
- 圖形化資料的持續儲存問題
- 圖形化頁面的埠配置問題
依賴庫配置
-
首先是新增依賴庫,一共需要兩步:
-
開啟父工程<font color="blue">dlfj-tutorials</font>的pom.xml,這是管理依賴庫版本號的地方,在<font color="blue">dependencies</font>節點確保以下子節點是存在的,這裡dl4j-master.version的值是<font color="blue">1.0.0-beta7</font>:
<dependency>
<groupId>org.deeplearning4j</groupId>
<artifactId>deeplearning4j-ui</artifactId>
<version>${dl4j-master.version}</version>
</dependency>
- 開啟子工程<font color="blue">simple-convolution</font>的pom.xml,新增deeplearning4j-ui庫的依賴:
<dependency>
<groupId>org.deeplearning4j</groupId>
<artifactId>deeplearning4j-ui</artifactId>
</dependency>
- 如果您在用的是IDEA,建議執行下圖中的操作,確保配置立即生效:
增加圖形化相關程式碼
- 圖形化相關的程式碼很少,只有寥寥幾句,寫在MultiLayerNetwork例項初始化之後的位置即可,如下圖紅框所示:
- 上圖紅框中的程式碼在此,方便您使用:
// 初始化使用者介面後端
UIServer uiServer = UIServer.getInstance();
// 配置要儲存網路資訊(梯度、分數、時間等)的位置。這裡:儲存在記憶體中。
StatsStorage statsStorage = new InMemoryStatsStorage();
// 將StatsStorage例項附加到UI:這允許StatsStorage的內容視覺化
uiServer.attach(statsStorage);
//然後新增StatsListener來收集網路上的資訊
net.setListeners(new StatsListener(statsStorage));
- 最後,為了避免程序過早結束導致無法繼續檢視圖形化資訊,在main方法的末尾動一點手腳,如等待輸入或者延時,我這裡加了個延時:
Thread.sleep(Integer.MAX_VALUE);
- 至此編碼完成,執行起來,在瀏覽器輸入<font color="blue">http://localhost:9000</font>,效果如下圖:
- 還可以將頁面語言換成中文,如下圖:
- 點選下圖紅框中的選單,還可以看到神經網路每一層的詳情:
- 基本功能已經完成,接下來看看持久化問題
持久化儲存頁面展示的內容
-
前面的圖形化功能有個明顯的問題:一旦程序結束,web服務也就結束了,下次再啟動,頁面上展示的也是最新一次訓練的資料,如果想儲存頁面上展現的內容以便後面再回放,應該如何做呢?接下來一起操作,改成可以持久化儲存的
-
找到這一行程式碼:
StatsStorage statsStorage = new InMemoryStatsStorage();
- 把上面那行程式碼刪除,換成下面這行,File物件的入參是資料儲存位置,請按照您電腦的實際情況修改:
StatsStorage statsStorage = new FileStatsStorage(new File("E:\\temp\\202107\\11", "ui-stats.dl4j"));
- 把下面這行程式碼也刪除,這樣訓練完成後程序會立即結束:
Thread.sleep(Integer.MAX_VALUE);
- 現在執行程式碼執行一次訓練,完成後,在<font color="blue">E:\temp\202107\11</font>目錄發現生成了名為<font color="red">ui-stats.dl4j</font>的檔案:
- 上圖看起來已經把資料儲存硬碟,接下來試試能不能再次讀取到,在<font color="blue">simple-convolution</font>工程中新增<font color="red">Test.java</font>,程式碼如下所示,寥寥幾行,全是前面那點東西:
package com.bolingcavalry.convolution;
import org.deeplearning4j.api.storage.StatsStorage;
import org.deeplearning4j.ui.api.UIServer;
import org.deeplearning4j.ui.storage.FileStatsStorage;
import java.io.File;
public class Test {
public static void main(String[] args) throws Exception {
UIServer uiServer = UIServer.getInstance();
StatsStorage statsStorage = new FileStatsStorage(new File("E:\\temp\\202107\\11", "ui-stats.dl4j"));
// 將StatsStorage例項附加到UI:這允許StatsStorage的內容視覺化
uiServer.attach(statsStorage);
Thread.sleep(99999);
}
}
- 再次開啟瀏覽器訪問<font color="blue">http://localhost:9000</font>,曾經的資料再現:
-
聰明的您看了上面的Test.java程式碼,一定會對欣宸投來鄙視的眼光,就這水平?請容我解釋一下,這裡只是演示如何載入和展示資料,所以寫的過於簡陋,您可以將此程式碼段放在常用的web應用中,如SpringBoot,這樣就能按需要載入和查看了
-
解決了儲存問題,咱們再來看看web埠如何調整,因為埠衝突,或者一些埠管理,都有調整埠的需求,而不能固定在<font color="blue">9000</font>
關於圖細化服務的web埠
-
圖細化服務是通過瀏覽器訪問的,預設埠為9000,如果您想改變埠,例如改為9001,該如何操作呢?
-
先看官方怎麼說,如下圖紅框,地址:http://deeplearning4j.konduit.ai/tuning-and-training/visualization
- 聽官方的,配置啟動引數,操作如下圖:
- 確保下圖紅框2中的選單被選中:
- 在下圖紅框位置(VM options位置)填入官方推薦的內容,將埠指定為9001:
- 怕自己設定的引數有問題,我添加了下圖紅框中的兩行程式碼,將引數打印出來:
- 再次執行Test.java,如下圖,紅框2證明我按照官方建議輸入的引數是沒有問題的,但是紅框1顯示服務還在監聽9000埠:
-
去瀏覽器上試試,發現確實如此:9000埠服務正常,9001埠無法訪問
-
這就鬱悶了,我的操作有問題嗎?若是有問題,<font color="blue">System.getProperty("org.deeplearning4j.ui.port")</font>的輸出是<font color="red">9001</font>又怎麼解釋?
-
還是去看下原始碼吧,很容易就查到了設定埠值的程式碼,在<font color="blue">VertxUIServer</font>類中,如下圖紅框所示,真像大白了!獲取埠的程式碼是<font color="red">System.getenv</font>,這是獲取環境變數的方法,不能用前面那種方式去設定:
- 既然原始碼中是用<font color="blue">System.getenv</font>方法獲取引數的,那咱們就按照環境變數的方法來輸入吧,如下圖所示,將之前的配置刪除,再在紅框2位置輸入引數,注意引數的最前面不需要<font color="red">-D</font>:
-
改好後,再起執行Test.java,如下圖,紅框1顯示web服務監聽埠已經變成了9001,紅框2中的值為null,這也正常,因為最初的system property引數已經刪除了
-
瀏覽器訪問<font color="red">http://localhost:9001</font>試試,可以正常訪問了:
-
所以,最終通過修改環境變數,咱們成功的修改了web埠,此刻再回想一下,官方提到的system property和<font color="blue">-Dorg.deeplearning4j.ui.port=9001</font>是怎麼回事呢,事實證明這樣改是沒用的...
-
我覺得,應該是欣宸才疏學淺不瞭解真像,聰明的您如果發現了問題原因,麻煩您在文章評論者指點一二,謝謝啦。
-
至此,圖形化展示訓練過程的實戰就完成了,希望本文能給您提供一些參考,幫您順利搭建圖形化環境,以更好的觀察和調整訓練引數、優化網路
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程式設計師欣宸
微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界... http://github.com/zq2599/blog_demos
- 瀏覽器上寫程式碼,4核8G微軟伺服器免費用,Codespaces真香
- Java擴充套件Nginx之三:基礎配置項
- Java擴充套件Nginx之一:你好,nginx-clojure
- JavaCV的攝像頭實戰之十四:口罩檢測
- JavaCV人臉識別三部曲之二:訓練
- JavaCV人臉識別三部曲之一:視訊中的人臉儲存為圖片
- JavaCV的攝像頭實戰之八:人臉檢測
- 超詳細的編碼實戰,讓你的springboot應用識別圖片中的行人、汽車、狗子、喵星人(JavaCV YOLO4)
- Java應用日誌如何與Jaeger的trace關聯
- Spring Cloud Gateway實戰之五:內建filter
- Spring Cloud Gateway的斷路器(CircuitBreaker)功能
- Java版流媒體編解碼和影象處理(JavaCPP FFmpeg)
- DL4J實戰之六:圖形化展示訓練過程
- 純淨Ubuntu16安裝CUDA(9.1)和cuDNN
- disruptor筆記之六:常見場景
- Spring Cloud Gateway過濾器精確控制異常返回(分析篇)
- disruptor筆記之四:事件消費知識點小結
- disruptor筆記之二:Disruptor類分析
- disruptor筆記之一:快速入門
- Spring Native實戰(暢快體驗79毫秒啟動springboot應用)