クーの自由研究

冬の到来:空気が教えてくれるよ。う~んと深呼吸して、鼻がツンとしたら、それが冬のはじまり。

自己符号化器の自由研究(その6)画像変換(回転)を学習できる?

おおまかな内容

前回にひき続き、元画像に対して変換をかけたものを学習できるか実験します。

インプットは元画像ですが、アウトプットが回転になるよう学習させた結果がうまくエンコード・デコードできるかを実験します。

なぜやるのか・どうなると思うか

たぶん予想とおりなんです。面白くなくて本当にどうもすみません。

準備と実験のやり方 

学習データとして反時計回り45°としたオペレーション結果を学習させます。

90°回転だと

backup = np.rot90(np.copy(x).reshape((28, 28)))
xx = backup.ravel()
delta1 = - (xx - y)

で済むのですが、あまりにも面白みがないですし、いかにもできてあたりまえそうなので45°回転させることにました。ところが、回転するプログラムがかけず挫折しました。

結局、イメージに1ドットずづ複写してイメージの機能で回転させ、配列に1ドットずつ戻すという恥ずかしいロジック(もちろんとっても遅いです)で実装しました。

backup = np.reshape(x, (28, 28))
backup *= 255.0
im2 = Image.new('RGBA', (28, 28))
pix = im2.load()
for i in range(28):
for j in range(28):
pix[j, i] = (int(backup[i, j] * 255), 0, 0, 0) 
pix2 = im2.rotate(45).load()
for i in range(28):
for j in range(28):
backup[i, j] = pix2[j, i][0] / 255.0
xx = backup.ravel()
delta1 = - (xx - y)

もっと早いロジックがあるはずですが、深追いしないことにしました。

実験の結果

予想通りうまくいってしまいました。どうもすみません。

f:id:np2LKoo:20160823225056p:plain

まとめ(わかったこと・わからなかったこと)

結局通常の1層の学習とかわらない感じだと思います。問題なくできました。1層ニューラルネットは、この程度はできるイメージはあったの予想とおりでした。

(追記)「回転オペレーションを汎用的に自己符号化器で抽象化できるのか?」とのイメージを持たれた方がいらっしゃったらお詫びします。そこまでは全然いってません。回転も単一のみです。実は回転ですらなくて、回転済の画像を記憶して再生しているだけなのです。「汎用的な単一回転(に見える画像処理)であれば、メモリとマシンパワーがあればできそう。」というのがこの実験の趣旨です。将来的には自己符号化器をスタックにして画像の復元と本当の意味での回転オペレーションをそれぞれ抽象化できるのではないかと想像しています。未来のボクにご期待ください。(あ、また風呂敷をひろげてしまった。)

感想・思ったこと・考えたこと

さて、次が本当に確認したいことなのです。

(例えば)

28×28の図形が倍のエリア56×56の任意の位置にある(ランダムで位置決め)ものを入力とし、56×56の中央に画像を出力として学習させる。(中央の28×28部分に配置。)このとき、入力画像(任意の位置の画像)に対して、学習させた通りの意図(中央に再現出力)でエンコード・デコードできるか?

というお題です。これはさすがに無理ぽだと思いますが確かめたいです。ノード数を多くして、学習を十分にすれば論理的には可能なのはわかっているのですが、ボクのパソコンでは現実的に無理かなという感覚です。

ボクのパソコンはGPUなしなので、このレベルの計算は厳しいです。もう少し小さくして実験するかもしれません。

かえるの自由研究をされている皆さまと保護者様へお詫び

ボクのブログは、ほとんど夏休みの宿題でほぼ「かえるの自由研究」をされている方の検索しかありません。「なんだこれ?」とお思いでしょうが、ボクはいたって真面目に自由研究をしております。低学年の方には少し難しい内容だと思います。無理をせず高学年までお待ちください。高学年の方でかえるを熱射病で死なせてしまった方(涙)、あるいはお庭でかえるを見つけられない方は、この「自己符号化器」の研究をかわりにやってみるのは如何でしょうか。とても楽しいですよ!おうちにパソコンがあればできます。スマホでもがんばればできます。内容は基本的に掛け算と足し算です。「微分」がでてきますが、道のりと速さと時間の関係がわかればきっと理解できるはずです。

  1. 道のり(km) = 速さ(km/h) × 時間(h)
  2. 速さ(km/h) = 道のり(km) ÷ 時間(h)
  3. 時間(h) = 道のり(km) ÷ 速さ(km/h)

人間は本当は一定のはやさでなかなか歩けない(休んだり、疲れてゆっくり歩いたり、遅れそうなのに気づいて早歩きしたり)そんなとき上の式の関係がどんな感じになるか想像してみましょう!(グラフにすればおもしろいかもです。ヒント:速さが変化するとどんな感じになるでしょう?細切れにして考えましょう!!そういうのが微分(ちょっとずつに分けて考える)です。)わくわくしますね。さぁ!みんなで「自己符号化器」を研究しましょう!!発展させれば「人工知能」もつくれるかもしれません。

そしてかえるの研究をされている皆さま。くれぐれもかえるにやさしくしてください。心よりお願いいたします。