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の結果)の妥当性を〇×で評価する(英語<->日本語)。皆さんも、英語の勉強をかねてやってみてはいかがでしょうか。