2016年4月8日金曜日

RFIDでディープラーニング その2

前回の投稿ではあまりよい結果が出ませんでしたが、まー、いろいろ端折ってやったしー、みたいなところがあったので、もう少しましな結果が出るように試してみました。

前回ミスったと思われるところは、

・トレーニングのバッチ内のデータが全部 [1.0, 0.0] か [0.0, 1.0] のどちらかに揃っていて、バラバラに入り混じった状態でトレーニングしていない。
・トレーニング数が少ない。

他にも

・学習発散を抑えるために勾配降下のステップ長を学習の進み具合で変化させる。
・ドロップアウト率を学習の進み具合で変化させる。

のようなのもありますがひとまず上側の2つをやってみました。

コードは前回と違うところだけ。データ読み込みの関数を変更。読み込んでリストを返すだけにしました。
※前回同様モバイルでご覧の方はコードが表示されません。すいません。すいません。

で、データの読み込みと学習を実施。


学習が終わったら実際にタグが止まっている状態のデータを受信すると...

[ 0.91049373  0.08950625]

キタ―!止まってると認識してますね。

さらにタグを動かしてみます...

[ 0.85994738  0.14005256]
[ 0.78625971  0.21374026]
[ 0.73439723  0.2656028 ]
[ 0.71011215  0.28988785]
[ 0.65806454  0.34193543]
[ 0.27353901  0.72646099]
[ 0.01137005  0.98862994]

※データは見やすいように間引きしています。
おー、徐々に動いてる状態へと変化していきます。すごーい。MNISTのチュートリアルでも十分な精度が出ますねー。
これで何とか足がかりがついた感じです。実際の環境にどれだけ耐えられるかはまだまだ検証が必要ですけどね。



2016年4月1日金曜日

RFIDでディープラーニング その1

RFIDを使ったシステムの特徴の1つはデータがしこたま溜まるということですね。リーダが読み続ける限りアンテナの近くにあるタグは読まれ続け、データが通知され続けるわけです。

となると、

RFID → データいっぱい → ビッグデータ! → ディープラーニング!!

というのはきっと自然の流れですよね。たぶん。

そんなわけでRFIDリーダから得られたデータを使ってディープラーニングにトライしてみました。

リーダから得られるデータですが、基本的にはタグのIDとRSSI値と呼ばれる電波強度が得られます。このRSSI値に注目してやってみました。

ディープラーニングはいろんなツールが出ていますが何となくで Google の TensorFlow を使います。

チュートリアルが単純な順伝搬型のMNISTからはじまって、次がCNNを使ったディープMNISTと進んでいるのでまずはこれを参考にしてみます。

MNISTは手書きの数字の画像を対象としているのですが、こっちはRSSIしかない1次元ですのであんまりしっくりこないですが自然言語処理でも使われてるようなので気にしないでやってみます。

何を学習させるかですが、RSSIのみでとりあえずタグが動いているのか止まっているのかを判別させたいと思います。簡単そうに見えますが、これの難しいところはタグが止まっていても周囲の環境(人が通ったとか)でRSSIもぐぐっと変わるところです。このRSSIの変化をタグが動いているのか周辺のせいなのかを判別させたいとそういうことです。

で、RSSIは連続して得られますので、「過去32個のRSSIの値をみて動いているか止まっているか判別させる」という風にします。

学習用に大量のデータが必要になりますのでデータを溜めます。アンテナの上にタグを吊るしておきます。

止まった状態でデータを採り続ける

扇風機でタグを動かし続けてデータを採り続ける

これでそれぞれ10000個ほどのデータが採れました。

ここから TensorFlow を使ったコード。まずはパラメータの設定とか各処理の関数。関数の部分はチュートリアルとほぼ一緒です。データが1次元なのでプーリングのマトリクスを1×2の1次元にしています。
※モバイルでご覧の方はコードが表示されません。すいません。


そしてモデルの作成と初期化。モデルはチュートリアルと同じで畳み込み+プーリングの2層になっています。


続いて先ほど溜めこんだRSSIのデータファイルからデータを読み込んで学習する関数。


リーダからデータを受信しながら評価する関数。トレーニングのバッチサイズを128にしたので評価時も128個必要なんですが面倒なのでRSSIが32個溜まったらそれをコピーして突っ込んでます。


で、実際に実行します。止まっているときの教師データは [1.0, 0.0] にして、動いているときの教師データは [0.0, 1.0] にして学習させます。


結果
学習後にタグが止まった状態で評価してみると、

[  3.66762222e-04   9.99633193e-01] 

うはー!、ほとんど動いてると思ってますねー(笑 どうも過学習が強いようです。いろいろパラメータ変えてみても、

[ 0.36865199  0.63134807]

とちょっとはましですがどうもというところですね。しかしこの状態でタグを動かすと、0.63 が 0.67 くらいまで上がったりします。より動いてるのでは?という判断はしているようです。ここの判断が大きく値として現れるフィルタが必要なんですかね。

今回はここまで。やはりRNNまで進まないとダメでしょうか。先は長そうです。