去年画像分類をMxnetでSiamese Network modelで実装したが、今回自分の振り返り用も含めてTensor flowで実装したいと考えたのでまとめたい。正確にはネットワーク部分をCNNで実装した。
Siamse Networkモデルとは
以下の論文や記事によれば、
Siamese Networkをchainerで実装するまで
ワンショット(学習データが1件)学習や不均衡データに対する分析にも強いようで、そのため去年のプロジェクトで少し使った。ただもちろん弱点もあって2値クラスでしか対応していないという事があげられる。
Siamse Networkモデル説明と実装
2つ同じネットワークを用意して、その出てきたそれぞれの距離を学習させていくのが、この分析のミソになる。距離層のところは最初の論文はユークリッドらしいので今回はユークリッド距離で実装した。
実装したコードそんなに綺麗なコードではなくてすいません・・・。とりあえず有名なMnist様で実装をした。ただしMnistでもせっかくなので学習データは1件で0と1の分類を行った。
結果
その結果は以下のように1枚でも約90%の精度と高い結果が得られた。
一応以下のようにCNNでもやってみたが、やはり余り良い結果は得られなかった(2値分類なので50%が基準となる)。
実際のデータはMnistとかみたいに割り付けがされていることは本当に少なく、不均衡のことが多い。そうゆうときにはやはり便利なアルゴリズムなんだなと思ったし、実際にsomote擬きみたいな事を画像でもやったが、それよりはSimese Network modelのほうが精度はよかった。研究でもう少し複雑なネットワークや多値分類をやっているケースもあるので今後も勉強していきたいところ*。
注 っていうかこれもうちょっと発展させたら普通に論文としてどっかに投稿できそうな感はある。