2017年3月29日水曜日

TensorFlowによるCNNで植物画像を分類(続)

 前回のこのタイトルの記事、なにか具体性がありません。少しはデータを示したらどうなのだと言われそうなので、簡単に追記します。まず、TensorFlowで書いた7層のCNN(Convolutional Neural Network)に学習させた画像は、以下のものです。

 植物の葉の形態(たくさんありますが)を、ここでは5グループに限定して、それに属する写真を学習させました。下図のとおりです。

植物の葉の形態5グループの学習用写真(合計40枚)


 さて、数十秒で学習が終わったCNNに対して、学習時とは異なる以下の写真2枚を投入してみます。もちろん、こんなに甘くはないですこれは肝に銘じておきます)が、この2例に関してはうまく認識(分類)できました。

評価用写真2枚に対する認識(グループ識別)の結果

 まだまだ、未知の世界なのですが、学習時にも、評価時にも、使った写真の背景や明るさなどには何も手を加えていません。そのまま、学習させ、評価して、このような結果ですから、可能性を感じないわけには行きません。

 なお、この学習過程において、精度がどのように向上して行くか(誤差がどのように減少していくか)をグラフで示しておきます。これは、TensorFlowに付属のTensroboardで表示したものです。


 ここで誤解のないようにコメントして置きたいと思います。上図では、精度1.00すなわち、100%に達しています。しかし、これはどんな画像も間違いなく5グループに正確に分類できることを意味してはいません。あくまで、学習用の40枚の画像については、すべて正しく(5グループに)グループ分けできるCNNが完成したことを意味します。ですから、学習時とはちがう別の画像を持ってきた場合には、それがどのグループに属すかの判定が正しくできる保証はありません。しかし、どれかのグループの画像に何らかの類似点がある画像を持ってきた場合は、うまくグループ分類できる可能性が(かなりの程度)あるだろうということです。

2017年3月27日月曜日

TensorFlowによるCNNで植物画像を分類

 PythonでDeep Learningに取りかっています。最も有名な例題は、このブログでも取り上げてきましたが、MNIST(手書き数字)の認識です。しかし、そろそろ、既定の例題ではなく、自分に必要な独自の画像などの認識へ進みたいですね。また、TensorFlowも使います。

 そこで、今回、渡辺坦さんによる下記Webサイトにある植物画像の写真をお借りして、(その極く一部ですが)その自動認識(分類)を試行してみました。

渡辺坦氏作:植物の名前を探しやすいデジタル植物写真集
http://plantidentifier.ec-net.jp


TensorFlowで作ったCNNに、4種類の植物画像(合計40枚)を学習させる

 TensoroFlowで、CNNを構成しました。具体的には、「畳み込み層->プーリング層->畳み込み層->プーリング層->全結合層->全結合層->softmax層」の7層構成です。(上図のネットワークはその具体的なものではありません。イメージです。)
 渡辺坦さんのWebには多数の植物画像があるのですが、ここでは、試行段階のため、そのうちの4種類の葉の形状を識別することとし、図のように合計40枚を学習させました。この位だと、数十秒で学習は終わりました。

学習済みのCNNによる画像認識の例

 この学習済みCNNに対して、例えば、「葉の形状が松葉」のある画像を与えると、「松葉」と認識されました。

 まだまだ、初歩的な段階に過ぎませんが、またひとつ、可能性を感じることができました。

2017年3月25日土曜日

TensorFlowの学習結果を使ってAndroidで手書き数字認識

 Deep Learning関係で以前、以下の記事を書きました。

情報工学科ブログ記事:
ディープラーニング(人工知能)を小さく自作する
http://blog.cs.kanagawa-it.ac.jp/2016/09/blog-post.html

 そこでは、自作(といっても手引きにしたがって)Pythonで手書き数字認識の簡単なニューラルネットワークを構成しました。その学習処理は、デスクトップPCで行いますが、認識テスト時には、Android画面からの手書き画像をそのPCヘ送る、という、ちょっと、まどろっこしいことになっていました。それでも、オープンキャンパスなどでデモしてきました。

 今回は、ちょっと進化しました。(narative nights(株)三好康祐氏の資料に基づいています。)Google TensorFlowにある、MNIST for Expertsにしたがって、PC上でTensorFlowによる学習をさせ、その結果(結合辺の重みとバイアス値)をAndroidに取り込みます。Androidでは、その結果を使ってForward処理することで、リアルタイムに手書き数字判定(認識)をできるようになりました。つまり、デモなどで、手書き数字をAndroid画面に書いてもらい、直ちに、判定結果がでます。Android単独ででき、PCなどとの連携は必要ありません。これによって、さらに手軽に、Deep Learningのデモができるようになりました。

Android単体で、手書き数字認識する!
(TensorFlow MNIST for Expertsの学習結果を利用)

 TensorFlowのMNIST for Expertsでは、55,000件の手書き数字を学習させます。そのネットワークに対して、テスト用の別の10,000件の手書き数字を認識させたところ、99%を越える高い認識率が得られています。実際に、上図のように試してみると、その認識率の高さを実感できます。

 今回は、Android上のJavaプログラムでこの認識処理を行っていますが、Android上のTensorFlowもありますので、今後はそちらにも挑戦します。

2017年3月22日水曜日

マルチエージェントシステム NetLogo3D

 私は、アートはやっていないので、本格的な3Dグラフィックスは必要ありませんが、時として、(線画でもいいので)簡単な3Dのシミュレーションをしたい場合があります。特に、マルチエージェント指向においてです。幸い、NetLogoには、NetLogo3Dがあり、手軽に使えます。

 簡単な3D例題がシステムにも組み込まれています。例えば、下図のように、高さの異なる3つの山がある地形において、谷のある地点から、最も高い山に登るとします。そのための簡単な方針は、自分の近接8箇所(8パッチ)のうちで、自分よりも高いいずれかの方向へ行くことです。以下のようになります。
いつも近隣のより高い方向へ進んだ場合

 ある山頂に達しました。しかし、これは最も高い山ではありません。実は、最も高い山は左下の山です。基本方針は、自分の周囲のより高い方向を目指して進むのですが、ある低い確率で、逆に自分よりも低い方向を選択してみます。そうすると、時々、うまく、最高峰に達します。ここでの、3Dビジュアル化は、探索方針の理解や策略を練るのにとても有用な気がしてきます。

時には自分の位置よりも低い方向へも進むと、最高峰へ行ける場合がある
(いつも成功するわけではありません。)

2017年3月20日月曜日

CNN(Convolutional Neural Network)の仕組みを見る

 Deep Learningにおいて、畳み込みニューラルネットワークCNN(Convolutional Neural Network)は重要な地位を占めています。「畳み込み」は、古くから画像認識などで使われているようです。これをNeural Networkに組み込むことで、その威力をさらに発揮するようです。CNNについては、各種の解説記事やビデオ(Youtubeなど)もありますので、それで学ぶことができると思います。

 ここでは、Deep Learningの技術書として名高い下記の書籍の第7章「畳み込みニューラルネットワーク」に使われているPythonプログラムの構造を理解するために、それを図示してみました。もしも、この書籍で勉強している方がおられたら、ご参考にして戴けるかも知れないので...(下図はダブルクリックして拡大してご覧下さい。)

最も簡単と言われるCNNの7層構造

【参考文献】
斎藤康毅著:ゼロから作るDeep Learning - Pythonで学ぶディープラーニングの理論と実装、オライリージャパン、2016

2017年3月8日水曜日

多クラスロジスティック回帰の可視化

 Deep Learningの最も基本的なところをやります。その一つは、多クラスロジスティック回帰と呼ばれるものです。ニューラルネットワークとしては、最も単純な、中間層のない、入力層と出力層からなりますが、学習用の何種類かの画像の組を与えて、学習させます。それらとは別のテスト用の画像を与えて、学習時の画像のどれに最も近いかを推定できるものです。

 下記参考文献に基づきやってみました。ただし、ここでは、新たに可視化を重点に置きました。すなわち、学習がどのように進むのかを、入力層と出力層のノード間の重みをビジュアルに見られるようにしてみました。

 入力パタンデータは、以下の4種類です。10x10のビット列で表現します。

学習用パタンデータ4種(10x10のサイズ

 つまり、入力層のノード数は100個(10x10)です。"1"か"2"か"3"か"4"かを以下で推定するのですから、出力層のノード数は4個にします。初期状態では、全結合辺に対して、小さな重みを乱数で与えます。また、左下方にあるバイアスの辺の重みは0.0として出発します。

入力層100ノード、出力層4ノードのパーセプトロンの初期状態

 学習を進めます。すなわち、ここでは、「標準デルタ則」によって、重みを少しづつ更新し、出力ノードの出力の正解(教師信号)との差をできるだけ小さくして行きます。以下の図は、まだ学習回数2回目ですが、早くも、辺の重みが良い方向に向かって更新されているようです。(辺の青、赤は、それぞれ、重みの値の正負を表します。また、重みの値の絶対値の大きさを辺の太さで表現しています。)

学習2回目の状態

 さらに、学習回数= 1,000まで進めた結果は以下のとおりです。重みがかなりはっきりしてきました。これ以上学習回数を増やすと、徐々にさらに良い方向に行くようですが、ここで止めます。

学習回数1,000回目の状態

 学習が一応済んだ段階で、今度は、学習時に与えたパタンデータとは少し異なる以下のパタンを与えて、その認識の度合いを調べます。

認識テスト用のパタンデータ
下図は、その結果です。学習回数1,000回での結構良い認識結果ですが、10,000回に増やすとさらに認識の程度は上がることがわかります。

テストパタンの認識結果

 以上は、Deep Learningの入り口に過ぎませんが、その可能性を具体的に知る、見ることになると思います。

【参考文献】
深井裕二「Java人工知能プログラミング」、三恵社、2016

2017年3月1日水曜日

あらためて驚きました3:Google Translate

 Google Translate(グーグル翻訳)の素晴らしさについて以前書きました。また、その根幹となっている人工知能を改善するために、人手翻訳との比較や人手検証も重要な地位を占めているらしいことも書きました。以下の記事です。

 その「人手による翻訳と検証」は、ボランティアで多くの人々が貢献できるような仕組みになっています。私自身も、それに共感してボチボチやっていました。だいぶ貯まったようです。このほど、Google Translate Communityから感謝状(デジタル)が届きました。「Thanks!あなたは上位5%にあたる貢献件数を達成しました。」というものでした。


Google Translate Communityから届いたデジタル感謝状

 具体的な「貢献内容」は4種類あります。何れも短い文章や単語についてです。人手で翻訳する(英語<->日本語)、機械翻訳(Google Translateの結果)の妥当性を〇×で評価する(英語<->日本語)。皆さんも、英語の勉強をかねてやってみてはいかがでしょうか。

2017年2月24日金曜日

卒研のレベルを高める手がかり(その3)

 複数のスマートフォン(Androidなど)やPCの間でデータを共有したい場面は非常に多いです。卒研でもそうでしょう。そのための具体的な方法はいくつかありますが、その中でも、key-value型のデータベースを使うためのTinyWebDBがあり、非常に便利で高性能です。これは、MIT App Inventor for Androidに備わっています。最近では、その仲間のThunkableやAppyBuiledrでももちろん使えます。

 従来のTinyWebDBは、下図のとおり、クラウド(Google App Engineなど)の上のPythonで作られていました。手軽に使えて非常に良いのですが、場合によっては、いつもクラウドへアクセスするのではなく、ローカルネットワーク(LAN)の中でそれを使いたいことも多いです。例えば、研究室内でデモする場合など、Androidアプリケーションは変更せずに、TinyWebDBのサーバアドレスだけ変更して、それができればいいですね。

ローカルネットでもTinyWebDBをつかう!

 それを実現するためのPHPプログラムを作った人がいて、早速それを利用させていただきました。上図のように、1台のAndroidでWebサーバを動かします。その際、PHPも使える必要があります。このWebサーバに、このPHPプログラム(TinyWebDB)を格納すればよいのです。Android用のWebサーバプログラム(PHP付き)は、Googleプレイに有料、無料のものが多数ありますので、それを利用できます。

 ところで、このTinyWebBDですが、"Web"の付かないTinyDBというのも、同じ構造ですが、(ネットワークを使わない)Android単体内部では使えます。これも必要に応じて使えます。Key-Value型(Tag-Value型ということもある)は、単純ですが、以下のように、Valueとしてリストも使えます。それによって、TinyDBの中に構造を持たせることができます。それによりさらに用途が広がります。

Key-Value型だが、Valueをリストにすることで構造を持たせることも可能

2017年2月22日水曜日

卒研のレベルを高める手がかり:Multi-level Models In NetLogo 6(その2)

先の記事で、NetLogo 6のMulti-Levelモデリングについて書きました。
http://sparse-dense.blogspot.jp/2017/02/multi-level-models-in-netlogo-6.html

これまでは、それぞれ2つの独立したmodel(NetLogoプログラム)であったものを、有機的、階層的に連結して、そられをマルチスレッドで同時実行させるものでした。さらに、注目すべき、下記の短い論文に出会いました。

[文献1]Arthur Hjorth, et al.: LevelSpace: Constructing Models and
Explanations across Levels, Proc. of the Constructionism 2016, pp.362-363, 2016.

その中にある図を引用させていただきます。
NetLogoの3つのmodelの連携([文献1]より引用、説明加筆)

2ページの論文なので、各modelの詳細は書かれていませんが、すばらしいアイディアであることはすぐに分かりました。以下のような内容です。model-1とmodel-3のソースコードは公開されていますが、model-2(ニューラルネットワーク)の詳細は書かれていませんので、これを自分で設計、実装すれば理解が深まり、実力がつくでしょう。

◎ model-1のみ:狼と羊の個体数のダイナミクス
羊は草を食べ、狼は羊を食べる。羊も狼も一定のエネルギーを得るとある確率で子を増やす。また、ある条件で死ぬ。草もある確率で再生する。この単独モデルでは、これらの確率は乱数で決めていた。

◎ mode-3を追加:温室効果ガスによる気温変動
このモデルを使って、model-1での草の再生の具合を、環境変動(気温変化)に依存させる。

◎ model-2を追加:ニューラルネットワーク
このモデルを、狼の(羊にも適用できるが)脳の働きを簡単に模倣するのに使用する。すなわち、model-1単独の場合は、狼の進むべき方向は乱数で決めていたが、各狼にそれぞれ簡単なニューラルネットワークを割り当てることで、環境(近隣の羊や草の情報)に応じて進む方向を決める。つまり、狼に頭脳を与える。ニューラルネットワークの辺の重みは子に継承させるが、子は、次第に僅かにそれらの重みを変えることで、より環境に適応できるだろう。

メインのmode-1に、上記の2つのモデルmodel-2, model-3を連結させて、それらをマルチスレッドで同時に動かす。これによって、よりリアリティのあるシミュレーションとなっていくだろう。

2017年2月16日木曜日

来た!Java TensorFlow!

 Googleの著名な人工知能開発環境(ライブラリ)TensorFlowが、昨日(2017-2-15)正式版Version1となりました。

 今まではベータ版だったのですね。その際に、特に注目されたのが、Java APIが公開されたこと。ただし、Javaの場合は安定性の保証がない実験的実装となっていますが。これまでは、主にPythonでした。Pythonは非常に使いやすいのではありますが、学生諸君が(私もですが)また、新たにPython言語を覚えないといけないので、ちょっとしんどい。でも、もちろんやる気でここまできてはいました。

 ここへ来てJavaでTensorFlowが使えるとなれば、これは私にとっては一大事。取組み戦略も変えないといけないくらいの出来事です。すぐに、そのTensorFlow Java APIを使う例題を動かすことにしました。多少トラブルがあったものの、Mac Power Bookで動かして、感触を掴むことができました。

 その例題は、(どれだけの画像を学習させたは不明ですが)とにかく、与えられた画像を1,000種に分類するものです。つまり、与えた画像に映っているものが、1,000種類のもののうち、どれに一番近いかを判定します。下図が実行結果例です。

上段:ニューラルネットワークの画像→判定はcrane(鶴)。そうも見えます。
下段:ICカードリーダーの写真:→判定はmouse。そうも見えます。


 このJava例題は、学習済みのCNN(畳込みニューラルネットワーク)を使って、何でも与えられた写真(画像)を判定するものです。比較的簡単な例題として作られたものなので、それほど高性能ではありませんが、今後Javaでやるための糸口を得られたことが大きい。もちろん、今後、学習するためのCNN自体も、このTensorFlow Java APIで作ります。