ノート/ノート
訪問者数 415      最終更新 2017-04-28 (金) 11:16:53

Chainerでネットを可視化する(備忘のため) 2017-04-27

Chainer内に、ネットを可視化(正確には「計算を可視化」)するツールが含まれるようになった。(Chainer1.5かららしい)
Visualization of Computational Graph Chainerで始めるニューラルネットワーク

で、書き方は、

import chainer.computational_graph as c
...
g = c.build_computational_graph((loss,), remove_split=True)  # <-- パラメタの書き方がマニュアルと違うが、これでないと動かない感じ。
with open('./mysample.dot', 'w') as o:
    o.write(g.dump())

ということなので、早速やってみよう。

プログラムを実行すると、指定した名前./mysample.dotのファイルが作られる。

試してみよう

#!/usr/bin/env python
'''
Niinoh Book p45〜 4.3基本的なプログラム iris0.pyの例題
'''

import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, Variable 
from chainer import optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L

import chainer.computational_graph as cg

xp = cuda.cupy  ## added

# Set data

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data.astype(np.float32)
Y = iris.target 
N = Y.size
Y2 = np.zeros(3 * N).reshape(N,3).astype(np.float32)
for i in range(N):
    Y2[i,Y[i]] = 1.0

index = np.arange(N)
xtrain = X[index[index % 2 != 0],:]
ytrain = Y2[index[index % 2 != 0],:]
xtest = X[index[index % 2 == 0],:]
yans = Y[index[index % 2 == 0]]

xtrain = xp.array(xtrain).reshape(75,4)  ## added
ytrain = xp.array(ytrain).reshape(75,3)  ## added 
xtest = xp.array(xtest).reshape(75,4)    ## added 

# Define model
class IrisChain(Chain):
    def __init__(self):
        super(IrisChain, self).__init__(
            l1=L.Linear(4,6),
            l2=L.Linear(6,3),
        )
        
    def __call__(self,x,y):
        return F.mean_squared_error(self.fwd(x), y)

    def fwd(self,x):
         h1 = F.sigmoid(self.l1(x))
         h2 = self.l2(h1)
         return h2

# Initialize model
model = IrisChain()
cuda.get_device(0).use()       ## added 
model.to_gpu()                 ## added 
optimizer = optimizers.SGD()
optimizer.setup(model)

# Learn
for i in range(10000):
    x = Variable(xtrain)
    y = Variable(ytrain)
    model.zerograds()
    loss = model(x,y)
    loss.backward()
    optimizer.update()

# Test

xt = Variable(xtest, volatile='on')
yy = model.fwd(xt)
ans = yy.data
nrow, ncol = ans.shape
ok = 0
for i in range(nrow):
    cls = np.argmax(ans[i,:])
    print(ans[i,:], cls)
    if cls == yans[i]:
        ok += 1
        
print(ok, "/", nrow, " = ", (ok * 1.0)/nrow)

# グラフを描く

#graph = cg.build_computational_graph((model,loss), remove_split=True)
graph = cg.build_computational_graph((loss,), remove_split=True)
with open('./iris0.py.dot', 'w') as graphout:
    graphout.write(graph.dump())

dotファイルの表示

dotファイルを表示する方法は、graphvizというソフトを使う。WindowsでMicrosoft Wordで出てくるxxx.dotというファイルがあるが、これは別物なので注意。
Graphvizとdot言語でグラフを描く方法のまとめ:http://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d
chainerのネットワーク構造可視化

で、graphvizのダウンロード・インスト―ルは、大元サイト Graphviz - Graph Visualization Software(英語) から。

ファイルmysample.dotを、pngファイルとして表示したい場合は、graphvizのコマンドdotを使って

dot -Tpng mysample.dot -o mysample.png

で、出力 mysample.png ができる。
それを、Windowsにコピーするなり、Linux上の画像表示プログラム(たとえばeog)で表示するなり。

上記のchainerプログラムのグラフは下記の通りに表示された。

iris0.py.png


添付ファイル: fileiris0.py.png 46件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-04-28 (金) 11:16:53 (89d)