ボンガードパズルをやってみた♬

先日、ディープラーニングでボンガードパズルを解いたという記事が出た。
このパズル見ると、単純なカテゴリ問題のようだ。
それにしては、結構苦労されて学習しているような内容になっているので、いわゆる転移学習を使って解けないかやってみた。
コード等は以下に置きました。
[MuAuan/Solving_Bongard_Problems](https://github.com/MuAuan/Solving_Bongard_Problems)

【参考】
[2018年03月09日 09時30分00秒 
2つにグループ分けされた模様から分類ルールを推測する「ボンガードパズル」をディープラーニングで解く](https://gigazine.net/news/20180309-bongard-problems-deep-learning/)
Originalは以下のサイトのようだ
[Solving Bongard Problems With Deep Learning　25 Feb 2018](https://k10v.github.io/2018/02/25/Solving-Bongard-problems-with-deep-learning/#perfundo-untarget)

#前報告の結果
この記事によれば結果は以下のとおり、ある意味不出来。上記参考の記事から引用すると、
「232個の問題を解いてみると、「テスト」画像をきちんと左右に分けられたものが47個あり、そのうち41個が正しく分類できていたとのこと。以下の画像で緑の部分が正解した問題、赤の部分が間違ってしまった問題を示しています。白の部分は、テスト画像を2つとも左側または右側に分類してしまい、解答できなかった問題です。」
つまり、ちゃんと正解できたのは、緑の部分だけという結果です。

というか、何らかの原因があってこの分類はディープラーニングでは難しいのだろう。それが何なのかとても気になる。というかそれが単純な分類問題への限界(人間の知性とは異なる)を示す可能性があるという意味で興味がある。
![draft4-table1.png](https://qiita-image-store.s3.amazonaws.com/0/233744/e5ca6720-6659-c386-3887-838447464539.png)
#パズル画像の準備
問題を解くために、パズル画像を一個一個画像として分割して、０と１にカテゴリとしておきます。
この問題の難しいところは、完全に６個／カテゴリですべてのデータがユニークなところです。
つまり、以前論じた１data challengeです。
これが難しさの一つなのかもしれません。ただし、過学習でもいいのでとにかく学習できて他の画像と分類できさえすればOKです。
いずれにしても今回はこの作業に時間がかかるので、１０番までの問題に挑戦しました。
※毎日少しずつ増やしていきます
#モデルの準備
画像データの読み込みは、以前転移学習で利用したgetDataSet.pyを利用しました。これはディレクトリを指定してそこからデータを読み取って、TrainデータとTestデータにデータを読み込みます。併せて、ディレクトリの番号がそれぞれのデータのカテゴリとして番号付けします。
そして、モデルは入力データサイズが110×110程度なので、128x128として、VGG16の転移学習で実施しました。最初の10層固定です。

```
for layer in model.layers[1:10]:  
    layer.trainable = False
```
#結果
問題は、６個中５個をTrainデータとし（つまり二カテゴリで10個で学習）、残り１個（つまり二カテゴリで二個）をTestデータとします。
最初の１０個の問題に挑戦です。分類がうまくいったのは〇を記載します。あとはval_accを記載します。0.5は半分分類でき、0は両方とも異なる分類をしたことを意味します。

| Problem|  1|  2|  3|  4|  5|  6| 7| 8|  9| 10|
|------|------|------|------|------|------|------|------|------|------|------|
|results |〇|〇|0.5|0.5|〇|〇⇒0.5|〇|〇|〇|0.5|
ここで、〇⇒0.5は途中〇だったが、最後0.5になってしまった。

| Problem| 11| 12| 13| 14| 15| 16|17|18| 19| 20|
|------|------|------|------|------|------|------|------|------|------|------|
|results |〇|0|〇|0|〇|0|〇|〇|〇|0.5|
１２，１４，１６で０、つまり逆に分類してしまう事象が発生したが、後日別途考察する予定です。
#考察
問題２０までの問題に対しては、いくつか両方とも失敗したケースが出ましたが、ここでは片方失敗したケースについて議論し、両方失敗したものは後日別途考察します。これらについては、ある意味だいたい正解を出していると評価できます。といっても失敗したケースにどんなものがあったか見るのは有意義です。
No.3は
![p003.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/8aab06ae-1b98-2da2-13a0-a1599cf0805a.gif)
黒塗りと白抜きのものなので、正解したいところですが、やはり画像が小さいものが残ると（たぶん最下段右の絵）それが識別できないようです。
No.4は
![p004.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/2a7ac4b1-b291-27d7-f31d-e93db1a062fe.gif)
この問題は人が考えても難しく、回答は左は素直な図形だけど、右は凹があるということらしいです。これは1個だけで実施すると、右の最下段右の勾玉型のを失敗してました。逆のベースボール型のもときどき失敗してます。
No.6は
![p006.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/7490da62-15be-2497-6df7-119fd90015c1.gif)
epoch30x3回だと最後に0.5になってしまったが、epoch50x3だと最後まで１で正解した。この問題は左は三角形、右は四角形だが、右真ん中左は三角形との差がきわどい。
No.10は
![p010.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/51c39091-4072-e0fb-7a81-ed37f1eb9b5c.gif)
この問題は左は三角形、右は四角形で比較的人にはわかりやすい。しかし、VGG16だとこの問題が一番難しいらしく、epoch50x3でやってみるとほぼ0になってしまった。つまり不正解。比較は左の最下段右と右の最下段右の小さなギザギザ三角と小さな四角。やはりほかの画像とは異なるとなってしまうようだ。
右最下段右の画像は小さくて、左の画像の二個と近いし、左最下段右の小さいギザギザ三角はギザギザだけ見れば右のギザギザの三個に近いし、それぞれ言い訳的には間違える要素はありそう。
No.20は
![p020.gif](https://qiita-image-store.s3.amazonaws.com/0/233744/7e2bbe57-4107-30da-45db-a0c115378879.gif)
これ２個の●がついている位置で分類しているようであるが、人が見てもなかなか判断が難しい。特に、二個の●が水平か垂直に並んでいると見始めるとわけがわからなくなる。ちなみにこの分類は左最下段右と右最下段右の画像がほかの5つの画像のどちらに近いかで分類している。その結果、右最下段右が間違えたということである。

ここで大切なことはどのようにして分類しているのかということです。
この手法は特にロジックを解こうとか推論するというものではなく、単純にそれぞれ５個ずつの画像から得られた重みを使って、問題画像を入力としたときにどちらに分類されるのかということです。まあ、そういう意味でも画像の特徴が似ていればそのように分類してほしいのですが、No10で見たようにそんなに簡単なことではなさそうです。
#課題
この画像による分類は、多くの物体識別の基礎だし、ミカンの選別やキュウリの選別なんかでも使われる基本中の基本。このボンガードパズルは一見ロジックがあるので単純な画像識別ではなさそうだが、それでもどのように分類しているかの理由を考える上では、うってつけな課題なような気がする。

ということで、今後、さらに多くの問題に適用しつつ、中間層などの特徴などを見ながら本当の理由を確かめたいと思います。
#おまけ
今回示しませんがやってみると、３個Train、３個Testなんかですべて正解できる問題もあります。さらに、もう少し面白い話として、VGG16的なボンガードパズルを作成できました。
※因みに、これは間違えた問題の間違えた側の集合同士からの当然の帰着から思いつきました。

これらについては、次回以降上記とは別に取り上げようと思います。