Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
25
Help us understand the problem. What is going on with this article?
@hatoo@github

Chainerでtied weightなAutoencoderを作った

More than 5 years have passed since last update.

概要

  • 今のところChainerでtied weightなAutoencoderを作りたい場合、簡単に作る方法がありません
  • なので再利用可能な形で作ってみました
  • GPUも対応しています
  • Qiita初投稿です。よろしくお願いします
  • Chainer1.3.1に対応しました

方針

  • Autoencoderの変換・再構成までをまるまるchainer.function.Functionの派生クラスに落としこむ

コード

こちらに上げました
Autoencoderクラスをインポートして使用してください

こまかいこと

  • 中間層の活性化関数は変更可能ですがデフォルトでシグモイド関数です
  • 中間層のdropoutは行いません
  • 再構成した結果は活性化関数を適用してない状態で返します

簡単な使い方

chainerのFunctionなのでchainer.functions.Linearなどと同じように使用します。n_inputが入力のサイズ, n_hiddenが中間層のサイズです

model = chainer.Functionset(ae1=Autoencoder(n_input, n_hidden),
                            ..)

呼び出すと再構成した結果が帰ってきます。再構成した結果に活性化関数は適用されていません。

y = model.ae1(x)

ロスをこんな感じに定義すれば、入力と出力が一致するように学習できます

loss = chainer.functions.mean_squared_error(y, x)

学習し終わったらhiddenを呼ぶと中間層の出力を得られます(活性化関数も適用されています)。入力の型はchainer.Variableです

h = model.ae1.hidden(x)

ちゃんと実装できているか?

theanoで同じことをして結果を比較する

  • ちゃんと実装できているか心配なので(特にbackward)、同じものをchainer(今回実装したAutoencoderを使用)とtheanoで計算して結果を比較します
  • theanoは自動で微分してくれるので比較対象として使えそうです

やること

  • 各実装で同じ初期パラメータで同じデータセットをAutoencoderで学習していき、結果を比較します。
  • 同じ計算をしているので結果も同じになるはずです。
  • 比較するのはchainer(cpuで計算),chainer(gpuで計算),theanoの3つです。

コード

こちらに上げました。python2.7です
そのまま実行してください

追記 1.3.1
自分の環境

  • Windows 10
  • Theano 0.7.0
  • CUDA 7.0
  • Chainer 1.3.1

で、このコードを動かすと終了時にエラーが出てきます。どうやらTheanoとChainer1.3.1を一緒に使用するとエラーが出てくるようです。ですが、Chainerだけを使う場合は大丈夫なので、自分は今のところ放置しています。

結果

データセット[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]を学習してみました
中間層のサイズは5です

.
.
epoch  1000
y_cpu [[ 0.21298632  0.29139116  0.38235438]
 [ 0.2916162   0.41254863  0.52147532]]
loss_cpu 0.00891023594886
hidden_cpu [[ 0.48791173  0.60213435  0.48187184  0.52815247  0.45188218]
 [ 0.47335175  0.73995906  0.45421988  0.53906572  0.40177849]]

y_gpu [[ 0.21298626  0.29139113  0.38235441]
 [ 0.29161614  0.41254857  0.52147532]]
loss_gpu 0.00891023781151
hidden_gpu [[ 0.48791173  0.60213435  0.48187184  0.52815241  0.45188218]
 [ 0.47335175  0.73995906  0.45421988  0.53906572  0.40177849]]

y_theano [[ 0.21298596  0.29139113  0.38235551]
 [ 0.29161561  0.4125483   0.52147633]]
loss_theano 0.00891025736928
hidden_theano [[ 0.48791176  0.60213423  0.4818719   0.52815264  0.45188224]
 [ 0.47335178  0.73995888  0.45421994  0.53906602  0.40177864]]

見にくいですが y, loss, hidden がそれぞれ、再構成した結果, mean squared error, 中間層の出力 です

それぞれ一致しているので正しく実装できていそうです

25
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
hatoo@github
Rustのお仕事ください!

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
25
Help us understand the problem. What is going on with this article?