TIM Labs

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

| コメント(0) | トラックバック(0)
AutoEncoder1回分の処理を行う関数は前回説明した。

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

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

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

トラックバック(0)

トラックバックURL: http://labs.timedia.co.jp/mt/mt-tb.cgi/576

コメントする

このブログ記事について

このページは、fujiが2017年3月14日 00:00に書いたブログ記事です。

ひとつ前のブログ記事は「Chainer:超簡単なAutoEncoderの脳の中を見てみよう」です。

次のブログ記事は「データ解析のための統計モデリング入門 GLMのモデル選択 読書メモ6」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。