Chainer:超簡単なAutoEncoderの脳の中身の並べ方


2017年 03月 14日

AutoEncoder1回分の処理を行う関数は前回説明した。

今回は、そのexeconce()を呼び出して脳内情報を得て、matplotlibを利用して図示しよう。

9回呼び出して、3×3の形に並べてみよう。
まず、図のサイズを決める。デフォルトでは小さいので、サイズ指定した。

plt.figure(figsize=(16,12))
figure()により、図に関するさまざまな事を指定できる。
figsizeは、全体のサイズをインチ単位で指定する。
dpiもあり、デフォルトはdpi=100になっている。
なので、上記は、100dpiで、16インチx12インチになる。
つまり、ドットで言えば、1600ドットx1200ドットとなる。

準備ができたら、9回ループして、実行し、結果を毎回画面の指定区分の中に表示するだけ。

for idx in range(9):
print("exec ",idx)
ans = execonce()

ansx1 = ans[0:50,0]
ansy1 = ans[0:50,1]
ansx2 = ans[50:100,0]
ansy2 = ans[50:100,1]
ansx3 = ans[100:150,0]
ansy3 = ans[100:150,1]

plt.subplot(3,3,idx+1)
plt.scatter(ansx1,ansy1,c="r",alpha=0.5,linewidth=0)
plt.scatter(ansx2,ansy2,c="g",alpha=0.5,linewidth=0)
plt.scatter(ansx3,ansy3,c="b",alpha=0.5,linewidth=0)
ansx1,ansy1,…の部分は、3種類のIrisに合わせて、3つのx座標、y座標に分けているだけ。

plt.subplot()で、画面分割している。
行分割数、列分割数の順に指定し、最初から何番目枠に表示するかを指定する。枠番号は、1から始まる。

plt.scatter()で散布図の形で示した。
最初の2つが、x座標値、y座標値んびなる。
c=色、alpha=透過率、linewith=0 で表示している。
マークを使ったり、色を細かく指定したり、いろいろできるが説明省略。

これだけで、Deep Learning の脳内がちょっと表示できたと言えるかな。

全体のプログラム
“ae2.py”:AutoEncoderを複数回実行し、中間層の中身(脳)の状態のバラエティを表示する。
#!/usr/bin/env python
# from http://nlp.dse.ibaraki.ac.jp/~shinnou/book/chainer.tgz

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 matplotlib.pyplot as plt

# Set data

from sklearn import datasets
iris = datasets.load_iris()
xtrain = iris.data.astype(np.float32)

# Define model

class MyAE(Chain):
def __init__(self):
super(MyAE, self).__init__(
l1=L.Linear(4,2),
l2=L.Linear(2,4),
)

def __call__(self,x):
bv = self.fwd(x)
return F.mean_squared_error(bv, x)

def fwd(self,x):
fv = F.sigmoid(self.l1(x))
bv = self.l2(fv)
return bv

def execonce():
# Initialize model
model = MyAE()
optimizer = optimizers.SGD()
optimizer.setup(model)

# Learn
n = 150
for j in range(3000):
x = Variable(xtrain)
model.cleargrads()    # model.zerograds()
loss = model(x)
loss.backward()
optimizer.update()

# get middle layer data
x = Variable(xtrain, volatile='on')
yt = F.sigmoid(model.l1(x))
ans = yt.data

return ans

# 本体:9回実行し、グラフ出力
plt.figure(figsize=(16,12))
for idx in range(9):
print("exec ",idx)
ans = execonce()

ansx1 = ans[0:50,0]
ansy1 = ans[0:50,1]
ansx2 = ans[50:100,0]
ansy2 = ans[50:100,1]
ansx3 = ans[100:150,0]
ansy3 = ans[100:150,1]

plt.subplot(3,3,idx+1)
plt.scatter(ansx1,ansy1,c="r",alpha=0.5,linewidth=0)
plt.scatter(ansx2,ansy2,c="g",alpha=0.5,linewidth=0)
plt.scatter(ansx3,ansy3,c="b",alpha=0.5,linewidth=0)

plt.savefig("irisautoencode.png")
plt.show()