Mais conteúdo relacionado
Semelhante a 第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編- (20)
Mais de Yasuyuki Sugai (14)
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
- 3. - 本日の流れ -
3
• keras 環境構築編
– AWS上にKerasの動作環境を準備
• keras Tutorial編
– チュートリアルの一つである、MNISTを
使ってお試し動作(theanoもTensorFlowも動くよ♪)
• keras 手書き数字分類編
– MNISTのモデルと学習したパラメータを使って
手書き数字の画像を分類してみる
Keras枠は30分なので、
超駆け足でいきます!
- 5. 5
• 一言で言うと、theanoのPythonラッパー
• バックエンドでtheanoが動作
• CNNとRNNの両者、および2つの組み合わせに対応
• 最近では、バックエンドにTensorFlowも使えるようになり、
同じコードでtheano,TensorFlowで実行可能に!!
• 抽象化、モジュール化することでブロックを組み合わせるように
(簡潔に)モデルを構築できる
• そのおかげでバックエンドを切り替えられるけど、
モデルのコンパイルがクソ遅い。。。。
モデル周りが直感的で、
NN触ったことある人なら
すぐに理解できそう。
Kerasって?
- 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
②不足ライブラリのインストール
• 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
③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
- 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
⑥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ライブラリ (環境変数設定後)
- 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が入ってないので、以下のように出力されます
- 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
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での実行結果
- 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))
モデルとパラメータを保存した
ファイルから読み込んで・・・
分類したい画像を
処理できるよう読み込んで・・・
分類!!
- 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 : 画像のヒストグラム均等化
- 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
⑥その他の画像も・・・
$ 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
⑥その他の画像も・・・
$ 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
⑥その他の画像も・・・
$ 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]
• ちなみに私の環境の結果・・・