いっきに解説 Deeplerning
TensorFlow-GPU による画像分類と生成
自己紹介 https://github.com/bluemooninc
https://facebook.com/bluemooninc
https://twitter.com/bluemooninc
有限会社ブルームーン
代表取締役 酒井 能克
業務内容:インターネット関連技術支援、
IoT機器の開発販売
アジェンダ
1:環境を構築する ( Tensorflow-GPU + Keras )
1-1: クラウドに高速な機会学習環境を構築する
1-2: パソコンに高速な機会学習環境を構築する
2:機械学習の基礎を学ぶ
2-1: Kerasリポジトリをクローンしてサンプルコードを取得
2-2: クラウドとパソコンでそれぞれ実行、GPU / CPU の速度差を知る
2-3: MNIST 解説
2-4: CNN 解説
2-4-1: 畳み込み層
2-4-2: プーリング層
2-4-3: 全結合層
アジェンダ2
3: Keras サンプルコード紹介 Keras examples directory
4: TensorBoardの利用
5: Keras による転移学習(fine tuning)の実践
6: Xception のコード・リーディング
7: Xception を応用し自前のモデル作成
8: Variational Autoencoder による様々な画像生成
学べること
構築・・・AWSでクラウドの機械学習環境を構築・GPU付パソコンで機械学習環
境を構築
インストールと確認・・・NVIDIA
CUDA,cuDNN,Python,Pyenv,Keras,TensorFlow,TensorBoard,OpenCV,dlib
画像分類器・・・MNIST,Cifar10,VGG,Xception,リアルタイム画像分類
画像生成・・・variational autoencoder, GAN
AWS EC2+GPU
TeAnsorFlow+GPU on Cloud
GPUインスタンス
P2
GPU
インスタンス
$0.9 x 24 x 30 = $648
$648 x ¥108 = ¥69,984
Gamming PC
Core™ i7 + GeForce® GTX 1050Ti 4GB
Python: Keras/TensorFlow を GPU で高速化
This should unblock your Wi-Fi
sudo tee /etc/modprobe.d/blacklist-ideapad.conf <<< "blacklist ideapad_laptop"
sudo reboot
sudo vi /etc/sysctl.conf
ファイル一番下の行に、
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
sudo sysctl -p
Pyenvのインストール
githubから取得し /usr/local に配置します。
$ cd /usr/local/
$ sudo git clone git://github.com/yyuu/pyenv.git ./pyenv
$ sudo mkdir -p ./pyenv/versions ./pyenv/shims
vim .bashrc
## pyenv のパスを追加
export PATH="/usr/local/pyenv/bin:$PATH"
export PYENV_ROOT=/usr/local/pyenv
eval "$(pyenv init -)"
sudo 時に環境を引き継ぐ visudo
Defaults env_reset
Defaults mail_badpass
#Defaults
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
:/sbin:/b$
Defaults env_keep += "PATH"
Defaults env_keep += "PYENV_ROOT"
NVIDIAのカードをOSが認識しているか確認
~$ lspci | grep -i nvidia
01:00.0 3D controller: NVIDIA Corporation Device 1c8c (rev a1)
CUDA Toolkit > Parallel Computing Platform
OSとバージョンを選択
インストール
cuDNN
GPU Accelerated
library for
Deep Learning
インストール
# Install Runtime library
sudo dpkg -i libcudnn6_6.0.*+cuda8.0_amd64.deb
# Install developer library
sudo dpkg -i libcudnn6-dev_6.0*+cuda8.0_amd64.deb
# Install code samples and user guide
sudo dpkg -i libcudnn6-doc_6.0*+cuda8.0_amd64.deb
The CUDA Profiling Tools Interface
$ sudo apt-get -y install libcupti-dev
## 再起動する
$ sudo reboot
vim ~/.bashrc
export CUDA_ROOT=/usr/local/cuda-8.0
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/targets/x86_64-
linux/lib/:$LD_LIBRARY_PATH
export CPATH=/usr/local/cuda-8.0/include:$CPATH
## パスの有効化
source ~/.bashrc
Keras と Tensorflow
Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な
高水準のニューラルネットワークライブラリ(フレームワーク)。中心的な開発
者、メンテナはGoogleのエンジニアのFrançois Cholletである。
2017年、GoogleのTensorFlowチームは、TensorFlowのコアライブラリにおいて
Kerasをサポートすることを決定した。(Wikiより)
※バックエンドとしてTensorFlowを利用する場合はPython2.7限定だったらしい
(3.6.2で動作確認できましたけど、OpenCVコンパイルの都合上2系の方が無
難)
Keras と GPU 版 TensorFlow をインストール
(tensorflow-with-gpu) $ pip install keras tensorflow-gpu
(tensorflow-with-gpu) $ pip list --format=columns | grep -i -e keras -e tensorflow
Keras 2.0.8
tensorflow-gpu 1.3.0
tensorflow-tensorboard 0.1.5
sudo apt install nvidia-cuda-dev
sudo apt update
sudo apt upgrade
git clone keras
> cd
> mkdir src
> cd src
> git clone https://github.com/fchollet/keras.git
> cd keras/examples
mnist サンプルを実行
## 時間計測を行い mnist cnn を実行する
> time python mnist_cnn.py
Test loss: 0.0300338261104
Test accuracy: 0.9902
real 2m5.097s
user 0m54.152s
sys 1m15.292s
GPU稼働情報を表示
> nvidia-smi
Sat Sep 2 18:33:33 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.69 Driver Version: 384.69 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 105... Off | 00000000:01:00.0 Off | N/A |
| N/A 43C P0 N/A / N/A | 398MiB / 4041MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 1129 G /usr/lib/xorg/Xorg 224MiB |
| 0 1848 G compiz 135MiB |
| 0 2712 G ...el-token=A824897B35D121CF49ACBD4502480B90 36MiB |
| 0 3840 G /usr/lib/firefox/firefox 1MiB |
+-----------------------------------------------------------------------------+
今度はCPUで計測
$ pip uninstall -y tensorflow-gpu
$ pip install tensorflow
$ time python mnist_cnn.py
Test loss: 0.0295431383794
Test accuracy: 0.9893
real 18m30.578s
user 122m28.916s
sys 10m3.364s
MNIST データ セット
National Institute of Standards and Technology(米国国立標準技術研究所)の混
合データ セット (MNIST データ セット) は、画像認識(IR)アルゴリズムを比較す
る際のベンチマーク。データ セットには計 70,000 枚の画像が含まれていて
60,000 枚は学習用画像 (IR モデルの作成に使用) で 10,000 枚は判別用画像 (モデ
ルの精度の評価に使用)。各 MNIST 画像は、1 つの手書き数字をデジタル化した
もの。サイズはそれぞれ 28 x 28 ピクセルです。各ピクセル値は 0 (白) ~ 255
(黒) の値で、中間のピクセル値は灰色の網かけを表す。各画像の数値を識別する
のは、人間には簡単ですが、コンピューターにとっては至難の業です。
MNISTのデータ
28 x 28 ピクセルが 784 の配列になったデータ
CNN (Convolutional Neural Network) とは
畳み込み層 プーリング層 全結合層
畳み込み層(convolution)
特徴抽出(フィルタリング)処理によって画像上の各位置ごとに濃淡のパターン
を検出する。
畳み込み結果 = Convolved Feature
http://deeplearning.stanford.edu
プーリング層 Pooled Feature
判別したい物体が平行移動しても不変な出力を行う。位置がずれても同じ結果に
なるように調整する役目を持つ。
http://deeplearning.stanford.edu
結合層
畳み込みとプーリング処理を行った後の、それぞれの部位を全パターン組み合わ
せて機械学習済みモデルとしてデータを出力します。このデータパターンとテス
トデータを比較して出力したものが判定になります。
A friendly introduction to Convolutional
Neural Networks and Image Recognition
Keras サンプルコード紹介(1)
[addition_rnn.py] 2つの(文字列としての)数値の加算実行によるSequence-to-
Sequence 実装の学習
[antirectifier.py] Kerasにおけるカスタムレイヤの記述方法のデモ
[babi_memnn.py] 文章読解のための、bABlデータセット上のメモリネットワーク
のトレーニング
[babi_rnn.py] 文章読解のための、bAbIデータセット上の 2 分岐 recurrent network
のトレーニング
[cifar10_cnn.py] CIFAR10の小さな画像データセットを使った、シンプルなディー
プCNNのトレーニング
Keras サンプルコード紹介(2)
[conv_filter_visualization.py] 入力スペースの勾配降下法によるVGG16フィルタの
可視化
[conv_lstm.py] 畳み込みLSTMネットワークを使ったデモ
[deep_dream.py] Kerasの深い夢(実行例)
[image_ocr.py] 畳み込みスタックとそれに続く反復スタックとCTCログ損失機能
をトレーニングすることによる光学式文字認識(OCR)の実行
[imdb_bidirectional_lstm.py] IMDBセンチメント分類タスク上において双方向
LSTMをトレーニング
[imdb_cnn.py] Convolution1Dをテキスト分類に使用するデモ
[imdb_cnn_lstm.py] IMDBセンチメント分類タスクにおいてrecurrent stack
networkが後続する畳み込みスタックのトレーニング
Keras サンプルコード紹介(3)
[imdb_fasttext.py] IMDBセンチメント分類タスクにおけるFastTextモデルのトレ
ーニング
[imdb_lstm.py] IMDBセンチメント分類タスクにおけるLSTMをトレーニング
[lstm_benchmark.py] IMDBセンチメント分類タスクにおいて異なるLSTM実装を
比較
[lstm_text_generation.py] ニーチェの著作からテキストを生成
[mnist_acgan.py] MNISTデータセットにおけるAC-GAN(Auxiliary Classifier
GAN)の実装
[mnist_cnn.py] MNISTデータセットを使った簡単なconvnetの作成
[mnist_hierarchical_rnn.py] MNIST数字分類において階層型RNN(HRNN)をトレ
ーニング
Keras サンプルコード紹介(4)
[mnist_irnn.py] Le氏ほかによる論文「整流化された線形単位の再帰的ネットワー
クを初期化する方法」における pixcel-by-pixcel のシーケンシャルなMNIST実験
の再現
[mnist_mlp.py] MNISTデータセットにおける単純なディープな多層パーセプトロ
ンのトレーニング
[mnist_net2net.py] 「Net2Net:知識移転による加速学習」におけるMNISTによる
Net2Net実験の再現
[mnist_siamese_graph.py] MNISTデータセットからの数字のペアを入力とした
Siamese(シャム人の) 多層パーセプトロンをトレーニング
[mnist_sklearn_wrapper.py] sklearnラッパ使用方法のデモ
[mnist_swwae.py] MNISTデータセットの残りのブロックに基づいた スタックさ
れたWhat-Where AutoEncoderのトレーニング
Keras サンプルコード紹介(5)
[mnist_transfer_cnn.py] 翻訳学習玩具の例
[neural_doodle.py] ニューラルいたずら書き
[neural_style_transfer.py] ニューラルスタイル変換
[pretrained_word_embeddings.py] 凍結したKeras 埋め込みレイヤに事前トレーニ
ング済みの単語埋め込み(GloVe埋め込み)をロードし、20 ニュースグループデー
タセット上のテキスト分類モデルの訓練への使用
[reuters_mlp.py] ロイターニュースワイヤトピック分類タスクにおける簡単な
MLPのトレーニングと評価
[stateful_lstm.py] stateful RNNsを使った長いシーケンスを効率的にモデル化する
方法のデモ
Keras サンプルコード紹介(6)
[variational_autoencoder.py] variational autoencoder 構築方法のデモ
[variational_autoencoder_deconv.py] Kerasにおけるデコンボリューションレイヤ
を使ったvariational autoencoderの構築方法のデモ
TensorBoardの利用
TensorBoardの表示は、モデル学習時のlogファイルを使用します。事前にlogフォ
ルダを作成し、サンプルファイル実行後TensorBoardを開きます。
> mkdir ~/tflog
ソースコードにログ出力のためのコードを追加(参考)qiita と実行
tensorboard の実行
> tensorboard --logdir=~/tflog/
ブラウザで閲覧 http://localhost:6006
Keras による転移学習(fine tuning)の実践
Kerasの応用は事前学習した重みを利用可能な深層学習のモデルです. これらの
モデルは予測,特徴量抽出そしてfine-tuningのために利用できます.モデルをイ
ンスタンス化すると重みは自動的にダウンロードされます.重みは
~/.keras/models/に格納されます.¥
利用可能なモデル (ImageNetで学習した重みをもつ画像分類のモデル)
[Xception] Inception と depthwise separable convolution の間の中間的なモデル
[VGG16,19] VGGというチームが考案した16層~19層のニューラルネット
[ResNet50] 2015年のILSVRCコンペ優勝モデル。層の入力を参照した残差関数を
学習。最大1000層以上の深いニューラルネットワークを構築することが可能。
[InceptionV3] 2014年のILSVRCコンペ優勝モデルGoogLeNetの改良版。
Kaggle とは
企業や研究者がデータを投稿
し、世界中の統計家やデータ
分析家がその最適モデルをコ
ンペ(懸賞)で競い合う場所。
現在は、Google傘下で運営
されている。
Cifar10
一般物体認識のベンチマークとして用いられるデータセット。作者はモデル作成
でもILSVRC2012で優勝した Alex Krinzhvsky さん。特徴は以下
画像枚数 : 60,000枚
画像サイズ : 32ピクセルx32ピクセル
画像種別 : RGB3チャンネル
クラスラベル : 10種類(airplane, automobile, bird, cat, deer, dog, frog, horse,
ship, truck)
ラベル内訳 : 訓練画像50000枚、テスト画像10000枚
画像形式 : PythonのcPickle形式で提供されている
VGG16による Dog vs Cats 分類
VGG16
VGGというチームに所属する
Karen Simonyan氏とAndrew
Zisserman氏の 2人が、
ILSVRC2014に参加し、第2 位を
獲得した学習済みモデルがVGG-
16と呼ばれています。
Xception のコード・リーディング
https://github.com/bluemooninc/ikinari-ai/blob/master/app/xception.py
モデル
Kerasの作者であり、Googleのエンジニアである
François Chollet氏が発明したXceptionというモデ
ルを使用しました。
論文によると、XceptionはImageNetという有名な
画像分類のデータセットに対し、これまた有名な
モデルであるVGG、Inception V3、ResNetよりも
高い認識精度を達成しているとのことです。
【参考】ImageNetのTop5エラー率の推移
出典:
https://www.slideshare.net/mlprague/xuedong-
huang-deep-learning-and-intelligent-applications
p.7
主要なメソッド
http://qiita.com/tadOne/items/b484ce9f973a9f80036e
Conv2D 2次元入力をフィルターする畳み込み層
BatchNormalization バッチ標準化
Activation('relu' 活性化関数(ランプ関数
SeparableConv2D 分割された2次元入力をフィルターする畳み込み層
MaxPooling2D フィルタ出力層の小領域をまとめる処理
layers.add レイヤーへの追加
Xception を応用し自前のモデル作成
参考URLより自分が分類したい画像を集めて独自に学習し、判別する。
https://github.com/bluemooninc/keras-ppap
Pen, Apple, Pinapple を判定するサンプル。
Kaggelデータ・セットを利用したリアルタイム顔認
識リアルタイム表情認識・・・WebCamのストリーミングをOpenCVでキャプチャ
ーしつつ顔認識の画像をTensorFlowに流して表情を読み取るサンプルです。
リアルタイム表情認識2・・・dlibを使用したサンプル。OpenCVと比べると処理
が思いが精度が良い。
OpenCV For Ubuntu 16.04
sudo apt-get install -y build-essential checkinstall cmake pkg-config yasm gfortran git
sudo apt-get install -y libjpeg8-dev libjasper-dev libpng12-dev
sudo apt-get install -y libtiff5-dev
sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-
dev
sudo apt-get install -y libxine2-dev libv4l-dev
sudo apt-get install -y libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt-get install -y libqt4-dev libgtk2.0-dev libtbb-dev
sudo apt-get install -y libatlas-base-dev
sudo apt-get install -y libfaac-dev libmp3lame-dev libtheora-dev
sudo apt-get install -y libvorbis-dev libxvidcore-dev
sudo apt-get install -y libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt-get install -y x264 v4l-utils
OpenCV
https://www.learnopencv.com/install-opencv3-on-ubuntu/
cmake -D CMAKE_BUILD_TYPE=RELEASE ¥
-D CMAKE_INSTALL_PREFIX=/usr/local ¥
-D INSTALL_C_EXAMPLES=ON ¥
-D INSTALL_PYTHON_EXAMPLES=ON ¥
-D WITH_TBB=ON ¥
-D WITH_V4L=ON ¥
-D WITH_QT=ON ¥
-D WITH_OPENGL=ON ¥
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ¥
-D BUILD_EXAMPLES=ON ..
nproc # CPUコア数の表示
make -j8 ## コア数指定
sudo make install
sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
dlib のインストール
## dlib は C++ 用の画像専用機械学習ライブラリ
## サンプルでは OpenCVと同等の機能を使用してます
sudo apt-get install -y cmake gfortran graphicsmagick libgraphicsmagick1-dev
libatlas-dev libavcodec-dev libavformat-dev libboost-all-dev libgtk2.0-dev libjpeg-
dev liblapack-dev libswscale-dev python-dev python-protobuf software-properties-
common
sudo pip install dlib
Variational Autoencoder による画像生成
pip install matplotlib
pip install opencv-python
sudo apt-get install python3-tk
time python variational_autoencoder.py
time python variational_autoencoder_deconv.py
real 6m26.656s
user 2m30.900s
sys 1m25.964s
variational_autoencoder.py なんかでた!!!
variational_autoencoder_deconv.py
データが持つ抽象的な表現を可視化したもの
Variational Autoencoder
入力と出力が同じになるようにニ
ューラルネットワークを学習させ
るものです。入力をラベルとして
扱っていて、教師あり学習と教師
なし学習の中間に位置するような
存在です。普通のニューラルネッ
トワークと同様に勾配降下法
(gradient descent)などを使っ
て学習させることができます。
PIX2PIX
https://github.com/affinelayer/pix2pi
x-tensorflow
AWSのGPUを使っても10時間程
かかります。
CycleGAN
https://github.com/junyanz/pytorch-
CycleGAN-and-pix2pix

いきなりAi tensor flow gpuによる画像分類と生成

Editor's Notes

  • #39 この配列を 28 x 28 = 784 数値のベクタに平坦化できます。
  • #46 LSTMとはLong-Short-Term-Memoryの略です。これはリカレントニューラルネットワークの一つであり、時系列データを扱う際に大きな効力を発揮します。主に使われている分野としては ・音声認識 ・映像認識