LoginSignup
25
24

More than 5 years have passed since last update.

Chainerでtied weightなAutoencoderを作った

Last updated at Posted at 2015-08-02

概要

  • 今のところ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
24
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
24