ノート/ノート
訪問者数 4968 最終更新 2017-04-28 (金) 11:16:53
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ファイルを表示する方法は、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プログラムのグラフは下記の通りに表示された。