Upload
yasuyuki-sugai
View
1.182
Download
0
Embed Size (px)
Citation preview
第3回 機械学習勉強会 「色々なNNフレームワークを動かしてみよう!」
~Keras編~
1
2016/06/27
自己紹介
2
•菅井康之
•株式会社イーグル所属
• AITCクラウドテクノロジー活用部会 サブリーダー
https://www.facebook.com/yasuyuki.sugai
よろしくお願いしまーす ※この資料の内容は、
個人の見解です
※Keras歴1日
- 本日の流れ -
3
• keras 環境構築編 – AWS上にKerasの動作環境を準備
• keras Tutorial編 – チュートリアルの一つである、MNISTを使ってお試し動作(theanoもTensorFlowも動くよ♪)
• keras 手書き数字分類編 – MNISTのモデルと学習したパラメータを使って手書き数字の画像を分類してみる
Keras枠は30分なので、 超駆け足でいきます!
ちなみに、本日のNN会にはCaffeが出てきませんが、興味がある方がいらっしゃいましたら、去年のハンズオン資料をご覧くださいませ
4http://www.slideshare.net/yasuyukisugai/deep-learningcaffe
一回やったし、 もういいかな、と思いまして。。
5
• 一言で言うと、theanoのPythonラッパー • バックエンドでtheanoが動作
• CNNとRNNの両者、および2つの組み合わせに対応 • 近では、バックエンドにTensorFlowも使えるようになり、 同じコードでtheano,TensorFlowで実行可能に!!
• 抽象化、モジュール化することでブロックを組み合わせるように (簡潔に)モデルを構築できる
• そのおかげでバックエンドを切り替えられるけど、モデルのコンパイルがクソ遅い。。。。
モデル周りが直感的で、 NN触ったことある人ならすぐに理解できそう。
Kerasって?
6
theanoのラッパーにはPylearn2があったけど、kerasに軍配があがった模様
Pylearn2のサイトトップに、いつの間にかKerasが紹介されてる。。(そしてPylearn2開発終了?のお知らせ)
http://deeplearning.net/software/pylearn2/
7
公式ドキュメントがしっかり作られているので、これを見るだけで大体できるようになるかと思います セットアップ手順もこれを参照すればOK!
http://keras.io/
keras 環境構築編 - AWSセットアップ -
8
今日の環境
9
• 時間がないので、学習時間短縮のため、NVIDIAが 提供するAWSのイメージを利用します(cuDNNは入っていないので、若干速い程度です)
• この資料の手順を実施していただければ、他のAmazonLinuxやCentOSなどでも同様に実施可能です
また、普段は安価にすむようスポットインスタンスを使うのですが、インスタンスの準備ができるまでに時間がかかるのと、需要によっては突然インスタンス落とされるので、今回も通常のインスタンスでやります。
10
何百円かかかります
※一時間辺り、$0.67くらい
スポットインスタンスを使ってると・・・
11
途中でこれが 発生すると悲しいので・・・
まずEC2にアクセス
12
インスタンスを作成していきます
13
①
②
今回はNVIDIAのインスタンスを使用
14
①
②
③
GPUインスタンスのg2.2xlargeを 選択します
15
②
③
①
外からアクセスするように、パブリックIPを割り当て
16②
①
あとは基本そのままで問題無いはず ですが、カスタマイズしたい箇所が あれば設定変更してください
17
後に構成を確認して、インスタンスを作成します
18①
この画面で作成したキーペアは 無くさないよう気をつけてください。。。
19
①
②
作成中。。。
20
※一度もインスタンスを作成した事がないアカウントの場合、 「2時間待て」というエラーが出る事があります(事前の注意事項参照) もし発生してしまった場合は、CPUモードで試していただくことになります
作成したインスタンスへの SSH接続手順を確認します
21
①
②
コマンドでの接続方法が確認できます (TeraTermなどのツールを使う方は キーペアとドメインを指定してください)
22
※NVIDIAのインスタンスの場合、ユーザ名は「ec2-user」を
指定してください root -> c2-user
SSHでインスタンスに 接続できましたでしょうか?
23
keras 環境構築編 - 諸々セットアップ -
24
コマンド実行時の注意事項
25
• コピペした際に、スペースや改行部分の文字コードが変わって しまう場合があります
– コマンドが無いよ、などのエラーになったらスペースor改行を疑ってください
• ~ はチルダです – /home/ec2-user ディレクトリを指定する際に使用します – 上手くいかない場合は、~ を /home/ec2-user に読み替えて実行してください
• 行頭の$ はプロンプトを意味しています – 実行時には入力しないでください
• 前のスライドの続きでコマンドを実行するため、カレントディレクトリには注意してください
26
①環境確認• Pythonのバージョンを確認します$ python --versionPython 2.7.10
• CUDAコンパイラのバージョンを確認します※GPUで動かすためで、必須ではないです
$ nvcc --versionnvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2015 NVIDIA CorporationBuilt on Tue_Aug_11_14:27:32_CDT_2015Cuda compilation tools, release 7.5, V7.5.17
2.7系 or 3系ならOK
7.5系ならOK
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
③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
④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
⑤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
⑥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ライブラリ (環境変数設定後)
keras Tutorial編 - MNIST -
33
LeNet MNIST
34
• 手書き数字の認識精度テスト • 28x28ピクセル、70,000枚の画像
• kerasでは、60,000を訓練に使い、10,000をテストで使います
• 今日は色々なNNでMNISTを動かしてみる会です!(再掲)
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
②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
③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
④mnist再実行• もう一度mnistのサンプルを動かしてみます
$ cd $ python keras/examples/mnist_cnn.py Using TensorFlow backend.
「Using TensorFlow backend.」という記述から、TensorFlowに切り替わったことがわかります。時間がかかるので、Ctrl-Cで一回止めちゃいましょう!!
39
⑤mnistの中身を見てみよう• 資料が間に合わなかったので、その場で。。
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
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
⑥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
⑦モデル/パラメータ保存の補足• モデルはJSON、またはYAML形式で保存可能 • 学習パラメータはHDF5形式で保存
• 再度サンプルを動作させると、 homeディレクトリにファイルが保存される・・はず。
$ cd $ python keras/examples/mnist_cnn.py
44
⑧せっかくなので、それぞれの速度を・・
• 元々theano用に作られているので、TensorFlow向けのパフォーマンスチューニングはこれからかも?
1Epoch(60,000sample)辺り… theano TensorFlow
NVIDIA instance (no cuDNN)
※g2.2xlarge instance29s (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)
keras 手書き数字分類編 - MNIST -
45
46
①分類したい・・・よね?• せっかく学習させたので、学習パラメータとモデルを使って、実際に分類したい!
• 先ほど保存したモデルを使って、分類するプログラムを用意しました
$ cd $ vi mnist_classifier.py
コードは次スライドで。。。
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
• プログラムがうまくコピペできない方向けに、Dropboxにも同じものを置いてあります
• めんどくさい人はこちらでもOKです
pythonの場合、インデントがずれるとエラーになるので、コピペだと難しいかもしれません。。 改行もPDFだと怪しいかも。。 ※元ファイルは消してから実行してください
$ wget https://dl.dropboxusercontent.com/u/8148946/develop/aws/mnist_classifier.py
49
②分類する画像は・・・?• 私が手書きした画像ファイルを用意しました
50
• 画像はサイズがマチマチだったり、コントラストが効いてたりで、このまま学習に使うと精度が悪いので正規化していきます
③画像の前処理
$ sudo yum install ImageMagick
• 正規化にはImageMagickを利用しています
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
画像の正規化
equalize
geometry 28x28
• ヒストグラム均等化 • 画像のヒストグラムを均等(平坦)にすることで、 全画像のコントラストが統一され、画像処理しやすくなる(カメラやってる人は詳しいですよね)
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
⑥その他の画像も・・・
$ 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
⑥その他の画像も・・・
$ 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
⑥その他の画像も・・・
$ 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
①
②
③
④
停止じゃなくて、削除しないとEBSの課金が続きます。。
おわり。
58