※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

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()