はじめに
Chainer meetup #8で発表させていただいた内容(スライド)の内、「DiscoGANを使って「教師なし」でお米を数えてみる」の続き部分を文章にしたものなります。なので、初めて見られる方は前の投稿の方もみていただけると助かります。
あと、meetupの動画がyoutube上がっているので、そちらの方がわかりやすいかもしれません。
今回のデータとやりたいこと
今回はM3ナットをデジカメで撮影したサンプルのサンプルを二つ(16個と108個)用意しました。これらをDiscoGAN使ってカウントしやすいガウス球ドメインに変換し、その後カウントします。お米の時は、ランダムにばらまくガウス球の数は「見た目」でだいたいオーダだけを合わせていたのですが、どの程度適応できる範囲があるかわからないのでランダムにばらまく数(13個、26個、52個、131個)を変えてテストしてみました。
ばらまく数を変えた結果
この表は16個のナット画像に対し、平均13個のガウス球をばらまいたもので学習させるとカウントが20回中5回成功したという見方をします。画像のナットの数に対して、オーダがずれるとカウントが失敗する傾向があります。
どんな風に失敗したかというと、ナット16個 << ガウス球52個 のような場合は1個のオブジェクトに対して多くの球が生成されるようになり、ナット108個 >> ガウス球26個 のような場合は黒を生成しやすくなる傾向になりました。
また、4種類のランダム画像をそれぞれ25%の確率で学習したものもうまく学習されませんでした。
ディーラ(仮)を使ったネットワーク
そこで4種類のランダム画像を調整して配るような「ディーラ(仮)」を使ったネットワークを作成して、学習させてみました。ディーラは1⇒4個のネットワークで、ChainerにFunctionとして実装させているGunbel-Softmaxを使ってサンプリングを行うことで、簡単に逆伝播もできるようになります。変換器と同様にディーラ側のロスも識別機をだます方にしてあるので、結果として変換器の出力とディーラの選ぶランダムガウス球画像が似通ってくれるのを期待しています。
ChainerだとFunctionとLinkをつなげさえすれば簡単に逆伝播できるので、とても楽です。
ディーラを使った結果
学習が進むにつれ、ディーラ(仮)がナット画像の数に近い数のランダムガウス球画像を出すように調整してくれるため、カウントがある程度うまくいくようになりました。
さいごに
本当はもう少ししっかりしたデータを出したかったのですが、現状不安定で、meetupに間に合わせるために、最初にうまくいった例を出さざる負えなかった感はあります。なのでもうすこし時間をかけてデータを整えていきたいと思っています。
また、コードこちらに置いておきました