#概要
- 今のところ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, 中間層の出力
です
それぞれ一致しているので正しく実装できていそうです