これまで、TensorFlowでUnlimited Handのセンサー値を学習させて、Gesture Detectを試みてきましたが、一旦これまでの結果と過程で分かったことを整理しようと思います。

結果

Gesture Detectできずでした。
詳しい状況は以下のようになっています。
  • 指を動かしても、推論結果として間違った値が返却される
  • 学習結果によっては、毎回同じ推論結果が返却される

分かったこと

結論しては学習結果が収束していないようでした。
以下の学習データ同士でlossの推移をTensorBoardで比較すると、lossの推移に特徴が見られました。
教師データ毎の学習データが
5000件ずつの合計160000件
教師データ毎の学習データが
5000件以上の合計160000件以上
ただし、各教師データ毎の学習データ数は一致しない

見た限り、160,000件のデータでは収束できなかったけど、それを超えるデータ数が存在すれば収束するように見えてデータ数を増加させたくなりますが、160,000件のデータを超えた後、少しずつ特定の教師データ向けの学習データがなくなっていきます。その状態で学習を継続すると学習した数の多い教師データに収束し始め、急激にlossの減少が発生していると思われます。
試しに同じ学習データから抜粋して、各教師データ向けの学習データ1000件、ただし1教師データのみ2,400件程度用意して、合計33,400件程度で学習したときのlossの推移は以下のようになりました。
32,000件を超えたところから、急激にlossが減少しているのが分かります。上記の点から学習が収束していない未学習状態であると思われます。現状の学習の進捗から単純計算すると、800,000件近くのデータがあればlossが0に収束すると思われます。
ただし、Android - Unlimited Handでは、大体10回/秒しかセンサーの値を読み取れなかったので、データ取得だけでも80,000秒(22時間超) はかかりそうです。

言い訳・・・orz

今回、このセンサー値を学習させてGesture Detectを試みるにあたり、以下の点が気になりました。
  • Bluetooth経由だと、Unlimited HandからAndroidへのセンサー値の受け渡しが10回/秒ぐらいまでしかできなかった
  • 教師データ数に対してデータ量が少ない
  • 教師データ数1回の学習で使用するデータ量備考
    MNIST10(0~9までの数字)28×28×4(1Pixel毎の濃さを格納するfloatサイズ) = 784×4 = 3,136-
    Gesture Detect2^5(指の本数) = 328(Photo-Reflectorの数)×4(Photo-Reflectorから値を格納するfloatサイズ) = 32-
    Gesture Detect(拡張){8(Photo-Reflectorの数)+3(Unlimited HandのXYZ軸からの回転角度)+1(環境光の明るさ)}×4(センサー値を格納するfloatサイズ) = 48デバイス角度、環境光を追加
    MNISTは10種類の教師データに対して3,316バイトのデータをそれぞれ渡していたのに対して、Gesture Detectは教師データが32種類とMNISTの3倍あるのに対して拡張しても48バイトと1/70程度のデータ量しか渡せていないです。このデータ量の違いにより同じような値だけど、別の教師データといった状態が発生してしまい、うまく収束できなかったのでは?。
  • Unlimited Handのつけ方次第でPhoto-Reflectorからの値が変わる
  • Unlimited Handのゲルパッドが弱くなってきて、動作中にずれるため、Photo-Reflectorからの値自体が収束しない
  • Photo-Reflectorの1つが常に0を返却してくる => 故障かも・・・
    ↑2017.06.28追記 初期不良とのことでした。

今後の施策(実施時期は未定)

  • 学習データ数を増やす
  • 先に記載したように、この条件だと800,000件近くの学習データが必要になるので、少しずつデータを増やしていく
  • 学習範囲を絞る
  • これまでは、肘を机に固定した状態で、腕・手首を自由に動かしていましたが、腕・手首の角度も固定させた上で学習させたら推論が向上するか否か確認する

今回の投稿で一旦Unlimited Handの調査は終了となります。時間が取れれば、上記の点は試してみたいです。

コメントの投稿