Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-

4,527 views

Published on

2016年6月期AITCオープンラボ
第3回 機械学習勉強会 「色々なニューラル・ネットワークのフレームワークを動かしてみよう!」 Keras編資料

Published in: Technology

第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-

  1. 1. 第3回 機械学習勉強会 「色々なNNフレームワークを動かしてみよう!」 ~Keras編~ 1 2016/06/27
  2. 2. 自己紹介 2 •菅井康之      •株式会社イーグル所属 •AITCクラウドテクノロジー活用部会 サブリーダー https://www.facebook.com/yasuyuki.sugai よろしくお願いしまーす ※この資料の内容は、 個人の見解です ※Keras歴1日
  3. 3. - 本日の流れ - 3 • keras 環境構築編 – AWS上にKerasの動作環境を準備
 • keras Tutorial編 – チュートリアルの一つである、MNISTを
 使ってお試し動作(theanoもTensorFlowも動くよ♪)
 • keras 手書き数字分類編 – MNISTのモデルと学習したパラメータを使って
 手書き数字の画像を分類してみる Keras枠は30分なので、 超駆け足でいきます!
  4. 4. ちなみに、本日のNN会にはCaffeが
 出てきませんが、興味がある方が
 いらっしゃいましたら、去年のハンズオン 資料をご覧くださいませ 4 http://www.slideshare.net/yasuyukisugai/deep-learningcaffe 一回やったし、 もういいかな、 と思いまして。。
  5. 5. 5 • 一言で言うと、theanoのPythonラッパー • バックエンドでtheanoが動作 • CNNとRNNの両者、および2つの組み合わせに対応 • 最近では、バックエンドにTensorFlowも使えるようになり、
 同じコードでtheano,TensorFlowで実行可能に!! • 抽象化、モジュール化することでブロックを組み合わせるように
 (簡潔に)モデルを構築できる • そのおかげでバックエンドを切り替えられるけど、
 モデルのコンパイルがクソ遅い。。。。 モデル周りが直感的で、 NN触ったことある人なら
 すぐに理解できそう。 Kerasって?
  6. 6. 6 theanoのラッパーにはPylearn2があったけど、
 kerasに軍配があがった模様 Pylearn2のサイトトップに、いつの間にかKerasが紹介 されてる。。(そしてPylearn2開発終了?のお知らせ) http://deeplearning.net/software/pylearn2/
  7. 7. 7 公式ドキュメントがしっかり作られているので、
 これを見るだけで大体できるようになるかと思います セットアップ手順もこれを参照すればOK! http://keras.io/
  8. 8. keras 環境構築編 - AWSセットアップ - 8
  9. 9. 今日の環境 9 • 時間がないので、学習時間短縮のため、NVIDIAが
 提供するAWSのイメージを利用します
 (cuDNNは入っていないので、若干速い程度です) • この資料の手順を実施していただければ、
 他のAmazonLinuxやCentOSなどでも同様に実施可 能です
  10. 10. また、普段は安価にすむよう
 スポットインスタンスを使うのですが、 インスタンスの準備ができるまでに 時間がかかるのと、需要によっては 突然インスタンス落とされるので、 今回も通常のインスタンスでやりま す。 10 何百円かかかります ※一時間辺り、$0.67くらい
  11. 11. スポットインスタンスを使ってると・・・ 11 途中でこれが 発生すると悲しいので・・・
  12. 12. まずEC2にアクセス 12
  13. 13. インスタンスを作成していきます 13 ① ②
  14. 14. 今回はNVIDIAのインスタンスを使用 14 ① ② ③
  15. 15. GPUインスタンスのg2.2xlargeを 選択します 15 ② ③ ①
  16. 16. 外からアクセスするように、
 パブリックIPを割り当て 16 ② ①
  17. 17. あとは基本そのままで問題無いはず ですが、カスタマイズしたい箇所が あれば設定変更してください 17
  18. 18. 最後に構成を確認して、インスタンスを 作成します 18 ①
  19. 19. この画面で作成したキーペアは 無くさないよう気をつけてください。。。 19 ① ②
  20. 20. 作成中。。。 20 ※一度もインスタンスを作成した事がないアカウントの場合、 「2時間待て」というエラーが出る事があります(事前の注意事項参照) もし発生してしまった場合は、CPUモードで試していただくことになります
  21. 21. 作成したインスタンスへの SSH接続手順を確認します 21 ① ②
  22. 22. コマンドでの接続方法が確認できます (TeraTermなどのツールを使う方は キーペアとドメインを指定してください) 22 ※NVIDIAのインスタンスの場合、 ユーザ名は「ec2-user」を 指定してください root -> c2-user
  23. 23. SSHでインスタンスに 接続できましたでしょうか? 23
  24. 24. keras 環境構築編 - 諸々セットアップ - 24
  25. 25. コマンド実行時の注意事項 25 • コピペした際に、スペースや改行部分の文字コードが変わって
 しまう場合があります – コマンドが無いよ、などのエラーになったらスペースor改行を
 疑ってください • ~ はチルダです – /home/ec2-user ディレクトリを指定する際に使用します – 上手くいかない場合は、~ を /home/ec2-user に
 読み替えて実行してください • 行頭の$ はプロンプトを意味しています – 実行時には入力しないでください • 前のスライドの続きでコマンドを実行するため、
 カレントディレクトリには注意してください
  26. 26. 26 ①環境確認 • Pythonのバージョンを確認します $ python --version
 Python 2.7.10 • CUDAコンパイラのバージョンを確認します
 ※GPUで動かすためで、必須ではないです $ nvcc --version
 nvcc: NVIDIA (R) Cuda compiler driver
 Copyright (c) 2005-2015 NVIDIA Corporation
 Built on Tue_Aug_11_14:27:32_CDT_2015
 Cuda compilation tools, release 7.5, V7.5.17 2.7系 or 3系ならOK 7.5系ならOK
  27. 27. 27 ②不足ライブラリのインストール • AmazonLinuxだと入っていないものが多いの で。。。 $ sudo yum install gcc gcc-c++ git : (中略) Successfully installed Theano-0.8.2 numpy-1.11.1 scipy-0.17.1 six-1.10.0 • pipも古いので。。。 $ sudo pip install --upgrade pip : (中略) Successfully installed pip-8.1.2 ※以降、pip2で実行
 (sudoの場合、PATHが通ってないので/usr/local/bin/pip2)
  28. 28. 28 ③theanoインストール • バックエンドとなるtheanoをインストール numpyとかscipyとかも一緒に入ります $ sudo /usr/local/bin/pip2 install Theano : (中略) Successfully installed Theano-0.8.2 numpy-1.11.1 scipy-0.17.1 six-1.10.0 • 手順通りだと、以下のテスト実施がありますが
 時間がとてもかかるので割愛します
 (テストなのでやらなくてもOK!!) $ sudo /usr/local/bin/pip2 install nose $ sudo /usr/local/bin/pip2 install nose-parameterized $ nosetests theano
  29. 29. 29 ④TensorFlowインストール • バックエンドとなるTensorFlowをインストール nvcc入ってれば何とか動くけど、kerasではエラーとなるため、
 今回はCPUで動作します $ sudo /usr/local/bin/pip2 install --upgrade https:// storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.9.0- cp27-none-linux_x86_64.whl • GPUの方はこちら(Require cuDNN)
 • CPUの方はこちら $ sudo /usr/local/bin/pip2 install --upgrade https:// storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0- cp27-none-linux_x86_64.whl : (中略) Successfully installed tensorflow-0.9.0
  30. 30. 30 ⑤kerasインストール • keras本体のインストール $ sudo /usr/local/bin/pip2 install keras : (中略) Successfully installed keras-1.0.4 • sampleなどを本家からダウンロード $ cd $ git clone https://github.com/fchollet/keras.git : (中略) Checking connectivity... done. homeディレクトリに入れたいので、念のためcdでhomeへ移動
  31. 31. 31 ⑥HDF5インストール • kerasで学習したパラメータはHDF5形式で保存するため、インストール
 ※必須ではないです。面倒かつ時間がかかるのでやらなくてもOK! $ cd $ wget http://www.hdfgroup.org/ftp/HDF5/current/src/hdf5-1.8.17.tar.gz $ tar xvfz hdf5-1.8.17.tar.gz $ cd hdf5-1.8.17 $ ./configure prefix=/opt/hdf5; make; sudo make install Hierarchical Data Format 5の略
 科学技術計算などの分野で、時系列の大量のデータを記録するときに使用 $ export LIBRARY_PATH=/opt/hdf5/lib:$LIBRARY_PATH $ export LD_LIBRARY_PATH=/opt/hdf5/lib:$LD_LIBRARY_PATH $ export C_INCLUDE_PATH=/opt/hdf5/include:$C_INCLUDE_PATH $ export CPLUS_INCLUDE_PATH=/opt/hdf5/include:$CPLUS_INCLUDE_PATH $ sudo -E /usr/local/bin/pip2 install h5py : (中略) Successfully built h5py • HDF5本体 
 (環境に合わせたインストーラもあるけど、面倒なのでソースコンパイル) • Pythonライブラリ (環境変数設定後)
  32. 32. 32 HDF5に興味がある方は、本家の方で・・・ https://www.hdfgroup.org/HDF5/
  33. 33. keras Tutorial編 - MNIST - 33
  34. 34. LeNet MNIST 34 • 手書き数字の認識精度テスト • 28x28ピクセル、70,000枚の画像 • kerasでは、60,000を訓練に使い、
 10,000をテストで使います • 今日は色々なNNでMNISTを動かしてみる会です!
 (再掲)
  35. 35. 35 ①mnist実行 • とりあえずmnistのサンプルを動かしてみよう! $ cd $ python keras/examples/mnist_cnn.py Using Theano backend. 「Using Theano backend.」という記述から、theanoで動作していることが
 わかります。
 時間がかかるので、Ctrl-Cで一回止めちゃいましょう!! $ export THEANO_FLAGS=device=gpu0,floatX=float32 theanoをGPUモードで動作させたい場合は、以下の環境変数を
 設定後にサンプルを動作 (GPUデバイスは環境に合わせて) Using Theano backend. Using gpu device 0: GRID K520 (CNMeM is disabled, cuDNN not available) NVIDIAはcuDNNが入ってないので、以下のように出力されます
  36. 36. 36 ②keras環境ファイル確認 • とりあえず動かしたのには理由があり、、
 一度実行するとhomeディレクトリに
 .kerasというディレクトリができています $ ls -ltra drwxrwxr-x 3 ec2-user ec2-user 4096 6月 27 09:43 .keras • この中にある、.keras/keras.jsonが
 バックエンドを切り替えたりする
 環境ファイルになります
 $ ls -ltr .keras -rw-rw-r-- 1 ec2-user ec2-user 109 6月 27 09:43 keras.json drwxrwxr-x 2 ec2-user ec2-user 4096 6月 27 09:43 datasets
  37. 37. 37 ③kerasのバックエンドを切り替えてみる • .keras/keras.jsonのbackendを書き換えます { "image_dim_ordering": "th", "epsilon": 1e-07, "floatx": "float32", "backend": "theano" } • Before • After { "image_dim_ordering": "th", "epsilon": 1e-07, "floatx": "float32", "backend": "tensorflow" }
  38. 38. 38 ④mnist再実行 • もう一度mnistのサンプルを動かしてみます $ cd $ python keras/examples/mnist_cnn.py Using TensorFlow backend. 「Using TensorFlow backend.」という記述から、
 TensorFlowに切り替わったことがわかります。
 時間がかかるので、Ctrl-Cで一回止めちゃいましょう!!
  39. 39. 39 ⑤mnistの中身を見てみよう • 資料が間に合わなかったので、その場で。。
  40. 40. 40 Using Theano backend. Using gpu device 0: GRID K520 (CNMeM is disabled, cuDNN not available) X_train shape: (60000, 1, 28, 28) 60000 train samples 10000 test samples Train on 60000 samples, validate on 10000 samples Epoch 1/12 60000/60000 [==============================] - 29s - loss: 0.3823 - acc: 0.8824 - val_loss: 0.1019 - val_acc: 0.9679 Epoch 2/12 60000/60000 [==============================] - 29s - loss: 0.1522 - acc: 0.9558 - val_loss: 0.0683 - val_acc: 0.9791 Epoch 3/12 60000/60000 [==============================] - 29s - loss: 0.1166 - acc: 0.9652 - val_loss: 0.0549 - val_acc: 0.9818 Epoch 4/12 60000/60000 [==============================] - 29s - loss: 0.0992 - acc: 0.9710 - val_loss: 0.0474 - val_acc: 0.9847 Epoch 5/12 60000/60000 [==============================] - 29s - loss: 0.0864 - acc: 0.9753 - val_loss: 0.0452 - val_acc: 0.9852 Epoch 6/12 60000/60000 [==============================] - 29s - loss: 0.0775 - acc: 0.9768 - val_loss: 0.0436 - val_acc: 0.9853 Epoch 7/12 60000/60000 [==============================] - 29s - loss: 0.0672 - acc: 0.9799 - val_loss: 0.0370 - val_acc: 0.9875 Epoch 8/12 60000/60000 [==============================] - 29s - loss: 0.0625 - acc: 0.9811 - val_loss: 0.0364 - val_acc: 0.9880 Epoch 9/12 60000/60000 [==============================] - 29s - loss: 0.0583 - acc: 0.9825 - val_loss: 0.0344 - val_acc: 0.9882 Epoch 10/12 60000/60000 [==============================] - 29s - loss: 0.0549 - acc: 0.9833 - val_loss: 0.0321 - val_acc: 0.9885 Epoch 11/12 60000/60000 [==============================] - 29s - loss: 0.0507 - acc: 0.9846 - val_loss: 0.0330 - val_acc: 0.9886 Epoch 12/12 60000/60000 [==============================] - 29s - loss: 0.0489 - acc: 0.9850 - val_loss: 0.0309 - val_acc: 0.9896 Test score: 0.0308561353186 Test accuracy: 0.9896 Theanoでの実行結果
  41. 41. 41 Using TensorFlow backend. X_train shape: (60000, 1, 28, 28) 60000 train samples 10000 test samples Train on 60000 samples, validate on 10000 samples Epoch 1/12 60000/60000 [==============================] - 194s - loss: 0.3841 - acc: 0.8832 - val_loss: 0.1024 - val_acc: 0.9677 Epoch 2/12 60000/60000 [==============================] - 194s - loss: 0.1525 - acc: 0.9557 - val_loss: 0.0688 - val_acc: 0.9778 Epoch 3/12 60000/60000 [==============================] - 194s - loss: 0.1152 - acc: 0.9660 - val_loss: 0.0537 - val_acc: 0.9825 Epoch 4/12 60000/60000 [==============================] - 194s - loss: 0.0955 - acc: 0.9718 - val_loss: 0.0474 - val_acc: 0.9838 Epoch 5/12 60000/60000 [==============================] - 194s - loss: 0.0833 - acc: 0.9753 - val_loss: 0.0434 - val_acc: 0.9858 Epoch 6/12 60000/60000 [==============================] - 194s - loss: 0.0744 - acc: 0.9781 - val_loss: 0.0417 - val_acc: 0.9859 Epoch 7/12 60000/60000 [==============================] - 194s - loss: 0.0685 - acc: 0.9793 - val_loss: 0.0377 - val_acc: 0.9877 Epoch 8/12 60000/60000 [==============================] - 194s - loss: 0.0635 - acc: 0.9816 - val_loss: 0.0359 - val_acc: 0.9883 Epoch 9/12 60000/60000 [==============================] - 194s - loss: 0.0597 - acc: 0.9822 - val_loss: 0.0331 - val_acc: 0.9888 Epoch 10/12 60000/60000 [==============================] - 194s - loss: 0.0530 - acc: 0.9841 - val_loss: 0.0340 - val_acc: 0.9890 Epoch 11/12 60000/60000 [==============================] - 194s - loss: 0.0521 - acc: 0.9841 - val_loss: 0.0315 - val_acc: 0.9893 Epoch 12/12 60000/60000 [==============================] - 195s - loss: 0.0490 - acc: 0.9849 - val_loss: 0.0325 - val_acc: 0.9892 Test score: 0.0325271734926 Test accuracy: 0.9892 TensorFlowでの実行結果
  42. 42. 42 ⑥mnistのモデル/パラメータを保存しよう • せっかく学習したので、(何度も実施して
 いられないので)モデルと学習パラメータを
 保存したい! • さっきから実施しているサンプルコードを
 書き換えましょう
 末尾に以下のコードを追加してください $ vi keras/examples/mnist_cnn.py print('save the architecture of a model') json_string = model.to_json() open('cnn_model.json', 'w').write(json_string) yaml_string = model.to_yaml() open('cnn_model.yaml', 'w').write(yaml_string) print('save weights') model.save_weights('cnn_model_weights.hdf5')
  43. 43. 43 ⑦モデル/パラメータ保存の補足 • モデルはJSON、またはYAML形式で保存可能 • 学習パラメータはHDF5形式で保存 • 再度サンプルを動作させると、
 homeディレクトリにファイルが保存される・・はず。 $ cd $ python keras/examples/mnist_cnn.py
  44. 44. 44 ⑧せっかくなので、それぞれの速度を・・ • 元々theano用に作られているので、TensorFlow向けの
 パフォーマンスチューニングはこれからかも? 1Epoch(60,000sample)辺り… theano TensorFlow NVIDIA instance (no cuDNN) ※g2.2xlarge instance 29s (GPU) 194s (CPU) cuDNN instance
 ※g2.2xlarge instance 10s (GPU) 98s (GPU) g2.2xlarge instance 1,177s (CPU) 194s (CPU) t2.micro instance 測定不能 876s (CPU)
  45. 45. keras 手書き数字分類編 - MNIST - 45
  46. 46. 46 ①分類したい・・・よね? • せっかく学習させたので、学習パラメータと
 モデルを使って、実際に分類したい! • 先ほど保存したモデルを使って、分類するプログラムを
 用意しました $ cd $ vi mnist_classifier.py コードは次スライドで。。。
  47. 47. 47 from __future__ import print_function import sys import numpy as np np.random.seed(1337) # for reproducibility from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Convolution2D, MaxPooling2D from keras.utils import np_utils from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img from keras.models import model_from_json batch_size = 128 nb_classes = 10 nb_epoch = 12 # input image dimensions img_rows, img_cols = 28, 28 # number of convolutional filters to use nb_filters = 32 # size of pooling area for max pooling nb_pool = 2 # convolution kernel size nb_conv = 3 print("-- Read model ---") json_string = open('cnn_model.json').read() model = model_from_json(json_string) model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy']) model.load_weights('cnn_model_weights.hdf5') print(model.summary()) print("-- predict classes --") img = load_img(sys.argv[1], grayscale=True) x = img_to_array(img) x = x.reshape((1,)+x.shape) x /= 255 classes = model.predict(x, batch_size=batch_size, verbose=True) print(classes[0]) print(model.predict_classes(x, batch_size=batch_size)) モデルとパラメータを保存した
 ファイルから読み込んで・・・ 分類したい画像を
 処理できるよう読み込んで・・・ 分類!!
  48. 48. 48 • プログラムがうまくコピペできない方向けに、 Dropboxにも同じものを置いてあります • めんどくさい人はこちらでもOKです pythonの場合、インデントがずれるとエラーにな るので、コピペだと難しいかもしれません。。 改行もPDFだと怪しいかも。。 ※元ファイルは消してから実行してください $ wget https://dl.dropboxusercontent.com/u/8148946/develop/aws/mnist_classifier.py
  49. 49. 49 ②分類する画像は・・・? • 私が手書きした画像ファイルを用意しました
  50. 50. 50 • 画像はサイズがマチマチだったり、
 コントラストが効いてたりで、
 このまま学習に使うと精度が悪いので
 正規化していきます ③画像の前処理 $ sudo yum install ImageMagick • 正規化にはImageMagickを利用しています
  51. 51. 51 ④まずは1つ目・・・ • 3をダウンロードして試してみます
 例の如く、Dropboxから $ wget https://dl.dropboxusercontent.com/u/8148946/develop/aws/hand_three.jpg $ mogrify -geometry 28x28 hand_three.jpg $ mogrify -equalize hand_three.jpg • ImageMagickを利用して正規化 • geometry : サイズ変更 28x28px • equalize : 画像のヒストグラム均等化
  52. 52. 52 画像の正規化 equalize geometry 28x28 • ヒストグラム均等化 • 画像のヒストグラムを均等(平坦)にすることで、
 全画像のコントラストが統一され、
 画像処理しやすくなる(カメラやってる人は詳しいですよね)
  53. 53. 53 ⑤分類してみよう • 先ほどのコードにパラメータで
 画像ファイルを渡して実行 $ python mnist_classifier.py hand_three.jpg -- predict classes -- 1/1 [==============================] - 0s [ 2.43401244e-10 2.48896811e-07 1.83150478e-05 9.99735653e-01 1.21337429e-09 3.13459373e-06 1.67957495e-10 1.48233937e-07 2.42191425e-04 3.22340981e-07] 1/1 [==============================] - 0s [3] • ちなみに私の環境の結果・・・ 0-9であるそれぞれの確率 最も高い確率のラベル
 (上の結果から、99.97…以上の確率で、3である)
  54. 54. 54 ⑥その他の画像も・・・ $ wget https://dl.dropboxusercontent.com/u/8148946/develop/aws/hand_eight.jpg $ mogrify -geometry 28x28 hand_eight.jpg $ mogrify -equalize hand_eight.jpg $ python mnist_classifier.py hand_eight.jpg -- predict classes -- 1/1 [==============================] - 0s [ 8.30656461e-07 3.80646213e-07 2.04700581e-03 2.39168089e-02 6.18481479e-08 2.73143174e-04 9.84432859e-07 5.56953580e-07 9.73759592e-01 5.90186460e-07] 1/1 [==============================] - 0s [8] • ちなみに私の環境の結果・・・
  55. 55. 55 ⑥その他の画像も・・・ $ wget https://dl.dropboxusercontent.com/u/8148946/develop/aws/hand_one.jpg $ mogrify -geometry 28x28 hand_one.jpg $ mogrify -equalize hand_one.jpg $ python mnist_classifier.py hand_one.jpg -- predict classes -- 1/1 [==============================] - 0s [ 1.70512255e-02 4.73892987e-01 1.40300682e-02 1.17668300e-04 1.29068550e-02 1.12136435e-02 3.36032882e-02 2.87611940e-04 4.36355650e-01 5.41018206e-04] 1/1 [==============================] - 0s [1] • ちなみに私の環境の結果・・・
  56. 56. 56 ⑥その他の画像も・・・ $ wget https://dl.dropboxusercontent.com/u/8148946/develop/aws/hand_four.jpg $ mogrify -geometry 28x28 hand_four.jpg $ mogrify -equalize hand_four.jpg $ python mnist_classifier.py hand_four.jpg -- predict classes -- 1/1 [==============================] - 0s [ 1.00734840e-04 4.62344708e-03 7.69768953e-02 1.44169380e-05 9.07931030e-01 3.15244615e-05 5.63872652e-03 1.50309980e-03 3.14575201e-03 3.44054097e-05] 1/1 [==============================] - 0s [4] • ちなみに私の環境の結果・・・
  57. 57. 一通り楽しんだら、インスタンスの後始末 57 ① ② ③ ④ 停止じゃなくて、削除しないとEBSの課金が続きます。。
  58. 58. おわり。 58

×