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

Chainer:超簡単なAutoEncoderを作ってみる(2)


2017年 03月 08日

前回MyAEというクラスを説明した。
このクラスからオブジェクトを作ると、用意ができる。

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

# Initialize model
model = MyAE()
optimizer = optimizers.SGD()
optimizer.setup(model)
ここまで用意ができたら、ループを回して延々と学習するだけであり、その処理は今までとほとんど同じである。

# Learn
losslist = []
for j in range(5000):
x = Variable(xtrain)
model.cleargrads()             # model.zerograds() 非推奨
loss = model(x)
if j%1000 == 999:
print( "%6d   %10.6f" % (j, loss.data) )
losslist.append(loss.data)     # 誤差をリストに追加
loss.backward()
optimizer.update()
今回は、誤差が徐々に縮まっていくところをグラフ化してみよう。
そのため、modelに学習データを与えて実行(学習)させると、誤差(loss)が帰ってきて、それをリストlossに加えていく。
正確には、loss.dataが誤差である。

これで、誤差がlosslistに溜まっているので、表示し、画像ファイルとしてセーブした。

# 誤差グラフの表示
plt.plot(losslist)
plt.savefig("irisautoencodeloss.png")
plt.show()

irisautoencodeloss.png誤差がどんどん小さくなっているいることが分かる。
つまり、学習が進むと、入力と出力がどんどん一致していっていることが分かる。

さて、次回は、もっと突っ込んで、ネットワークの内部のデータを調べてみよう。