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誤差がどんどん小さくなっているいることが分かる。
つまり、学習が進むと、入力と出力がどんどん一致していっていることが分かる。

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