[[ノート/ノート]]~ 訪問者数 &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);