Wacker #8 もう学習は機械に任せたい

Posted by Yohei Taniguchi on November 19, 2016

Wacker #8 もう学習は機械に任せたい

Wacker 8機械学習 from Kosuke Sugahara

概要

  • 人工知能 > 機械学習 > ディープラーニング
  • 機械学習=機械が学習することを目的とした人工知能の研究分野
  • ディープラーニング=脳神経における情報伝達(ニューラルネットワーク)をモデル化し多層化したもの。 (平社員→係長→課長→部長→社長という感じで多段に構成されたノードが下位のノードの判断を踏まえ順々に判断しながら結果を出していく感じ?)

ユースケース

正解情報を与えながら判断力を鍛えていく(先生あり)、雑多な情報を与えて結果から傾向分析を人間がする(先生なし) などの利用の仕方がある。

  • 顔認識
  • 音声認識
  • 画像検索・認識
  • 翻訳
  • メール仕分け
  • 未知のウイルス検出 など

内容

  1. 環境の構築
    • PythonとTensorFlow本体のインストールからスタート。最初Vagrant上で構築を始めたのですが上手く行かず・・・。 ちょっと時間がかかりそうだったので、Cloud9上に構築をトライ。 qiitaの記事 を参考にしながらわりとサクッと完了。あとはGithubから チュートリアル用のソースを落として準備完了。
  2. TensorFlowのチュートリアルをお試し

    Getstarted

    「y = 0.1 x + 0.3」という数式を使って生成したxとyを学習データとして、y = W x + b という数式のWとbを最適化していく

引用元:TensorFlowを理解するための基礎情報共有(1)

  • さっぱりわかりませんが、以下を入力すると
$ python getstarted.py
(0, array([ 0.56588918], dtype=float32), array([ 0.05949038], dtype=float32))
(20, array([ 0.20437114], dtype=float32), array([ 0.24363647], dtype=float32))
(40, array([ 0.12361675], dtype=float32), array([ 0.28724626], dtype=float32))
(60, array([ 0.10534392], dtype=float32), array([ 0.29711413], dtype=float32))
(80, array([ 0.10120919], dtype=float32), array([ 0.29934701], dtype=float32))
(100, array([ 0.10027361], dtype=float32), array([ 0.29985225], dtype=float32))
(120, array([ 0.1000619], dtype=float32), array([ 0.29996657], dtype=float32))
(140, array([ 0.10001401], dtype=float32), array([ 0.29999244], dtype=float32))
(160, array([ 0.10000318], dtype=float32), array([ 0.29999828], dtype=float32))
(180, array([ 0.10000071], dtype=float32), array([ 0.29999962], dtype=float32))
(200, array([ 0.10000015], dtype=float32), array([ 0.29999992], dtype=float32))
  • というような結果がでてきます。左の数字は学習回数で学習を重ねることで0.1と0.3に収束していくということだと思います。

classify_image

  • 画像認識の処理で与えた画像が何の動物かを判断する処理
  • 初期値で与える動物の画像: パンダ
  • 以下を入力すると
$ python tensorflow/models/image/imagenet/classify_image.py
  • こんな結果が返ってくる。
tensorflow/core/framework/op_def_util.cc:332] Op BatchNormWithGlobalNormalization is deprecated. It will cease to work in GraphDef version 9. Use tf.nn.batch_normalization().
giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.89233)
indri, indris, Indri indri, Indri brevicaudatus (score = 0.00859)
lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00264)
custard apple (score = 0.00141)
earthstar (score = 0.00107)
  • scoreが大きいほうが似ているという結果。この場合、「giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca」のどれかって感じ

  • メインの処理については

def main(_):
  maybe_download_and_extract()
  image = (FLAGS.image_file if FLAGS.image_file else
           os.path.join(FLAGS.model_dir, 'cropped_panda.jpg'))
  run_inference_on_image(image)
  • maybe_download_and_extract(): 「ダウンロードして解凍するかも」・・・ふわっとした関数名だけどちゃんとその通りしてくれます。 チュートリアル用のデータ類をダウンロード&解凍
  • image = (FLAGS.image_file if ~:実行時に引数にファイル名を指定するとその画像と、指定がなければデフォルトでパンダの画像で評価してくれます。

  • run_inference_on_image(image):この中で画像を分析し、何の動物かを判断してくれる。

はまり所

  • チュートリアルは端折られてる所もあるので、そのまま動かないところがある。(何箇所かファイルパスの修正が必要)
  • インストールの仕方によってはPythonのパスがTensorFlowのディレクトリー配下に行くのかGithubのソースが上手く動かない人が多かった。

参考資料

所感

  • そもそも統計というか理系科目が苦手なので出てきた結果にさっぱり。 動かすことはできるけど、これどうやって使っていったらいいのやら・・・ 用語が分かってないのもあるけど、何が何をやってるのかいまいち追えなかった。 可能性は非常に感じるけど難しい。

謝辞

今回も、和歌山市開催の時いつも会場を提供してくださる正和情報サービス様ありがとうございました。