/visdom_tutorial

basic visdom function summary

Primary LanguagePythonMIT LicenseMIT

visdom_tutorial

basic visdom function summary

๐Ÿ˜‡ Visdom ์ •๋ฆฌ Repository ๐Ÿ˜‡

์œ„ repo์— ์žˆ๋Š” visdom function๋“ค์ด ๊ฐ๊ฐ ์–ด๋–ค plot์„ ๊ทธ๋ฆฌ๋Š”์ง€ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•จ. exam.py ์—์„œ ์กฐ๊ธˆ ๋” ๊ตฌ์ฒด์ ์ธ ์ฃผ์„ ๋‹ฌ๋ ค์žˆ์Œ. (+ option๋“ค์€ ์ถ”๊ฐ€ ์˜ˆ์ •.)

๐Ÿ‘‰ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•œ visdom function๋“ค์€ ์—…๋ฐ์ดํŠธ ํ•  ์˜ˆ์ •!

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๋“ค์ด๋‹ค.

  1. vis.text : text๋ฅผ visdom ์ฐฝ์— ๋„์›€.
import visdom

vis = visdom.Visdom()
textwindow = vis.text('Hello World!')
  1. 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))
  1. 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 ์—์„œ ์ œ๊ณต.)

  1. 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 ์ฐธ๊ณ !
  1. 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 ์ฐธ๊ณ !
  1. 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'])
    )
  1. 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',
        )
    )
  1. [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']
    )
)
  1. vis.histogram : historgram ๋ชจ์–‘ plot ๊ทธ๋ ค์คŒ.
import visdom
vis=visdom.Visdom()
vis.histogram(X=np.random.rand(10000), opts=dict(numbins=50)) # numbins : bin ๊ฐฏ์ˆ˜ ๋ฒกํ„ฐ.
  1. 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'])
    )
  1. 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'))
  1. 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'))
  1. 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),
    )
  1. 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))