PyTorch : Visdom
作成 : (株)クラスキャット セールスインフォメーション
日時 : 07/18/2017
* 本ページは、github 上の facebookresearch/visdom の README を動作確認・翻訳した上で
適宜、補足説明したものです:
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです
Visdom は Facebook Research が開発した、リモートデータを Web ブラウザ上でリアルタイムに可視化するツールで、(Py)Torch をサポートしています。TensorFlow の TensorBoard のような使い方が可能ですので、トレーニングの進捗をリアルタイムでモニタリングしたり予想画像の確認ができます。
例として次の画像はトレーニング中の損失の推移をエポック毎にグラフ表示したものです :
以下、翻訳文になります。
Visdom
ライブなリッチデータの可視化を作成し、体系化し、そして共有するための柔軟なツールです。Torch と Numpy をサポートします。
概要
Visdom は科学的な実験をサポートすることに重点をおき (リモート) データの可視化を容易にすることを目指しています。
あなた自身そして協力者のためのプロット、画像、そしてテキストの可視化のブロードキャスト。
可視化スペースをプログラム的に体系化し UI を通してライブデータのためのダッシュボードを作成し、
実験結果を検査したり、あるいは実験コードをデバッグします。
概念
Visdom は様々なユースケースのために構成可能な単純な特徴のセットを持ちます。
ペイン
UI は白紙の石版 (slate) として開始されます – プロット、画像、そしてテキストを住まわせることができます。これらはドラッグ、ドロップ、リサイズ、そして破壊可能なペイン内に現れます。ペインは envs の中に生存し envs のステートはセッションを通じてストアされます。ペインのコンテンツをダウンロードできます — svg のプロットを含みます。
Tip: UI のスケールを調整するためにブラウザのズームが使用できます。
環境
可視化スペースを envs で分割できます。デフォルトでは、すべてのユーザは main と呼ばれる env を持ちます。新しい env は UI またはプログラムで作成されます。env のステートは慢性的に (chronically) 保存されます。
url: http://localhost.com:8097/env/main 経由で特定の env にアクセス可能です。サーバがホストされているならば、他の人が貴方の可視化を見れるようにこの URL を共有できます。
Envs を管理する : 貴方の envs はデフォルトでは $HOME/.visdom/ からサーバの初期化時にロードされます。カスタム・パスは cmd-line 引数として渡されます。Envs は相当する .json ファイルを env dir から削除することで取り除かれます。
ステート
ひとたび2, 3の可視化を作成すればステートが維持されます。サーバは貴方の可視化を自動的にキャッシュします — ページをリロードすれば、可視化は再出現します。
- Save: それを save ボタンで手動で行なうこともできます。これは window ポジションも含む、env のステートを (disk に JSON で) シリアライズします、env をプログラムで save することもできます。
これは構成が意味を持つ、より洗練された可視化のために有用です、e.g. データリッチなデモ、モデル訓練ダッシュボード、あるいはシステマティックな実験。これはまた共有して再利用することをそれらに容易にもします。 - Fork: 新しい env 名を入力すると、saving は新しい env を作成します — 前の env を効率的に fork します。
セットアップ
Python 2.7/3 (そしてオプションで Torch7) が必要です。
# Install Python server and client pip install visdom # Install Torch client luarocks install visdom
Launch
サーバを開始します (多分スクリーンか tmux (訳注: 端末マルチプレクサ) 内で) :
python -m visdom.server
Visdom はこの時点でブラウザ内で http://localhost:8097、あるいは指定されるなら貴方の所有するホストのアドレスに行くことでアクセスされます。
Python 例
import visdom import numpy as np vis = visdom.Visdom() vis.text('Hello, world!') vis.image(np.ones((3, 10, 10)))
API
visdom の能力への迅速な紹介のためには、example ディレクトリを見るか、下の詳細を読んでください。
基本
Visdom は次の基本的な可視化機能を提供します :
- vis.image : 画像
- vis.text : 任意の HTML
- vis.video : ビデオ
- vis.svg : SVG オブジェクト
- vis.save : ステートをサーバ・サイドでシリアライズ
プロッティング
基本的な可視化を作成することを簡単にするために幾つかの一般的なプロット型をラップしています。これらの可視化は Plotly で動いています。
次の API が現在サポートされています :
- vis.scatter : 2D or 3D スキャター・プロット
- vis.line : ライン・プロット
- vis.updateTrace : 既存のライン/スキャター・プロットを更新する
- vis.stem : ステム・プロット
- vis.heatmap : ヒートマップ・プロット
- vis.bar : バー・グラフ
- vis.histogram: ヒストグラム
- vis.boxplot : ボックス・プロット
- vis.surf : サーフェイス・プロット
- vis.contour : 等高線 (contour)・プロット
- vis.quiver : 矢印 (quiver)・プロット
- vis.mesh : メッシュ・プロット
一般的なプロット
サーバ API はデータとレイアウト・オブジェクトの Plotly 慣習に固執していることに注意してください、その結果貴方自身の任意の Plotly 可視化を生成できます :
import visdom vis = visdom.Visdom() trace = dict(x=[1,2,3], y=[4,5,6], marker={'color': 'red', 'symbol': 104, 'size': "10"}, mode="markers+lines", text=["one","two","three"], name='1st Trace') layout=dict(title="First Plot", xaxis={'title':'x1'}, yaxis={'title':'x2'}) vis._send({'data': [trace], 'layout': layout, 'win': 'mywin'})
詳細
vis.image
この関数は img を描画します。それは入力として画像を含む CxHxW テンソル img を取ります。
次の options がサポートされます :
- options.jpgquality: JPG 品質 (number 0-100; default = 100)
(訳注: opts={‘jpgquality’:value} or opts=dict(jpgquality=value)) - options.caption: 画像のキャプション
vis.text
この関数はボックスにテキストを表示します。任意の HTML に埋め込むためにこれを使用できます。入力としてテキスト文字列を取ります。特別なオプションは現在サポートされていません。
vis.video
この関数は動画は再生します。それは入力として動画 videofile のファイル名またはビデオのフレームすべてを含む LxCxHxW-sized テンソル (in Lua) または LxHxWxC-sized テンソル (in Python) を取ります。この関数は plot-固有のオプションはサポートしません。
次のオプションがサポートされます :
- options.fps: 動画のための FPS (integer > 0; default = 25)
Note: テンソル入力の使用は ffmpeg がインストールされて動作していることが必要です。動画を再生するための能力は使用しているブラウザに依存します : ブラウザは OGG コンテナで Theano (訳注: 原文まま。Theora の間違い?) コーデックをサポートしていなければなりません。(Chrome はこれをサポートしています。)
vis.svg
この関数は SVG オブジェクトを描画します。入力として SVG 文字列 svgstr または SVG ファイル svgfile の名前を取ります。この関数は特定のオプションはサポートしません。
単純なプロット
ラップされたプロッティング関数の更なる詳細は以下で与えられます。
プロッティング関数への正確な入力は様々ですが、それらの多くは入力としてデータを含むテンソル X と (ラベルやタイムスタンプのような) オプションのデータ変数を含む (オプションの) テンソル Y を取ります。 プロッティング関数は入力としてオプションの win を取ります、これは特定の window にプロットするために使用できます ; 各プロッティング関数はまたそれがプロットした window の win を返します。可視化が追加されるべき env を指定することもできます。
vis.scatter
この関数は 2D または 3D スキャター・プロットを描画します。それは入力として Nx2 または Nx3 テンソル X を取ります、それはスキャター・プロットの N ポイントの位置を指定します。1 と K の間の範囲の離散ラベルを含む、オプションの N テンソル Y もまた指定可能です — ラベルはマーカーのカラーで反映されます。
次のオプションがサポートされます :
- options.colormap : カラーマップ (string; default = ‘Viridis’)
- options.markersymbol: マーカー・シンボル (string; default = ‘dot’)
- options.markersize : マーカー・サイズ (number; default = ’10’)
- options.markercolor : カラー per マーカー. (torch.*Tensor; default = nil)
- options.legend : 判例名を含むテーブル
options.markercolor は整数値を持つテンソルです。テンソルはサイズ N または N x 3 または K または K x 3 になります。
- サイズ N のテンソル : データポイントあたりの単一の彩度値。0 = 黒、255 = 赤
- サイズ N x 3 のテンソル: データポイントあたりの赤、緑と青の彩度。0,0,0 = 黒、255,255,255 = 白。
- サイズ K と K x 3 のテンソル: データポイントあたりに一意の色を持つ代わりに、特定のラベルのすべてのポイントに対して同じ色が共有されます。
vis.line
この関数はライン・プロットを描画します。
それは入力として、プロットするための (N 点に接続する) M 行の値を指定する N または NxM テンソル Y を取ります。それはまた相当する x-軸値を指定するオプションの X テンソルも取ることができます ; X は N テンソル (その場合すべての行は同じ x-軸値を共有します) または Y と同じサイズを持ちます。
次のオプションがサポートされます :
- options.fillarea : ラインの下の領域を塗りつぶす (= fill) (boolean)
- options.colormap : カラーマップ (string; default = ‘Viridis’)
- options.markers : マーカー表示 (boolean; default = false)
- ptions.markersymbol: マーカー・シンボル (string; default = ‘dot’)
- options.markersize : マーカー・サイズ (number; default = ’10’)
- options.legend : 判例名を含むテーブル
(訳注: 以下は訳者作成のサンプル)
# sin/cos curve vis = visdom.Visdom() x = np.linspace(-math.pi*2, math.pi*2, 100) vis.line(X=x, Y=np.column_stack([np.sin(x), np.cos(x)]), opts={'fillarea':True})

vis.updateTrace
この関数は現存のラインかスキャター・プロットのデータの更新を可能にします。
既存の trace の名前を(それに追加したい場合に)指定するか、プロットに trace を追加したい場合に新しい名前を指定するかはユーザ次第です。デフォルトでは legend (判例) が最初の作成時に指定されていないのであれば、名前は legend におけるラインのインデックスです。
名前が指定されていないのであれば、すべての trace が更新されます。すべて NaN である trace 更新データは無視されます ; これは更新をマスクするために使用できます。
append パラメータは更新データが追加されるか既存のデータを置き換えるかを決定します。
オプションはありません、何故ならばそれらは特定のプロットから継承されることを仮定しているからです。
vis.stem
この関数はステム・プロットを描画します。それは入力として、M 時系列の N ポイントの値を指定する N または NxM テンソル X を取ります。タイムスタンプを含む、オプションの N または NxM テンソル Y もまた指定できます ; Y が N テンソルであればすべての M 時系列は同じタイムスタンプを持つものと仮定されます。
次のオプションがサポートされます :
- options.colormap: カラーマップ (string; default = ‘Viridis’)
- options.legend : 判例名を含むテーブル
vis.heatmap
この関数はヒートマップを描画します。それは入力としてヒートマップの各位置の値を指定する NxM テンソル X を取ります。
次のオプションがサポートされます :
- options.colormap : カラーマップ (string; default = ‘Viridis’)
- options.xmin : 最小値を切ります (number; default = X:min())
- options.xmax : 最大値を切ります (number; default = X:max())
- options.columnnames: x-軸ラベルを含むテーブル
- options.rownames : y-軸ラベルを含むテーブル
vis.bar
この関数は標準的な、スタックされた、またはグループ分けされたバー・プロットを描画します。それは入力として各バーの高さを指定する N または NxM テンソル X を取ります。X が M カラムを含むのであれば、各行に相当する値はスタックされるかグループ分けされます (options.stacked がどのようにセットされるかに依存します)。X に加えて、相当する x-軸値を含む (オプションの) N テンソル Y も指定できます。
次のプロット特有のオプションが現在サポートされています :
- options.columnnames: x-軸ラベルを含むテーブル
- options.stacked : X の複数のカラムをスタックする
- options.legend : 判例ラベルを含むテーブル
vis.histogram
この関数は特定のデータのヒストグラムを描画します。それは入力としてそのデータのヒストグラムを構築するためのデータを指定する N テンソル X を取ります。
次のプロット特有のオプションが現在サポートされています :
- options.numbins: ビンの数 (number; default = 30)
vis.boxplot
この関数は特定のデータのボックスプロットを描画します。それは入力としてそのデータの M ボックスプロットを構築するための N データ値を指定する N または NxM テンソル X を取ります。
次のプロット特有のオプションが現在サポートされています :
- options.legend: X の各カラムのためのラベル
vis.surf
この関数はサーフェイス・プロットを描画します。それは入力としてサーフェイス・プロットの各位置の値を指定する NxM テンソル X を取ります。
次のオプションがサポートされます :
- options.colormap: カラーマップ (string; default = ‘Viridis’)
- options.xmin : 最小値を切る (number; default = X:min())
- options.xmax : 最大値を切る (number; default = X:max())
(訳注: 以下はデモの surf plot 例です)

vis.contour
この関数は等高線 (contour) プロットを描画します。それは入力として等高線プロットの各位置の値を指定する NxM テンソル X を取ります。
次のオプションがサポートされます :
- options.colormap: カラーマップ (string; default = ‘Viridis’)
- options.xmin : 最小値を切る (number; default = X:min())
- options.xmax : 最大値を切る (number; default = X:max())
vis.quiver
(訳注: 0.1.4 では動作確認できませんでしたので翻訳はスキップします。)
This function draws a quiver plot in which the direction and length of the arrows is determined by the NxM tensors X and Y. Two optional NxM tensors gridX and gridY can be provided that specify the offsets of the arrows; by default, the arrows will be done on a regular grid.
The following options are supported:
- options.normalize: length of longest arrows (number)
- options.arrowheads: show arrow heads (boolean; default = true)
vis.mesh
この関数は Nx2 または Nx3 行列 X で定義される頂点、そしてオプションの Mx2 または Mx3 行列 Y で定義される多角形のセットからメッシュ・プロットを描画します。
次のオプションがサポートされます :
- options.color: カラー (string)
- options.opacity: 多角形の不透明度 (opacity) (number between 0 and 1)
プロットをカスタマイズする
プロッティング関数はオプションで options テーブルを入力として取り、これはプロットの (一般的なまたはプロット固有の) 属性を変更するために使用できます。すべての入力引数は単一のテーブルで指定されます ; 入力引数は入力テーブルのキーに基づいてマッチされます。
次のオプションは (plot.image と plot.text を除く) すべての可視化について同じであるという意味で一般的です :
- options.title : figure title
- options.width : figure width
- options.height : figure height
- options.showlegend : show legend (true or false)
- options.xtype : type of x-axis (‘linear’ or ‘log’)
- options.xlabel : label of x-axis
- options.xtick : show ticks on x-axis (boolean)
- options.xtickmin : first tick on x-axis (number)
- options.xtickmax : last tick on x-axis (number)
- options.xtickvals : locations of ticks on x-axis (table of numbers)
- options.xticklabels : ticks labels on x-axis (table of strings)
- options.xtickstep : distances between ticks on x-axis (number)
- options.ytype : type of y-axis (‘linear’ or ‘log’)
- options.ylabel : label of y-axis
- options.ytick : show ticks on y-axis (boolean)
- options.ytickmin : first tick on y-axis (number)
- options.ytickmax : last tick on y-axis (number)
- options.ytickvals : locations of ticks on y-axis (table of numbers)
- options.yticklabels : ticks labels on y-axis (table of strings)
- options.ytickstep : distances between ticks on y-axis (number)
- options.marginleft : left margin (in pixels)
- options.marginright : right margin (in pixels)
- options.margintop : top margin (in pixels)
- options.marginbottom: bottom margin (in pixels)
他のオプションは可視化固有で、関数のドキュメンテーションで記述されます。
以上