ラベル TensorFlow の投稿を表示しています。 すべての投稿を表示
ラベル TensorFlow の投稿を表示しています。 すべての投稿を表示

2021年2月12日金曜日

新型M1 Mac miniに期待

【what is this】これまでのIntelプロセッサに替わり、Apple独自のM1(arm64)プロセッサ搭載のMacが発売になっています。Appleシリコン搭載とも呼ばれています。何といっても、「8コアCPU+ 8コアGPU+16コアNeural Engine」と言われると、長年のMacファンとして買わざるを得ませんでした。基本的なソフトウェアのネイティブ本格対応はこれからのようですが、現時点でも、手元の例題で、Intel版に対して、Javaアプリで3.2倍、Pythonアプリで2.5倍高速となりました。今後の、M1向けTensorflow(アルファ版はすでに公開)などが楽しみです。

雑然とした「研究室」に置かれた新型M1 Mac mini
(別のMacからリモートで利用のためモニターに接続されていません)

■Javaアプリで試す
 小生の使う開発言語は、Java、Python、NetLogo、MIT App Inventorなどです。まず、Javaのアプリで確認します。Androidアプリで扱ったHamilton閉路問題のうち、サイズを少し大きくした、Groetzschグラフ(11ノード)を例題とします。最も原始的な解法なのですが、10ノード(出発は第0番ノードに固定するので)の順列(約360万個)を全て調べるものです。もちろん、可能な限り早期に適合しないパスは棄却します。図1に示すような、Hamilton閉路20個を全て答えます。



 このJavaプログラムの主要部(というよりも全体制御部)は、図2のとおりです。並列ストリームを使っています。実行の結果、M1 MacはIntel Macよりも、約3.2倍高速でした。素晴らしい!PC買い換えで3倍超の性能アップは、なかなかないです。



■Pythonアプリで試す
 次にPythonアプリです。例題としては、すでに報告しました、ショットガン法によるDNAの復元問題(トイプログラム)です。Deep Learningでのprediction部分です。ここでは、上記Javaのようなparallel機能は特に意識せず、GPUの使用もありません。ですが、CPUのコア数の違いが、図3のとおり、実行性能に現れています。この例でも、M1 MacはIntel Macよりも2.5倍高速でした。


 このグラフ、緑はユーザプロセス、赤はシステムプロセスのはずです。M1 Macでは、8コアの利用率が、計算時に100%近くに達しています。それは良いのですが、システムの割合が大きいことがちょと気になります。Interl MacはPython3.8で、M1 Macは(最適化された)Python3.9です。もしかすると、ユーザプログラムの実行時にPython3.9のある部分がシステムプロセス扱いになっているのかも知れない。

■今後の期待:M1用に最適化されたTensorflow等
 以上、現時点で試せるJavaとPythonの例題をM1 Mac miniで実行してみました。従来よりも2.5倍〜3.2倍の高速化となったことは素晴らしいと思います。現時点ですでに、GPUやNeural Engineを駆使するであろうTensorflowのアルファ版は公開されています。今後、それも利用していけば、Deep Learningを手元のマシンで実現できる場面が広がりそうです。



2019年7月13日土曜日

Real-time image recognition demonstration on a smartphone using TensorFlow.js

There are many examples of image recognition (especially classification) by AI, but the "Google AI Experiments" introduced here seems to be further evolved. It was announced at TensorFlow Dev Summit 2019. Do you already know? This Summit's  38 lecture videos are available on youtube:

https://www.youtube.com/watch?v=GRMvCeIKvps

I tried the demo called "Teachable Machine" among them. As shown in Figure 1, the smartphone classifies images into three types. The Javascript version of Tensorflow runs under the web browser. A local Neural Network in the smartphone performs image training and evaluation without sending the image to the server. Of course, as long as this demo is used, no coding is required at all.


Here, we prepare three types of images of a hat, i.e. "back", "side", and "front", as shown in Figure 2, about 10 images each. Is it all right with such a small number of images? You may think that "transfer learning" is working there. In other words, this Teachable Machine should be using a Neural Network, which has been trained with a huge amount of images for a certain purpose.


Let's train this as shown in Figure 3. That is, press the corresponding button (train button) at the bottom to label each image. Each time, the image is trained in real time. For each of the three types, 10 images should be trained. After that, if you take a picture of the hat with either the back, side, or front, the orientation of the hat will be immediately determined. Actually, as you can see, everything was accurately identifiable! 100% confidence!


Next, try shooting with the hat in an ambiguous direction, not exactly on the back, side, nor front. As human beings feel, the result seems that Neural Network can not judge with certainty. It was a judgment that "maybe a side (59% confidence)". This is another good point.


● The university's graduation research is becoming increasingly severe. Even if you work hard to code and create an AI application, it seems that it is difficult to go beyond applications that can easily be made with no coding like this example. But on the other hand, the Teachable Machine demo app is just a demo. Kindly, the source list is also published. It's great if you can use this to solve your own problems. The level of graduation study goes up by this.

● This trial was carried out with smartphone Pixel3a (Android OS 9). Of course, it is also possible to use a PC or Mac, but the point is that you can train and evaluate in real time on your smartphone. Note that this demo will not work on iPhone and iPad.

2019年5月1日水曜日

Scratch風の開発環境でTensorFlowを利用できる

 自分のPCに環境設定せずにTensorFlowを使いたいのならば、Google Colabですね。Gmailアカウントがあれば、Googleサーバ側のGPUだって指定して学習させられます。しかし、もっと別のものもあります。それが、Snap!([1]、[2])です。

 Snap!は、Scratch風のブロック型プログラミング環境ですが、ちょっと高級です。ラムダ式(高階関数)も使いますし、TensorFlowを使うためのブロックもあるからです。Google Colabと違って、アカウント開設も、環境設定も不要であり、ローカルマシンで学習を実行させます。そのため、GPU無しのマシンだとちょっと苦しい場合があるかも知れません。小規模な試行ならば問題ないですが。

 早速ですが、Snap!の資料[2]には、以下のような例題が含まれています。

(1)簡単なデモ:乱数(実数値)に対する平方根の学習と予測
An small example: Training a model to estimate square roots
(2)Tic Tac Toe(3目並べ)ゲーム戦略:D. Knuthは1958年に機械学習を作成
Learning to win at Tic Tac Toe
(3)実用アプリ:気候データからインフルエンザの流行の度合いを予測
Applying machine learning to real-world data

 このうち、ここでは、(1)の平方根の例題を取り上げます。元の例題のソースリスト(ブロック図)を少し変更したものを使って、どんなことができるかを、説明したいと思います。最初に、図1をご覧下さい。Snap!でのDeep Learningの画面です。Scratchと同様に、(a)に置かれた種々のブロックを、編集領域(b)で組み合わせてプログラムを作ります。(c)には、メッセージや学習結果、予測結果などを表示できます。なお、(d)は、Snap!とは直接関係ありませんが、Mac Book Pro (4コア、8ハイパースレッドだがGPUは無し)での学習実行の負荷状況です。


 平方根の学習のために、入力データ(0〜50までの実数値乱数を800個)と、その入力データに対する正解ラベル(関数srtの計算値)を用意します。図2において、関数sqrの引数が空白みたいになっていますが、これが、ラムダ式(高階関数)を使っているところです。これだけも、Snap!がScratchよりも高レベル(やや高い難易度)であることを臭わせます。


 次に、この入力を使った学習を行うための、ニューラルネットワークを構成します。そのためのブロックが用意されているのです。(現時点では、dense networkに限られているようですが)ニューラルネットワークを作るための、ハイパーパラメータ(層の数と各層のノード数、最適化の手法、誤差関数の種類など)を決めます。ここでは、(a)隠れ層が3層の場合と、(b)隠れ層が1層の場合の2つを、図3のように設定しました。赤色背景のlistの右側に並んでいる数値は、各層のノード数です。これらのハイパーパラメータの値は、通常、過去の試行経験などに基づいて決めらます。


 この後は、図4のように、学習を制御するブロックを設定します。ここでも、学習をどの程度長く行うかの反復回数や、学習係数、それと、学習時のテストのために使う入力データの割合(入力データ全体に対する比率)などのパラメータの値を決めます。そして、このブロックをマウスでクリックすると学習が開始されます。一般には、学習は長時間を要しますが、ここでは、短時間で済むようにパラメータを設定してあります。


 学習が終わった後に、入力データとは別に、評価用実数値を与えて、その出力結果を観察します。図5のとおり、4つの評価用データ(0.09, 9, 25, 49)を使います。これらに対する正解の平方根は(0.03, 3.0, 5.0, 7.0)です。図5では、図3で用意した2種類のニューラルネットワークが出力した結果を示しています。隠れ層が多い(a)が、少ない(b)よりもかなり良好な(ただし、0の近傍では良くない)結果を与えていることが分かります。このような層の深さに関しての性能傾向は一般的なことと思います。


 さて、ここまでやってみると、TensorFlowを知っている人は、Snap!ではTensorFlowをベースにしているのはないかと感じると思います。そのとおりのようです。実際、Snap!には、Open support panelと言うブロックを持っていて、これを使うとtensorflow.js(JavaScript版のTensorFlow)による学習状況などを観察できます。図6にその一例を示します。


 以上は、簡単なデモプログラムにすぎませんが、定番となっている「PythonでTensorFlow」とはちょっと違う観点を与えてくれる、Snap!の魅力を垣間見ることができたように思います。冒頭で示したとおり、Snap!の解説[2]には、より実用的なアプリの例題(インフルエンザ流行の予測)等もあり、生データを入力データへ加工することも含めたブロック図も示されています。また、当然ながら、画像や音も扱えます。今後これらについても調べて行きます。

 児童、生徒にもAI(人工知能)教育を。これは、小学校での英語、プログラミングの必修化に沿った流れのようです。ScratchやML4K(Machine Learning for Kids)はそのための具体的な環境です。そこでは、学習させる画像や音、テキストを自分自身で収集して学習させ(Neural Networkそのものには触れませんが)、未知のものに対する分類や予測を体験できます。

 今回のSnap!は、もう一歩深入りして、Neural Networkを具体的に構成し(ハイパーパラメータを自分で指定して)、その動作も観測(誤差の低減確認)するところまで進めています。したがって、これは、大学でのコンピュータサイエンス教育にも適していると考えられて、例えば、米国UCバークレイ校ではSnap!をベースにしたカリキュラム(苦痛ではなく、楽しみながら美しいと感じてもらえることを目指しているような)The beauty and joy of computing [3] も公開しています。

参考文献
[1] UCバークレイのSnap!サイト:https://snap.berkeley.edu
[2] Ken Kahn, A guide to building AI apps and artefacts:
https://ecraft2learn.github.io/ai/AI-Teacher-Guide/chapter-6.html
[3] The beauty and joy of computing, https://bjc.edc.org/bjc-r/course/bjc4nyc.html