echart label 不随值变化位置_炼丹神器来了! 模型结构、训练日志、特征提取都能可视化,调参不慌了!...
點擊上方“CVer”,選擇加"星標"置頂
重磅干貨,第一時間送達
開發者在煉丹的過程中會不會遇到這些問題呢?比如說深度學習模型訓練過程中盯 Log 盯得頭暈眼花?復雜模型結構全靠腦補?網絡各層效果無法評估?模型評估指標難以綜合權衡?想必各位「煉丹師」、「調參俠」都中過招吧?莫慌,飛槳給大家「送解藥」來了!
這劑解藥就是VisualDL 2.0——飛槳可視化分析工具全面改版升級,幫眾位開發者們從 「煉丹萌新」 變身「太上老君」。懷疑我們自吹自擂?那就讓我們一起看看 VisualDL 到底是啥?先上圖為證!VisualDL 2.0 是什么??看到這里,有些小伙伴可能已經大概知道 VisualDL 是什么了,不知道的同學請繼續往下看,反正花花綠綠的,至少比 log 看著養眼多了!?
具體來說,VisualDL 是飛槳團隊為廣大深度學習開發者訂制的功能完備的可視化分析工具,可以幫助深度學習開發者了解訓練過程中模型參數的變化趨勢、 網絡層對數據特征的提取情況、網絡結構應該如何調整、精度與召回是否達到了理想的平衡等,從而實現有方向性的錯誤排查,實現高效的模型調優。其實,VisualDL 1.0 早在 2017 年就推出了,隨著飛槳開源深度學習框架歷經 3 年深入產業實踐的不斷打磨,VisualDL 本次也完成了 2.0 版本的全新蛻變!相較 VisualDL 1.0,新版本的 API 設計更加簡潔易用、與框架銜接更為順暢、功能更豐富,界面設計也全面進行了升級,致力為老用戶帶來全新體驗,為新用戶帶來使用上的驚喜。VisualDL 2.0 能做什么?VisualDL 2.0 共有五大可視化功能,下面我們來逐一講解。標量(Scalar)?標量可以通過圖表的形式展示 Loss、Accuracy、Learning Rate 等參數指標在訓練過程中的變化趨勢,幫助開發者了解其是否朝著理想的方向優化,便于發現異常情況,及時排查并修復問題;另外,通過對比多組實驗的訓練參數,開發者們能深入探究參數對模型效果的影響,加速模型的調優。實現代碼如下:add_scalar(tag,?value,?step,?walltime=None)數據樣本分析(Sample)?數據樣本分析可以在多種深度學習任務中發揮重要作用。例如在計算機視覺任務中,該功能不僅可以查看每個訓練批次中的指定的樣本圖片,也可以展示圖像數據的在訓練過程中間階段的提取特征情況,便于開發者們觀察圖片數據在訓練過程中的狀態,進而深入了解訓練過程及效果。實現代碼如下:add_image(tag,?img,?step,?walltime=None)在語音識別或合成任務中,數據樣本分析功能可以幫助開發者實時獲取訓練過程中的音頻數據,評估語音識別或合成的效果,挑選最優的訓練模型。實現代碼如下:add_audio(tag,?audio_array,?step,?sample_rate)模型結構(Graph)模型結構功能支持一鍵可視化模型網絡結構。開發者們可查看模型屬性、節點信息、節點輸入輸出等,并支持節點搜索功能,協助開發者們快速分析模型結構并了解數據流向。當前支持如下兩種操作方式:模型文件拖拽上傳
在命令行加入參數 --model 并指定模型文件路徑(非文件夾路徑),運行命令后即可啟動:
from?visualdl?import?LogWriter
log_writer?=?LogWriter("./paddle_lenet_log")
#?使用標量(Scalar)記錄Loss、Accuracy參數,用于觀察其變化趨勢
writer.add_scalar(tag="train/loss",?step=step,?value=cost)
writer.add_scalar(tag="train/acc",?step=step,?value=accuracy)
#?使用數據樣本分析功能記錄每批次第一張數據,用于查看圖像數據
img?=?np.reshape(batch[0][0],?[28,?28,?1])?*?255
writer.add_image(tag="train/input",?step=step,?img=img)
#?使用直方圖功能記錄所有參數,用于查看weight、bias在訓練步數中的分布變化
for?param?in?params:
?????values?=?fluid.global_scope().find_var(param).get_tensor()
?????writer.add_histogram(tag='train/{}'.format(param),?step=step,?values=values)
#?記錄PR曲線查看不同閾值下的精度和召回率
labels?=?np.array(batch)[:,?1]
for?i?in?range(10):
label_i?=?np.array(labels?==?i,?dtype='int32')
prediction_i?=?pred[:,?i]
writer.add_pr_curve(tag='train/class_{}_pr_curve'.format(i),
????????????????????????????labels=label_i,
????????????????????????????predictions=prediction_i,
????????????????????????????step=step,
????????????????????????????num_thresholds=20)
#?使用save_inference_model保存模型結構至“./model”目錄,便于訓練后使用模型結構(Graph)功能查看模型網絡結構
fluid.io.save_inference_model(dirname='./model',?feeded_var_names=['img'],target_vars=[predictions],?executor=exe)接下來就執行下面的命令來開始奇幻的破案(調優)之旅吧!visualdl--logdir?./paddle_lenet_log?--port?8080執行命令后,即可得到這樣一個網址 http://localhost:8080/,打開瀏覽器輸入這個網址即可查看究竟發生了什么。首先來看看案發現場。。1. 點擊 「標量數據」 頁簽查看模型的 Loss 和 Accuracy 整體變化趨勢,也就是把剛才的日志信息通過圖形直觀的展示出來。這部分對應的代碼如下所示:writer.add_scalar(tag="train/loss",?step=step,?value=cost)
writer.add_scalar(tag="train/acc",?step=step,?value=accuracy)一眼望去,這哪是 Loss 和 Accuracy 的變化曲線啊,這明顯是心率不齊啊,讓人有打 120 叫救護車的沖動了!顯而易見,Accuracy 一直在 10% 左右徘徊,Loss 一直無法下降,由此我們開始逐個查看問題出在哪個環節。首先看看模型結構的實際樣子,是否是結構設計出了問題。2. 點擊 「網絡結構」 頁簽,將保存在 「./model」 目錄下的模型文件拖進頁面即可看到模型的結構。通過觀察模型結構、節點屬性、模型屬性、數據流向,咱們可以直觀的發現整體結構是符合預期的,也就是說模型網絡本身是清白的,那么是否是模型 「吃進」 的數據有問題呢??3. 點擊 「樣本數據」 查看訓練中的樣本數據。這部分對應的代碼如下所示:#?使用數據樣本分析功能記錄每批次第一張數據,用于查看圖像數據
img?=?np.reshape(batch[0][0],?[28,?28,?1])?*?255
writer.add_image(tag="train/input",?step=step,?img=img)通過查看每批次數據的第一張圖片,發現輸入數據也是沒有問題的。那么咱們再來「回放錄像」,看看每一時間步的參數變化情況吧。4. 點擊 「直方圖」 頁簽,查看訓練過程中每一時間步權重和偏差的變化情況,就如同回放整個訓練過程的監控錄像一樣,讓訓練過程中參數變化不正常的問題無所遁形!這部分對應的代碼如下所示:for?param?in?params:
?????????values?=?fluid.global_scope().find_var(param).get_tensor()
?????????writer.add_histogram(tag='train/{}'.format(param),?step=step,?
values=values)通過查看后發現,每一層的權重和偏差的變化正常。由此證明不是特定層的初始參數配置出現問題,排除了模型結構、數據樣本、每層網絡參數配置后,還剩下超參數的配置,因此決定嘗試不同的學習率(0.001,0.03,0.05,0.08,0.1),并通過 VisualDL 的多實驗對比功能,來觀察學習率對模型訓練效果的影響情況。5. 啟動多實驗對比功能非常的簡單,只需要在訓練腳本中參考如下代碼實現同一個目錄下記錄多份不同學習率的訓練日志文件,并啟動相應訓練即可。接著啟動 VisualDL,就會得到多組實驗記錄對比圖了。#創建日志文件,儲存當lr=0.001時訓練結果
log_writer?=?LogWriter("paddle_lenet_log/lr0.001")
#創建日志文件,儲存當lr=0.03時訓練結果
log_writer?=?LogWriter("paddle_lenet_log/lr0.03")
#創建日志文件,儲存當lr=0.05時訓練結果
log_writer?=?LogWriter("paddle_lenet_log/lr0.05")
#創建日志文件,儲存當lr=0.08時訓練結果
log_writer?=?LogWriter("paddle_lenet_log/lr0.08")
#創建日志文件,儲存當lr=0.1時訓練結果
log_writer?=?LogWriter("paddle_lenet_log/lr0.1")你終于發現了問題所在了,原來是學習率設置的過大了,導致 Loss 無法下降收斂,根據 「標量數據」 展示的效果,當學習率為 0.001 時(深藍色線條),Loss 呈現優美的下降趨勢且后續漸漸收斂,Accuracy 呈現逐漸上升并趨于平穩,因此你將學習率設置為 0.001,使得模型呈現最佳效果。但是你還不滿足于現狀,想要選擇一個最佳閾值,使得模型的精準度和召回率都達到最優,于是又開始使用 「PR 曲線」 功能。6. 點擊 「PR 曲線」 頁簽,權衡精確度與召回間的關系,確定最佳閾值。這部分對應的代碼如下所示:labels?=?np.array(batch)[:,?1]
for?i?in?range(10):
label_i?=?np.array(labels?==?i,?dtype='int32')
prediction_i?=?pred[:,?i]
writer.add_pr_curve(tag='train/class_{}_pr_curve'.format(i),
????????????????????????????labels=label_i,
????????????????????????????predictions=prediction_i,
????????????????????????????step=step,
????????????????????????????num_thresholds=20)以上圖為例,該圖是手寫數字識別任務中類別 7 對應的 PR 曲線,從圖中可以看出,當閾值為 0.10、0.15 或 0.20 時,準確率和召回率同時達到最高值,因此選擇上述中的任意閾值,模型都可達到最佳效果。最終,在 VisualDL 的幫助下,你確定了模型閾值為 0.15,學習率為 0.001,至此,一個效果理想的手寫數字識別模型搭建完成。如需查看完整應用案例代碼,請參考:
https://aistudio.baidu.com/aistudio/projectdetail/622772?
https://aistudio.baidu.com/aistudio/projectdetail/502834
高兼容性:全面支持飛槳、ONNX、Caffe 等市面主流模型結構可視化,廣泛支持各類用戶實現可視化分析。
生態支持全面:與飛槳的多個套件、工具組件以及 AI 學習和實訓社區 AI Studio 全面打通,為開發者們在飛槳生態系統中提供最佳使用體驗。
飛槳官網地址:https://www.paddlepaddle.org.cn
VisualDL 官網地址:https://www.paddlepaddle.org.cn/paddle/visualdl
GitHub:https://github.com/PaddlePaddle/VisualDL
Gitee: https://gitee.com/paddlepaddle/VisualDL?
GitHub: https://github.com/PaddlePaddle/Paddle?
Gitee:? https://gitee.com/paddlepaddle/Paddle?
整理不易,請給CVer點贊和在看!
總結
以上是生活随笔為你收集整理的echart label 不随值变化位置_炼丹神器来了! 模型结构、训练日志、特征提取都能可视化,调参不慌了!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实体卡片是什么意思
- 下一篇: 一个人在同一个银行可以办几张卡