可視化利器Visdom


可視化利器Visdom

最近在使用Pytorch煉丹,單純地看命令行輸出已經無法滿足調試的需求,嘗試了facebook開源的visdom,感覺非常優雅,支持numpy和torch

安裝

$ pip install visdom

啟動服務

默認端口為8097,可以根據需要加上-p選項修改端口

$ python -m visdom.server # 或者直接visdom命令也可以

有以下輸出代表啟動成功

Downloading scripts. It might take a while.
It's Alive!
INFO:root:Application Started
You can navigate to http://localhost:8097

本質上是一個tornado服務,通過web-socket於前端通信

有的同學可能會遇到卡死的問題,原因是下載一些js、css資源文件比較慢或者根本沒法訪問,解決方案是手動下載即可

執行的代碼在"$YOUR_PREFIX/lib/python3.6/site-packages/visdom/server.py"
# 這里需要根據自己的環境修改$YOUR_PREFIX
實際執行的部分:
def download_scripts_and_run():
    download_scripts()
    main()


if __name__ == "__main__":
    download_scripts_and_run()
只要觀察download_scripts函數,手動下載資源文件即可

使用demo

可以直接看visdom給的example,博主這里貼出自己動手嘗試的一些

# coding=utf-8
import time
from visdom import Visdom
import requests
import os
import numpy as np

viz = Visdom(server='http://127.0.0.1', port=8097)
assert viz.check_connection()

# 視頻下載可能比較慢,耐心等幾分中
video_file = "demo.ogv"
if not os.path.exists(video_file):
    video_url = 'http://media.w3.org/2010/05/sintel/trailer.ogv'
    res = requests.get(video_url)
    with open(video_file, "wb") as f:
        f.write(res.content)

viz.video(videofile=video_file)

# 圖片
# 單張圖片
viz.image(
    np.random.rand(3, 512, 256),
    opts={
        'title': 'Random',
        'showlegend': True
    }
)
# 多張圖片
viz.images(
    np.random.rand(20, 3, 64, 64),
    opts={
        'title': 'multi-images',
    }
)

# 散點圖
Y = np.random.rand(100)
Y = (Y[Y > 0] + 1.5).astype(int),  # 100個標簽1和2

old_scatter = viz.scatter(
    X=np.random.rand(100, 2) * 100,
    Y=Y,
    opts={
        'title': 'Scatter',
        'legend': ['A', 'B'],
        'xtickmin': 0,
        'xtickmax': 100,
        'xtickstep': 10,
        'ytickmin': 0,
        'ytickmax': 100,
        'ytickstep': 10,
        'markersymbol': 'cross-thin-open',
        'width': 800,
        'height': 600
    },
)
# time.sleep(5)
# 更新樣式
viz.update_window_opts(
    win=old_scatter,
    opts={
        'title': 'New Scatter',
        'legend': ['Apple', 'Banana'],
        'markersymbol': 'dot'
    }
)
# 3D散點圖
viz.scatter(
    X=np.random.rand(100, 3),
    Y=Y,
    opts={
        'title': '3D Scatter',
        'legend': ['Men', 'Women'],
        'markersize': 5
    }
)

# 柱狀圖
viz.bar(X=np.random.rand(20))
viz.bar(
    X=np.abs(np.random.rand(5, 3)),  # 5個列,每列有3部分組成
    opts={
        'stacked': True,
        'legend': ['A', 'B', 'C'],
        'rownames': ['2012', '2013', '2014', '2015', '2016']
    }
)

viz.bar(
    X=np.random.rand(20, 3),
    opts={
        'stacked': False,
        'legend': ['America', 'Britsh', 'China']
    }
)

# 熱力圖,地理圖,表面圖
viz.heatmap(
    X=np.outer(np.arange(1, 6), np.arange(1, 11)),
    opts={
        'columnnames': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
        'rownames': ['y1', 'y2', 'y3', 'y4', 'y5'],
        'colormap': 'Electric'
    }
)

# 地表圖
x = np.tile(np.arange(1, 101), (100, 1))
y = x.transpose()
X = np.exp((((x - 50) ** 2) + ((y - 50) ** 2)) / -(20.0 ** 2))
viz.contour(X=X, opts=dict(colormap='Viridis'))

# 表面圖
viz.surf(X=X, opts={'colormap': 'Hot'})

運行完上面的客戶端代碼后,就可以通過瀏覽器訪問了127.0.0.1:8097

小結

Visdom后面作圖的部分用的是plotly接口,效果還是相當驚艷的,整體是一個CS架構,可以遠程實時顯示數據,可以提高Pytorch的煉丹體驗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM