2016年4月8日金曜日

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

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

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

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

他にも

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

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

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

# ファイルからデータ読込
def fromFile(file_name, y__):
  rssi = np.zeros([1, X_DATA_SIZE])
  count = 0
  rssilist = open(file_name, 'r')
  for rssivalue in rssilist:
    rssi = np.roll(rssi, 1)
    rssi[0, 0] = float(rssivalue) / 60000.
    count += 1
    if count == X_DATA_SIZE:
      x_list = rssi
      y_list = y__
    if count > X_DATA_SIZE:
      x_list = np.vstack((x_list, rssi))
      y_list = np.vstack((y_list, y__))
  rssilist.close()
  return x_list, y_list
で、データの読み込みと学習を実施。

data_num = 0

# 動いてないときのデータを読み込み
print 'no move phase read'
lists = fromFile('nomove.dat', np.array([[1., 0.]]))

x_all = lists[0]
y_all = lists[1]

# 動いているときのデータを読み込み
print 'move phase read'
lists = fromFile('move.dat', np.array([[0., 1.]]))

x_all = np.vstack((x_all, lists[0]))
y_all = np.vstack((y_all, lists[1]))

print 'total data:' + str(x_all.shape[0])
data_num = x_all.shape[0]

start = 0
for i in range(10000):
  if start + BATCH_SIZE > data_num:
    start = 0
  if start == 0:
    # データをシャッフル
    perm = np.arange(data_num)
    np.random.shuffle(perm)
    x_all = x_all[perm]
    y_all = y_all[perm]
  sess.run(train_step, feed_dict={x: x_all[start:start + BATCH_SIZE], y_: y_all[start:start + BATCH_SIZE], keep_prob: 0.5})
  if i%500 == 0:
    # 正確性と交差エントロピーを表示
    print sess.run(accuracy, feed_dict={x: x_all[start:start + BATCH_SIZE], y_: y_all[start:start + BATCH_SIZE], keep_prob: 1.0})
    print sess.run(cross_entropy, feed_dict={x: x_all[start:start + BATCH_SIZE], y_: y_all[start:start + BATCH_SIZE], keep_prob: 1.0})

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

[ 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のチュートリアルでも十分な精度が出ますねー。
これで何とか足がかりがついた感じです。実際の環境にどれだけ耐えられるかはまだまだ検証が必要ですけどね。



1 件のコメント: