新・日々の暮らしに疲れてない?

一人バンド、火頭工房

【Tensorflow.js】Tensorflowがjavascriptにやって来た。その2

前回のエントリーの続きですが、書いてすぐに例の素晴らしい動画主が新作をアップしてくれていて、ちょうど私がトライしたかった画像認識に通ずる「クラス分類」の導入を見ることが出来ました。

 

youtu.be

 

私がいくらドシロウトプログラマーだとして、さすがに適当な事ばかり書くのはよくないので、今回の動画から学んだことを記します。

 

まず以降でたくさん使うかも知れない「クラス分類」という言葉について。

↑英語でClassifierです、正確な日本語は知らん

 

例えば画像認識で「これは80%の確率で犬です」とか「これは98%の確率で猫です」と、こういうものがクラス分類です。で、どのようにTensorflow.jsが正解率を上げて行くかというと、大量の学習データが必要なわけです。

 

上の動画では、色をランダムにサイトに表示させ、ユーザーが「これは赤っぽい」とか「緑っぽい」とか選ぶように、協力を呼びかけています。

 

ユーザーがそのサイトに行って、ポチポチと色の判断をしていくわけですが、表示される色は赤、緑、青の度合い(0~255の数字)によって表現されていますので、赤さ、緑さ、青さの数値をデータベースに記録させていきます。

 

あとは表示された色が「赤っぽい」と感じたのか「緑っぽい」と感じたのか、答えとなる「ラベル」を記録。その他、イタズラを検知するための「ユーザーID」なども記録しています。

 

で、前回の私のエントリーと繋がるわけですが、ここでワンホット※です。

※[0,0,1] や[0,1,0]など1つだけ「1」があり、その他は「0」の形をいいます。

 

動画でワンホットは、答えとなる「ラベル」と合わせて登場します。

例えばユーザーが選べる答えが5種類しかないとして、

「赤っぽい」「青っぽい」「緑っぽい」「黒っぽい」「白っぽい」これがラベル。

上に習うなら、赤は [1, 0, 0, 0, 0] 黒は[0, 0, 0, 1, 0]という風にTensorflow.jsに学習してもらいたい、つまり答えを表す「ys」としてワンホットが登場します。

 

データベースにはラベルを「赤っぽい」「青っぽい」と記録しているわけですから、そのようなリストを作る。

 

const labelList = [

 '赤っぽい',

 '青っぽい',

............

]

 

んで、データベースからデータ引っ張ってきて、ユーザーが実際に選んだラベルが上のリストの何番目に当てはまるかループでも回して別のリストに記録していく。

 

var labels_users = [

 0,

 1,

 4,

 2

...

]

 

これでユーザーが選んだラベルの数値化が出来たので、これをワンホットにします。tf.oneHot() を使います。

引数にさきほどのリストとクラス分類の数(5色しか選べないなら5)を渡せば...

 

f:id:hiatama:20180705204404p:plain

 

まぁ何度かこんなんなりながらも...

labels_users で3だったものは、[0, 0, 0, 1, 0] このように表現されるはずです。

 

はぇ~、こうして ys を設定するべきだったのかぁ~なるほどよぉ~。

で、これでスマートに学習できるじゃん!行けそうじゃん!ってなるわけですが。

 

チョ、マテヨ。

ラベルの設定がスマートに行ったとして、結局tensorflow.jsが返してくれる答えは 

[0, 0, 0.88888888, 0,122222, 0] とこんな感じの、ようするにワンホットじゃあないわけです。

 

一番確率が高いものが分かったとして、それが何番目のインデックスで、それが答えのリストで何色を表していたのか、この辺はやっぱ自分で書くわけ?

 

で書いてると、ループ回しすぎてエラーが出て...

f:id:hiatama:20180704221619p:plain

こうなるわけです。

 

無事動作し、ラベルのお作法がわかったのは良いのですが、手間的には前回とあまり変わっていません。

 

というか、動画ではその辺を説明するのは次回以降なんですね。

あー待ち遠しい。

 

以上。

 

※当然、一番確率が高いインデックスを返してくれる関数がありました。

argMax()という関数です、めでたしめでたし。