Author Archives: t.m

2017-11-09

機械学習入門者がKerasでマルチレイヤーパーセプトロンのサンプルを読む

こんにちは。
GMOアドマーケティング、機械学習入門者のT.Mです。

はじめに

ゼロから作るDeep Learningを読み終え、
実際に何か作るにあたって何をしたらよいか調べていたところ
ニューラルネットワークのライブラリであるKerasを知り触ってみました。
いきなりKerasのサンプルソースを見てもさっぱり分からなかったので、
ゼロから作るDeep Learningで学習した内容とKerasドキュメントを参照しながら
見ていきたいと思います。

Kerasについて

Kerasについては公式ドキュメントを参照ください。
TensorFlow上で動く、ニューラルネットワークをより簡単に書けるようにした
ライブラリという認識です。

サンプルソース

Keras公式のサンプルソースから、
ゼロから作るDeep Learningでも5章までガッツリと書かれていたMLP(マルチレイヤーパーセプトロン)のサンプルを見ていきます。

サンプルソースを読む

サンプルソースから引用しながら見ていきます。
Kerasのライセンス表記です。

Copyright (c) 2015, François Chollet.
Copyright (c) 2015, Google, Inc.
Copyright (c) 2017, Microsoft, Inc.
Copyright (c) 2015 – 2017, the respective contributors.
Released under the MIT license
https://github.com/fchollet/keras/blob/master/LICENSE

最初の部分ですが、MNISTのデータをロードし、ニューラルネットワークに取り込めるようにデータを変換しています。

どのようなニューラルネットワークなのかを定義しています。
Sequentialモデルはニューラルネットワークの各層を順番につなげたモデルを表します。
add()で層を追加していきます。
https://keras.io/ja/getting-started/sequential-model-guide/

最初の層として追加しています。
どんな層かというと、Dense()で定義されています。
このDenseは、全結合ニューラルネットワークになります。
この1行だけで1つのニューラルネットワークを表しています。
https://keras.io/ja/layers/core/#dense
Kerasのソースの方にも、
https://github.com/fchollet/keras/blob/master/keras/layers/core.py#L729
Just your regular densely-connected NN layer.
とあり、
Dense implements the operation:
output = activation(dot(input, kernel) + bias)
と、ゼロから作るDeep Learningにも出てきたA・W+Bというニューラルネットワークになります。

このDenseの引数を見ると、下記の通りになっています。

  • units・・・出力の数
  • activation・・・活性化関数。reluを指定しています。
    https://keras.io/ja/activations/#relu
    活性化関数については、この記事も参照ください。
  • input_shape・・・最初の層のときにだけ指定します。入力層の形を指定します。MNISTで扱う28×28=784のデータのことを表しています。

ドロップアウトの層になります。
ドロップアウトは、ゼロから作るDeep Learningの6章にも出てきました。
過学習を避けるために出力結果を間引くようになります。
引数はレートを指定します。

第2層目のニューラルネットワークです。
出力の次元数は512、活性化関数は前回と同じくreluです。

またドロップアウトを指定しています。

最後に出力層として、次元数10(0〜9の数字なので)、活性化関数はSoftmaxを指定しています。
ここまでがSequentialモデルで定義したニューラルネットワークになります。

次に、compileメソッドは訓練の定義をします。
https://keras.io/ja/models/sequential/#compile

  • loss・・・損失関数を指定します。ここでは、categorical_crossentropyが指定されています。
    MNISTのような多クラス分類では、categorical_crossentropyを使用します。
  • optimizer・・・最適化アルゴリズムを指定します。RMSpropを指定しています。
    https://keras.io/ja/optimizers/#rmsprop
    ゼロから作るDeep Learningには出てこない最適化アルゴリズムです。
    書籍で出てきた内容としては、SGD、Adagrad、Adamがあります。
  • metrics・・・評価関数を指定します。通常はmetrics=[‘accuracy’]を指定するとのこと。
    https://keras.io/ja/metrics/

fitは、ニューラルネットワークの訓練を行います。
https://keras.io/ja/models/sequential/#fit

  • 第1引数、第2引数・・・入力データとなります。
  • batch_size・・・バッチサイズを指定します。
  • epochs・・・訓練を行う回数を指定します。
  • verbose・・・指定する数値により実行ログの出す内容が変わります。
  • validation_data・・・評価用のデータを指定します。
  • 戻り値・・・訓練の損失値と評価関数値が返ってきます。

evaluateは、損失値を計算します。
https://keras.io/ja/models/sequential/#evaluate

  • 第1引数、第2引数・・・評価用の入力データを指定します。
  • verbose・・・進行状況の表示を指定します。0は出しません。
  • 戻り値・・・テストデータの損失値を返します。

まとめ

いかがだったでしょうか?
最初はどこから手を付けたらよいか分かりませんでしたが、
ゼロから作るDeep Learningで学習した知識をベースに
Kerasのドキュメントを参照することでほんの少し読めるようになったと思います。
次は自分でニューラルネットワークを作っていきたいです。

2016-06-23

AndroidアプリとGPSとFirebaseで帰宅を知らせる

こんにちは。GMOアドマーケティングのT.Mです。
会社から帰宅するときに家族にこれから帰る連絡をしているのですが、
毎日同じ文章を入れるのも面倒なので、
Androidアプリ、GPS、Firebaseを使って考えてみました。

仕組みは簡単で、AndroidアプリでGPSの経度/緯度を取得し、
Firebaseのリアルタイムデータベースに書き込みます。
自宅のPCは、Firebaseのリアルタイムデータベースの変更を受け取り、
特定の距離まで近づいたら音を鳴らします。
距離の計算にはGoogle Maps APIを使用しました。

android_gps_firebase_kouseizu

1. Firebaseの用意

Firebaseは、リアルタイムデータベースが特徴的なmBaaSで、
先日のGoogleI/O 2016で大幅なバージョンアップが発表されました。

今回はリアルタイムデータベースを使用します。
Firebaseにログイン(Googleアカウントでログイン出来ます)し、新規プロジェクトを作成します。
プロジェクト画面の左側にある”Database”を選択するとデータベースの内容が表示されます。
最初はなにもデータがなく、英数字だけ書かれていますが、それがデータベース名になります。

データの持ち方は以下のようにしました。
FirabaseのデータはJSONになります。
“home”が自宅、”location”が現在位置にします。

2. Androidアプリ

GPSで取得した緯度/経度をFirebaseに書き込むアプリを作成します。

Androidアプリで経度、緯度を取得する方法は公式ドキュメントが詳しいと思います。

AndroidアプリでFirebaseを使うにはSDKを組み込みます。
組み込み方は公式ドキュメントを参照ください。

自宅の位置”home”に書き込むには地図から選べると便利だと思いますが、
今回はやっつけでテキストボックスで数値を入れるようにしてしまいました。。

現在位置”location”へはGPSで取得した値をFirebaseに書き込みます。

Firebaseへの書き込み方は簡単です。
まずインスタンスと各値へアクセスするための参照を取得します。

“home”へはボタンタップ時に、”location”へはLocationListener#onLocationChanged()時に
Firebaseへ書き込んでいます。

3. 自宅PCで監視

Node.jsでFirabaseを使用します。
組み込み方は公式ドキュメントを参照ください。
組み込む途中で設定ファイルをダウンロードしておきます。

Node.jsでFirebaseのデータを取得します。
“home”も”location”も同様のやり方で取得できます。

valueイベントは”home”以下の子要素を全て取ってきます。
他にもchild_changedイベントも変更を受け取れますが、
“home”以下で変更にあった子要素だけ受け取れました。
今回はlatitude、longitude欲しかったのでvalueイベントにしました。

次に取得した緯度/経度をGoogle Map APIを使用し、距離を求めます。
Google Maps APIの使い方は公式ドキュメントを参照ください。

Google Maps APIを呼ぶタイミングは、”location”変更時にし、
取得できたJSONデータから距離だけ使います。

最後に取得した距離がしきい値より近ければ、音を鳴らします。
MacならsayコマンドをNode.jsから実行することで簡単に”あと何メートルです”と
音声で伝えることが出来ます。
今回は、PC代わりにRaspberry Piを使用したので、
Open JTalkとaplayを使用し、音声で伝えることが出来ました。

まとめ

Firebaseのリアルタイムデータベースは、使い出す前の準備に戸惑いましたが、
使い出したら自宅PC側でイベント登録しておけば、
変更があった時点で処理が動くので簡単に使うことが出来ました。
Firebaseには他にも機能があるので、それらも使ってみたいと思いました。

以上です。