Help us understand the problem. What is going on with this article?

Chainerでtied weightなAutoencoderを作った

More than 3 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, 中間層の出力 です

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

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした