visdom_tutorial
basic visdom function summary
์ repo์ ์๋ visdom function๋ค์ด ๊ฐ๊ฐ ์ด๋ค plot์ ๊ทธ๋ฆฌ๋์ง ์ ๋ฆฌํด๋ณด๊ณ ์ ํจ. exam.py
์์ ์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ธ ์ฃผ์ ๋ฌ๋ ค์์. (+ option๋ค์ ์ถ๊ฐ ์์ .)
Overview
Visdom์ ๋ฐ์ดํฐ์ ์๊ฐํ๋ฅผ ์ํ ๋๊ตฌ. ํด๋น ์ฝ๋๋ค์ Ubuntu 18.04
& python 3.6
ํ๊ฒฝ์์ ์คํ.
visdom setup
# install using pip
$ pip install visdom
# install using Anaconda
$ conda install -c conda-forge visdom
#conda ๊ฐ์ํ๊ฒฝ ์ฌ์ฉ์
$ conda activate "๊ฐ์ํ๊ฒฝ์ด๋ฆ"
$ pip install visdom
#or
$ conda install -c conda-forge visdom
visdom server start
$ visdom # or python -m visdom.server
# http://localhost:8097/ ๐ ๋ธ๋ผ์ฐ์ ์์ ์ด๊ธฐ
How to use visdom (Python)
- Windows
Visdom UI์๋ plot, image, text๋ฅผ ๋์ธ ์ ์์ผ๋ฉฐ, drag, drop, resize, destroy๊ฐ ๊ฐ๋ฅํ ์ฐฝ์ ๋์์ง๋ค. ์ฐฝ์ envs
์ ์์ผ๋ฉฐ, envs
์ ์ํ๋ session ์ ์ฒด์ ์ ์ฅ๋๊ณ , ์ฐฝ์ ์๋ ๊ฒ์ ๋ค์ด๋ก๋ ํ ์ ์๋ค. (ex, ๋์์ง plots์ ์ด๋ฏธ์ง๋ก ์ ์ฅ ๊ฐ๋ฅ)
The UI begins as a blank slate โ you can populate it with plots, images, and text. These appear in windows that you can drag, drop, resize, and destroy. The windows live in envs and the state of envs is stored across sessions. You can download the content of windows โ including your plots in svg.
- Environments
Environment๋ฅผ ์ด์ฉํ์ฌ ๊ณต๊ฐ(์ฐฝ)์ ๋ถ๋ฆฌํ ์ ์๋ค. (default : main) http://localhost:8097/env/main ์ด์ ๊ฐ์ ๋งํฌ๋ก ์ ์ํ๊ฑฐ๋ ํ ๊ธ๋ก ์ด๋์ด ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ์ข ๋ฅ์ data๋ฅผ ํ ์ฐฝ์ ๋์ฐ๊ณ ์ถ์ง ์์ ๋ envs๋ฅผ ๋ค๋ฅด๊ฒ ํด ์ฃผ์ด ๋์ฐ๋ฉด ๋จ.
- State
Environment ์์ ํด๋ ๋ฒํผ์ ๋๋ฅด๊ณ , save
๋ฅผ ๋๋ฅด๋ฉด ํ๊ฒฝ ์ ์ฅ์ด ๊ฐ๋ฅํ๋ค. Fork
๋ฅผ ๋๋ฅด๋ฉด ์๋ก์ด env ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
- View & Filters
๊ฐ ์ฐฝ๋ค์ ๋๋๊ทธํ์ฌ ๊ด๋ฆฌํ ์๋ ์๊ณ , view
์ ํด๋ ๋ฒํผ์ ๋๋ฌ ์ฐฝ์ ๊ด๋ฆฌํ ์๋ ์๋ค. ๋ทฐ๋ฅผ ์ ์ฅํ๋ฉด envs์์ ๋ชจ๋ ์ฐฝ์ ์์น์ ํฌ๊ธฐ๊ฐ ์ ์ง๋จ. ๋ํ filter
๋ฅผ ์ฌ์ฉํ๋ฉด envs์ ์๋ ์ฐฝ ์ค์์ ๋ณด๊ณ ์ถ์ ์ฐฝ๋ง ๋ณผ ์ ์์.
- Start
# visdom ์์ ๋ฐฉ๋ฒ
import visdom
vis = visdom.Visdom()
# ------------------------------------
# ์๋์ ๊ฐ์ด Arg Option ์ค ์๋ ์์. (์์ธํ argments ์ ๋ณด๋ https://github.com/fossasia/visdom#visdom-arguments-python-only)
# ------------------------------------
DEFAULT_PORT = 8097
DEFAULT_HOSTNAME = "http://localhost"
parser = argparse.ArgumentParser(description='Demo arguments')
parser.add_argument('-port', metavar='port', type=int, default=DEFAULT_PORT,
help='port the visdom server is running on.')
parser.add_argument('-server', metavar='server', type=str,
default=DEFAULT_HOSTNAME,
help='Server address of the target to run the demo on.')
parser.add_argument('-base_url', metavar='base_url', type=str,
default='/',
help='Base Url.')
parser.add_argument('-username', metavar='username', type=str,
default='',
help='username.')
parser.add_argument('-password', metavar='password', type=str,
default='',
help='password.')
parser.add_argument('-use_incoming_socket', metavar='use_incoming_socket', type=bool,
default=True,
help='use_incoming_socket.')
FLAGS = parser.parse_args()
vis = visdom.Visdom(port=FLAGS.port, server=FLAGS.server, base_url=FLAGS.base_url, username=FLAGS.username, password=FLAGS.password, \
use_incoming_socket=FLAGS.use_incoming_socket)
- Basics
์๋์ function๋ค์ visdom์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ์ ์ธ visualization function๋ค์ด๋ค.
vis.text
: text๋ฅผ visdom ์ฐฝ์ ๋์.
import visdom
vis = visdom.Visdom()
textwindow = vis.text('Hello World!')
vis.image
: CXHXW์ img๋ฅผ visdom ์ฐฝ์ ๋์ด๋ค. ( ์ฌ๋ฌ๊ฐ :vis.images
)
import visdom
vis = visdom.Visdom()
# 512 X 256 ์์์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ด๋ฏธ์ง Example
vis.image(np.random.rand(3, 512, 256))
# 5๊ฐ์ 512 X 256 ์์์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ด๋ฏธ์ง๋ค Example
vis.images(np.random.rand(5, 3, 512, 256))
vis.matplot
: Matplotlib plot์ visdom ์ฐฝ์ ๊ทธ๋ ค์ค๋ค.
import visdom
import matplotlib.pyplot as plt
vis = visdom.Visdom()
plt.plot([1, 23, 2, 4])
plt.ylabel('some numbers')
vis.matplot(plt)
- Plotting
visdom์ ๊ธฐ๋ณธ visualization์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ plot ์ ํ์ ์ ๊ณต. (์ด๋ฌํ visualization์ Plotly ์์ ์ ๊ณต.)
vis.scatter
: 2D๋ 3D์ scatter plot์ ๊ทธ๋ ค์ค.
import visdom
vis = visdom.Visdom()Y = np.random.rand(100)
# 2D scatter ์์
vis.scatter(
X=np.random.rand(100, 2),
Y=(Y[Y > 0] + 1.5).astype(int),
opts=dict(
legend=['Apples', 'Pears'],
xtickmin=0,
xtickmax=1,
xtickstep=0.5,
ytickmin=0,
ytickmax=1,
ytickstep=0.5,
markersymbol='cross-thin-open',
),
)
# 3D scatter ์์
vis.scatter(
X=np.random.rand(100, 3),
Y=(Y + 1.5).astype(int),
opts=dict(
legend=['Men', 'Women'],
markersize=5,
xtickmin=0,
xtickmax=2,
xlabel='Arbitrary',
xtickvals=[0, 0.75, 1.6, 2],
ytickmin=0,
ytickmax=2,
ytickstep=0.5,
ztickmin=0,
ztickmax=1,
ztickstep=0.5,
)
)
# ๐ ์ปค์คํฐ๋ง์ด์ง & text labels & legend ๋ฃ๊ธฐ ๋ฑ์ exam.py ์ฐธ๊ณ !
vis.line
: plot์ line์ ๊ทธ๋ ค์ค.
# X, Y ๊ฐ์ ๋ง๋ ์ ์ ๊ทธ๋ฆผ.
import visdom
vis = visdom.Visdom()
Y = np.linspace(-5, 5, 100)
vis.line(
Y=np.column_stack((Y * Y, np.sqrt(Y + 5))),
X=np.column_stack((Y, Y)),
opts=dict(markers=False,
showlegend=True,
),
)
# WebGL์ ์ด์ฉํ์ฌ ๋ผ์ธ ๊ทธ๋ฆฌ๊ธฐ Example
webgl_num_points = 200000
webgl_x = np.linspace(-1, 0,
webgl_y = webgl_x ** 3
vis.line(X=webgl_x, Y=webgl_
opts=dict(title='{}
win="WebGL demo")
# line update Example. WebGL ์ฐฝ์ ์
๋ฐ์ดํธํ๊ธฐ.
vis.line(
X=webgl_x + 1.,
Y=(webgl_x + 1.) ** 3,
win="WebGL demo", # -> ํด๋น ์ด๋ฆ์ ๊ฐ์ง win์ ์
๋ฐ์ดํธ.
update='append',
opts=dict(title='{} points using WebGL'.format(webgl_num_points * 2), webgl=True)
)
# ๐ ์ปค์คํฐ๋ง์ด์ง & area & legend ๋ฃ๊ธฐ ๋ฑ์ exam.py ์ฐธ๊ณ !
vis.stem
: stem plot์ ๊ทธ๋ ค์ค.
import visdom
vis = visdom.Visdom()
Y = np.linspace(0, 2 * math.pi, 70)
X = np.column_stack((np.sin(Y), np.cos(Y)))
vis.stem(
X=X,
Y=Y,
opts=dict(legend=['Sine', 'Cosine'])
)
vis.heatmap
: heatmap plot ๊ทธ๋ ค์ค.
import visdom
vis = visdom.Visdom()
vis.heatmap(
X=np.outer(np.arange(1, 6), np.arange(1, 11)),
opts=dict(
columnnames=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
rownames=['y1', 'y2', 'y3', 'y4', 'y5'],
colormap='Electric',
)
)
[vis.bar](http://vis.bar)
: bar ๋ชจ์์ plot ๊ทธ๋ ค์ค.
import visdom
vis = visdom.Visdom()
vis.bar(X=np.random.rand(20))
vis.bar(
X=np.abs(np.random.rand(5, 3)),
opts=dict(
stacked=True,
legend=['Facebook', 'Google', 'Twitter'],
rownames=['2012', '2013', '2014', '2015', '2016']
)
)
vis.bar(
X=np.random.rand(20, 3),
opts=dict(
stacked=False,
legend=['The Netherlands', 'France', 'United States']
)
)
vis.histogram
: historgram ๋ชจ์ plot ๊ทธ๋ ค์ค.
import visdom
vis=visdom.Visdom()
vis.histogram(X=np.random.rand(10000), opts=dict(numbins=50)) # numbins : bin ๊ฐฏ์ ๋ฒกํฐ.
vis.boxplot
: box ๋ชจ์์ plot ๊ทธ๋ ค์ค.
import visdom
vis = visdom.Visdom()
X = np.random.rand(100, 2)
X[:, 1] += 2
vis.boxplot(
X=X,
opts=dict(legend=['Men', 'Women'])
)
vis.surf
: surface plots ๊ทธ๋ ค์ค.
import visdom
vis = visdom.Visdom()
x = np.tile(np.arange(1, 101), (100, 1))
y = x.transpose()
X = np.exp((((x - 50) ** 2) + ((y - 50) ** 2)) / -(20.0 ** 2))
vis.surf(X=X, opts=dict(colormap='Hot'))
vis.contour
: contour plot ๊ทธ๋ ค์ค.
import visdom
vis = visdom.Visdom()
x = np.tile(np.arange(1, 101), (100, 1))
y = x.transpose()
X = np.exp((((x - 50) ** 2) + ((y - 50) ** 2)) / -(20.0 ** 2))
vis.contour(X=X, opts=dict(colormap='Viridis'))
vis.quiver
: quiver plot ๊ทธ๋ ค์ค.
import visdom
vis = visdom.Visdom()
X = np.arange(0, 2.1, .2)
Y = np.arange(0, 2.1, .2)
X = np.broadcast_to(np.expand_dims(X, axis=1), (len(X), len(X)))
Y = np.broadcast_to(np.expand_dims(Y, axis=0), (len(Y), len(Y)))
U = np.multiply(np.cos(X), Y)
V = np.multiply(np.sin(X), Y)
vis.quiver(
X=U,
Y=V,
opts=dict(normalize=0.9),
)
vis.mesh
: mesh ํํ์ surface ๊ทธ๋ ค์ค.
import visdom
vis = visdom.Visdom()
x = [0, 0, 1, 1, 0, 0, 1, 1]
y = [0, 1, 1, 0, 0, 1, 1, 0]
z = [0, 0, 0, 0, 1, 1, 1, 1]
X = np.c_[x, y, z]
i = [7, 0, 0, 0, 4, 4, 6, 6, 4, 0, 3, 2]
j = [3, 4, 1, 2, 5, 6, 5, 2, 0, 1, 6, 3]
k = [0, 7, 2, 3, 6, 7, 1, 1, 5, 5, 7, 6]
Y = np.c_[i, j, k]
vis.mesh(X=X, Y=Y, opts=dict(opacity=0.5))