AI_ML_DL’s diary

人工知能、機械学習、ディープラーニングの日記

Abstraction and Reasoning Challenge グリッド解釈

Abstraction and Reasoning Challenge グリッド解釈

グリッドの解釈方法を学ぶ。

といっても、頭の中でグリッドを動かしたり、ペンを持ってお絵描きするのとは違って、プログラムするというのは、簡単な作業ではない。

コンペのDiscussionで見かけた”Manual Coding for the First 10 Tasks @nagiss”が、F. Cholletさんの言う、10の課題についてのハードコードから始めるのが良い、とのアドバイスにしたがって、忠実に作業された成果のようで、非常に良くできているので参考にさせていただく。

 

最初のtrain dataは、007bbfb7.json

F. CholletさんのGitHubで、trainingデータとして最初に表示される。

そのままコピペして表示するとこうなる。

テストグリッドが最初の位置に置かれている。

{"test": [{"input": [[7, 0, 7], [7, 0, 7], [7, 7, 0]], "output": [[7, 0, 7, 0, 0, 0, 7, 0, 7], [7, 0, 7, 0, 0, 0, 7, 0, 7], [7, 7, 0, 0, 0, 0, 7, 7, 0], [7, 0, 7, 0, 0, 0, 7, 0, 7], [7, 0, 7, 0, 0, 0, 7, 0, 7], [7, 7, 0, 0, 0, 0, 7, 7, 0], [7, 0, 7, 7, 0, 7, 0, 0, 0], [7, 0, 7, 7, 0, 7, 0, 0, 0], [7, 7, 0, 7, 7, 0, 0, 0, 0]]}], "train": [{"input": [[0, 7, 7], [7, 7, 7], [0, 7, 7]], "output": [[0, 0, 0, 0, 7, 7, 0, 7, 7], [0, 0, 0, 7, 7, 7, 7, 7, 7], [0, 0, 0, 0, 7, 7, 0, 7, 7], [0, 7, 7, 0, 7, 7, 0, 7, 7], [7, 7, 7, 7, 7, 7, 7, 7, 7], [0, 7, 7, 0, 7, 7, 0, 7, 7], [0, 0, 0, 0, 7, 7, 0, 7, 7], [0, 0, 0, 7, 7, 7, 7, 7, 7], [0, 0, 0, 0, 7, 7, 0, 7, 7]]}, {"input": [[4, 0, 4], [0, 0, 0], [0, 4, 0]], "output": [[4, 0, 4, 0, 0, 0, 4, 0, 4], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 4, 0, 0, 0, 0, 0, 4, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 0, 4, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 4, 0, 0, 0, 0]]}, {"input": [[0, 0, 0], [0, 0, 2], [2, 0, 2]], "output": [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 2], [0, 0, 0, 0, 0, 0, 2, 0, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 0, 0, 0, 0, 0, 2], [2, 0, 2, 0, 0, 0, 2, 0, 2]]}, {"input": [[6, 6, 0], [6, 0, 0], [0, 6, 6]], "output": [[6, 6, 0, 6, 6, 0, 0, 0, 0], [6, 0, 0, 6, 0, 0, 0, 0, 0], [0, 6, 6, 0, 6, 6, 0, 0, 0], [6, 6, 0, 0, 0, 0, 0, 0, 0], [6, 0, 0, 0, 0, 0, 0, 0, 0], [0, 6, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 6, 6, 0, 6, 6, 0], [0, 0, 0, 6, 0, 0, 6, 0, 0], [0, 0, 0, 0, 6, 6, 0, 6, 6]]}, {"input": [[2, 2, 2], [0, 0, 0], [0, 2, 2]], "output": [[2, 2, 2, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 2, 0, 2, 2, 0, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 2, 2, 0, 2, 2]]}]}

適当に改行して、適当に記号を消して、グリッド(行列)らしくすると、

"test":

"input":

[7, 0, 7],

[7, 0, 7],

[7, 7, 0]

"output":

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 7, 0, 0, 0, 0, 7, 7, 0],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 7, 0, 0, 0, 0, 7, 7, 0],

[7, 0, 7, 7, 0, 7, 0, 0, 0],

[7, 0, 7, 7, 0, 7, 0, 0, 0],

[7, 7, 0, 7, 7, 0, 0, 0, 0],

"train":

"input":

[0, 7, 7],

[7, 7, 7],

[0, 7, 7]

"output":

[0, 0, 0, 0, 7, 7, 0, 7, 7],

[0, 0, 0, 7, 7, 7, 7, 7, 7],

[0, 0, 0, 0, 7, 7, 0, 7, 7],

[0, 7, 7, 0, 7, 7, 0, 7, 7],

[7, 7, 7, 7, 7, 7, 7, 7, 7],

[0, 7, 7, 0, 7, 7, 0, 7, 7],

[0, 0, 0, 0, 7, 7, 0, 7, 7],

[0, 0, 0, 7, 7, 7, 7, 7, 7],

[0, 0, 0, 0, 7, 7, 0, 7, 7]

"input":

[4, 0, 4],

[0, 0, 0],

[0, 4, 0]

"output":

[4, 0, 4, 0, 0, 0, 4, 0, 4],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 4, 0, 0, 0, 0, 0, 4, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 4, 0, 4, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 4, 0, 0, 0, 0]

"input":

[[0, 0, 0],

[0, 0, 2],

[2, 0, 2]

"output":

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 2],

[0, 0, 0, 0, 0, 0, 2, 0, 2],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 2, 0, 0, 0, 0, 0, 2],

[2, 0, 2, 0, 0, 0, 2, 0, 2]

"input":

[6, 6, 0],

[6, 0, 0],

[0, 6, 6]

"output":

[6, 6, 0, 6, 6, 0, 0, 0, 0],

[6, 0, 0, 6, 0, 0, 0, 0, 0],

[0, 6, 6, 0, 6, 6, 0, 0, 0],

[6, 6, 0, 0, 0, 0, 0, 0, 0],

[6, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 6, 6, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 6, 6, 0, 6, 6, 0],

[0, 0, 0, 6, 0, 0, 6, 0, 0],

[0, 0, 0, 0, 6, 6, 0, 6, 6]

"input":

[2, 2, 2],

[0, 0, 0],

[0, 2, 2]

"output":

[2, 2, 2, 2, 2, 2, 2, 2, 2],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 2, 2, 0, 2, 2, 0, 2, 2],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 2, 2, 2, 2, 2, 2],

[0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 2, 2, 0, 2, 2]

f:id:AI_ML_DL:20200315203330p:plain

この配列のサイズであれば、配列を見ることと、画像を見ることの間に、それほど大きな差異はなさそうに感じる。

そう感じるのは、今見ている課題が、ARCの課題の中では簡単な部類に属しているからであろうか。

入力も出力も30x30程度の大きなグリッド(メッシュが細かいグリッド)となると、そうはいかないかもしれない。

 

課題00d62c1bの訓練グリッドの1つは20x20で、こんな感じ。

"input":

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 3, 3, 3, 3, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0],

[0, 0, 3, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 3, 0, 0, 3, 0, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 3, 0, 0, 3, 3, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 3, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

"output":

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 3, 3, 3, 3, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 3, 0, 0, 0, 3, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0],

[0, 0, 3, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 3, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 3, 3, 4, 4, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 3, 4, 4, 3, 3, 0, 0, 3, 0, 0, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 3, 0, 0, 3, 3, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 4, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 3, 3, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

これなら、30x30くらいまで大きくなっても、行列を直接見ながら考えることができそうである。

小さな行列に対して検討を重ね、解釈・解析の自動化が進んでいくことを予想しておこう。

行列を直接眺めていると、コンピュータになった気分で、入力行列と出力行列の関係性を把握する方法を、より具体的に考えることが出来るような気もしている。

 

さて、最初の課題007bbfb7に戻ろう。

入力グリッドは3x3、出力グリッドは9x9。

3x3の行列を見ると、CNNを連想する。

CNNモデルの多くが、畳み込み演算に、3x3の行列を使っているためであろう。

入力配列を用いて、出力配列に対して畳み込み演算をやってみよう。

"input":

[7, 0, 7],

[7, 0, 7],

[7, 7, 0]

"output":

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 7, 0, 0, 0, 0, 7, 7, 0],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 0, 7, 0, 0, 0, 7, 0, 7],

[7, 7, 0, 0, 0, 0, 7, 7, 0],

[7, 0, 7, 7, 0, 7, 0, 0, 0],

[7, 0, 7, 7, 0, 7, 0, 0, 0],

[7, 7, 0, 7, 7, 0, 0, 0, 0],

ストライド3で、入力配列を用いて、出力配列を畳み込み演算すれば、3x3の出力行列が得られる。

このとき、要素ごとの積を足し算する積和演算ではなく、要素ごとの差を足し算すれば(出力配列に対して入力配列の演算をするので、[出力配列] - [入力配列] =[変換行列])、出力行列は次のようになる。

[0, -42, 0]

[0, -42, 0]

[0, 0, -42]  

この結果を使って、新たな入力行列から出力行列を得るには、逆向きの演算をすればよいのか。

[出力配列] = [変換行列] + [入力配列]

これだと、変換行列も入力行列も3x3だから、出力行列は3x3になる。

畳み込み演算は、情報を畳み込みベクトルの範囲内(3x3)の情報を集約しており、かつ、ストライド3を使ったこともあって、入力配列の構造情報が失われてしまっているようで、再現できない。

エンコーダとデコーダの関係のようだ。U-Netの出番か、と思ったりもするが、確率や統計の世界ではなく、決定論の世界なので、ちょっと違うような気もする。

3x3の配列からCNNを想起した結果、畳み込み演算の真似事をしてみたのだが、これはあまり良い方法とはいえないのかもしれない。

畳み込みからは、いったん、離れよう。

 

難しい問題をもう1度、検討してみる。

162
6d0160f0.json

f:id:AI_ML_DL:20200316170138p:plain

このデータセットの入力と出力の関係を、コンピュータになったつもりで、説明してみよう。

まずは、1番目の訓練画像について、

入力グリッドのサイズは11x11である。:array.shape

入力グリッドは、5が4行目と7行目、4列目と7列目に並んでいる。

入力グリッドは、3x3の配列が3行、3列、ある。

出力グリッドのサイズは11x11で、入力グリッドと同じ。

出力グリッドは、5が4行目と7行目、4列目と7列目に並んでいる。入力グリッドと同じ。

出力グリッドは、3x3の配列が3行、3列、ある。入力グリッドと同じ。

出力グリッドの3x3の配列は、要素がすべて0のものが8つ。

入力グリッドの3x3の配列は、要素のすべてが0のものはない。

出力グリッドの3x3の配列と同じものが、入力グリッドの3x3配列にあるかどうか調べた。

出力グリッドの3x3の配列を、ストライド4で動かしながら要素ごとの差をとることによって、7番目の3x3配列と同じであることが分かった。

*ここまでの情報から

1.出力画像は、11x11のグリッドサイズとする。

2.配列要素は全て0とする。

3.4行目と7行目、および、4列名と7列目に5を並べる。

ここまではほぼ確定だが、重要なのはここからだ。

9か所ある3x3ボックスの7番目の配列を、3番目のボックスに入れるので良ければ完了なのだが、残りの3つの訓練データについて調べれば、そうではないことがわかる。

ヒトは、一瞬でそのことに気付き、どこからコピーしたのか、どうしてその位置になるのか調べる。

ヒトは、3x3配列に黄色が含まれているものが、出力画像に使われ、その黄色の位置が、出力画像中での3x3グリッドの位置を決めていることに気付く。

コンピュータに、それができるようにすることが、このコンペの課題だ。 

 

何度も繰り返して、自分に言い聞かせているのだが、知能テストが調べようとしているのは、出力画像の作り方ではなく、出力画像を作るための方法を見つける能力である。

入出力画像について最初にやらなければならないことは、入出力画像から、出力方法を見つけることである。その次に、その出力方法を実行するプログラムを出力することである。最後に、テスト画像に対応した出力画像を作成することである。

誤解であれば、たいへん失礼なことになるのだが、お手本コードは、出力方法を見つけるプロセスを、スコープに入れていないように思う。

10件の課題は人には易しいものばかりで、画像を見るなり、作業内容(出力画像作成方法)を理解し、その実行プログラムを作成されたのだと思う。

ともあれ、出力画像を得るためのプログラムのお手本があるのは、非常にありがたい。

 

f:id:AI_ML_DL:20200316221157p:plain

コンピュータになったつもりで課題を見ていこう。

入力画像と出力画像のサイズ:21x21:入力と出力は同じサイズ

出力配列と入力配列の引き算を要素ごとに行う。

得られた配列と入力配列の比較から、入力画像の最も大きい像が繰り返し出現していることがわかる

複製する方向:中心像の部品がある方法

複製する像の色:部品の色

入力画像から、最も大きい像以外を消した配列つくる

出力配列から、その配列を差し引いて、生成する像の形と色を確認する

生成する像の基本形が3x3の配列で、像と像の間は、上下左右も、斜めも、グリッド1単位であることを確認する

これでテスト出力画像を作れるか。

f:id:AI_ML_DL:20200316224257p:plain

テスト画像中の最大画像(門の形)を確認する。

最大画像の近くにある部品の色と方向を確認する。

確認した色で、中心画像を、グリッド1単位の間隔で、部品の方向にコピーする。

 

f:id:AI_ML_DL:20200316224713p:plain

入力画像のサイズ:3x7

出力画像のサイズ:3x3

 

*200問までのグリッドを3つの場合、出力サイズが小さくなる場合、出力サイズが大きくなる場合、出力サイズが変化しない場合、に分けて解釈する。

 

*出力サイズの方が小さい場合:入力画像サイズ>出力画像サイズ

・演算(and, or, 

・抽出/取り出し(サイズの大小、数の多少、枠内、単純取り出し、数をグリッド数で表示、取り出しx2、単位構造、取り出し+色変化、取り出し部分判定、目印有無、目印有無+目印色変化、特定グリッド領域、特定色を含む枠内、対称性有無、枠内への当て嵌め、パターンへの当て嵌め、枠内取り出し+着色、マーキングか所取り出し+枠消去+着色、自己パターン合成、反転を含む目印領域への当て嵌め

・抽象化(グリッド接続+形状単純化、変形+単純化+色分類

・ノイズ(ノイズ除去+グリッド接続、ノイズ除去+取り出し+グリッド接続

・合成(小さなパーツの組み立て、重ね合わせ+優先順位

・分割(4分割、2分割

・二値化(接続の有無、対称性の有無、

・多値化(形状分類、大小判定+着色

・抽象化+二値化(枠消去+グリッド接続+数による2色化、

・接続(移動により部品端部の灰色間を接触・灰色は元の部品の色に変化

 

*出力サイズの方が大きい場合:入力画像サイズ<出力画像サイズ

・タイル(元のパターンを使う、長辺2倍、模様を追加して4倍、反転により4倍、目印方向に2倍+内部グリッド分割、上方反転2倍、回転角大

・相似(グリッド分割+模様追加、模様拡大+グリッド分割、グリッド分割+中央半分削除+4隅削除、模様拡大+色順保存

・拡張(模様拡張

 

*入出力サイズに変化がない場合:入力画像サイズ=出力画像サイズ

埋める(囲み領域、ボックス内の模様をボックス外にある同じ形状のブロックで埋める、89:矩形で最大の空白をピンクで埋める、98:埋めてふたをする、101:正方形または1点の穴のみ赤で埋める

修復(104:ライン状の模様の欠けを埋める

除く(84:矩形パターンの内部にはしご状に黒を入れる、97:矩形の内部をくりぬく

囲む(1つしかない点を赤で囲む、94:灰色の点を青で囲む

変形(部分平行移動、点から線へ・点の色により水平または垂直、点からパターンへ・点の色により異なる2種類、共通パターンへの変形、点から線・パターンへ、上方開口部を埋める

増殖(基本パターンの伸長、基本パターンの進展・埋め尽くし、3x3から5x5へ拡張、点から線へ・生成パターンの進展、共通パターンへの進展、部分パターン追加による回転対象体の完成、最大の3x3パターンへの変形と追加・5x5の枠内・仕切り線の色を使う、特定色方向へ伸長・単色、枠外の点を枠内内周に平行移動コピー、対角線方向に別色の模様を追加、2辺にある点の交点に別色の点を追加、2つの点を端部まで十字に伸ばす・交点を茶色に変える、三角形の底辺の中心から頂点を経て端まで出発点の色で直線を描く・元の色は保存、矩形パッド外のパターンを矩形パッド内の点の位置に移動し、パターン内の同色2点を矩形バッド内で端部まで伸長する、左右の両端部の点をその色で中心付近まで伸ばし、中心は灰色にする、79:点状グリッド集合体を中心に模様を増やす、81:下方に模様を作りながら増やす、83:下方にラインを作って45度方向に数珠状に端までつなぐ、

増殖・2倍体(パターンを赤いマークとの境界側に反転して接続する

増殖・基準点在り(88:緑の点に対して同一パターンを赤の点に対して反転パターンをつくる、100:1点または2点を用いて相似形をつくる

接触(パターンの水平・垂直移動、点が移動して同色の線に接触、92:点を中央の灰色のパターン方向に移動して接触させ灰色にする・複数点あれば積み上げる

接続(2点間 、対向する辺にある同色の2点間、水平または垂直で接続可能な2点間を緑で接続、内部の空間に水平と垂直方向に最も長い線を描く・複数候補があれば全て描く、点から矩形パッドに向かって水平もしくは垂直方向の線を描く、緑の2個組から赤の2個組に向かって折れ線を描く・直線は水色の模様に接触すると赤の2個組に近い方向に曲がる・直線は水色グリッドに接触するまでは曲がらない・緑から進みだす方向は水色グリッドがある方向である、91:同色の2点間をつなぐ・交点は縦線を優先、

色付け(高さ・長さ順、形状別・接触3x3に隔てられた4隅を除く矩形領域を訓練画像と同様に着色する、左上隅から緑色に右巻き方形渦巻を形成、3x3に隔てられた3x3領域のうち着色点が多い領域のみ着色点での色で塗りつぶし他は黒で塗りつぶす、複数ある水色のパターンを着色した同一形状パターンで色付けし元の着色パターンは消去する

色変化(4組の訓練画像が必要、近い方の側辺の色に変化、同色の行の色を灰色に変える・他の行は黒にする、水色で示された領域内の青色パターンのみ緑に変える、

部分選択(1/9の選択・色数の違い・選択後グリッド数増加、

ノイズ除去(96:単独の点を除去

マスク除去(マスク状の黒い領域を等価領域のパターンで埋める、矩形の単色パターンを削除・隠されていたパターンを反転により再生、茶色のパッドを削除し等価領域のパターンで再生する

パターンの併合(部分一致・移動・反転・回転、

再配置(特定の色のパターンに合わせて整列、接触するまで下方に移動、下方に1行移動、

移動(青点を2つ下に動かしそこを青にする、点を3x3のパターンで置き換える、77:線を上方に移動して欠けをを埋める

変形(小さな模様を大きな模様に変える・反転構造を含む、80:欠けを補って四角形にする、85:内外の色を交換・さらに外側に拡大する、

表出(76:隠れている矩形パターンの輪郭を明確にする、

回転(86:180度回転

ラインの追加(93:正方形の枠を中心に赤い十字線を描く・枠が表面側

 

*課題の特徴を把握する方法

・入力画像の特徴(一様性、対称性、ノイズ、

・出力画像ー入力画像の特徴(

・入力画像ー出力画像の特徴(

 

つづく 

 

f:id:AI_ML_DL:20200315162600p:plain

style=115 iteration=1

f:id:AI_ML_DL:20200315162709p:plain

style=115 iteration=20

f:id:AI_ML_DL:20200315162749p:plain

style=115 iteration=500