技術的な情報公開と、関連する製品の紹介を行うサイトです。データの分類を試してみました。ついての基本的な知識、ChainerやPythonについての基本的な知識があることを前提としています。追加された仕組み「Chain・Link」で書きなおしてみました。以下、通常版として公開しています。合わせて、全体的に「Chain・Link」使った内容に修正しています。本記事で作成したソースコードはGithub上に公開しています。Pretraining」を紹介します。Auto-EncoderNNの一手法で、以下の特徴を持っています。入力層、隠れ層、出力層の3層構造。入力層と出力層のニューロン数は同じ、上下対称のNN。教師データとして、入力データそのものを用いる。入力データが一度圧縮され、元に戻るような構造をしているので、一種の次元圧縮器として利用されます。Auto-Encoder名前の通り、Auto-Encoderを積み上げて多層化したものです。そのまま多層化して扱うだけでは、ニューロン数が多すぎるためNNの学習がうまく行きません。Pretraining」、その後全体の学習を行う「Finetuning」により効率よくNNを最適化します。Pretrainingについて、以下に示します。Auto-Encoderを実装してみました。公開しているサンプルソースコードのlibs/stacked_auto_encoder.pyがそれに当たります。特長としては以下を持っています。理論上何層でも設定可能。(マシンリソースによる限度はあります。)ミニバッチ法を採用。アプリケーション側でバッチ数を指定して学習を進めることができる。ChainerのGPU処理も取り入れている。設定によりGPUの使用有無を指定可能。サンプルソースコードでは、settings.pyで上記の設定を行うことができます。Auto-Encoderして最適化』しています。この方法でも、後に示すように効果は上げています。座標として座標空間上に布置しました。実施した結果が下記です。MNISTのラベル0~9で色分けして表示した結果、ある程度綺麗に分類されているのが確認できます。サンプルコードを利用しています。https://github.com/pfnet/chainer/blob/master/examples/mnist/data.py作成したソースコードはGithub上に公開しています。Auto-Encoderを実装するにあたり、NNの層数を動的に扱う必要がありました。動的に設定することができれば、簡単に実装モジュールの外側でNNの構成を変えることができるからです。Chainerでは通常、NNのクラスのコンストラクタで変数として層を定義してしまうため、この呼び方では動的な設定が叶いません。chainer.Chainクラスのメソッド「addlink」「__getitem__」を使うことにより、この問題を解決しました。Auto-Encoderを実装し、MNISTのデータが分類できることを実験してみました。フレームワークはCaffeを用いて課題に取り組んでいました。Caffeと比べるとChainerはプログラミングで書く部分が大半を占めていて、Caffeよりは慣れるまでに時間はかかりました。NNの設計については、Caffeでprototxtを記述するよりもソースコードで書く方が良く理解できました。(プログラミングに慣れていたのもありますが。)今後は、このソースコードに更に改良を加えて、色々と実験を行っていきたいと思います。