[[ノート/ノート]]~
訪問者数 &counter();      最終更新 &lastmod();

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

Chainer内に、ネットを可視化(正確には「計算を可視化」)するツールが含まれるようになった。(Chainer1.5かららしい)~
[[Visualization of Computational Graph:http://docs.chainer.org/en/stable/reference/graph.html]]
[[Chainerで始めるニューラルネットワーク:http://qiita.com/icoxfog417/items/96ecaff323434c8d677b]]

で、書き方は、

 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のファイルが作られる。

**試してみよう [#u0050aa6]
 #!/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ファイルの表示 [#e15456a6]
dotファイルを表示する方法は、graphvizというソフトを使う。WindowsでMicrosoft Wordで出てくるxxx.dotというファイルがあるが、これは別物なので注意。~
[[Graphvizとdot言語でグラフを描く方法のまとめ:http://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d]]~
[[chainerのネットワーク構造可視化:http://yasuke.hatenablog.com/entry/2016/01/30/125557]]

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

ファイルmysample.dotを、pngファイルとして表示したい場合は、graphvizのコマンドdotを使って
 dot -Tpng mysample.dot -o mysample.png
で、出力 mysample.png ができる。~
それを、Windowsにコピーするなり、Linux上の画像表示プログラム(たとえばeog)で表示するなり。

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

&ref(iris0.py.png);

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS