Pythonによる機械学習⼊⾨〜SVMからDeep Learningまで〜
第22回 画像センシングシンポジウムチュートリアル講演会
名古屋⼤学 情報科学研究科メディア科学専攻 助教
川⻄康友
1
⾃⼰紹介l経歴
Ø 2012年 京都⼤学⼤学院 情報学研究科 博⼠後期課程修了Ø 2012年 京都⼤学 学術情報メディアセンター 特定研究員Ø 2014年 名古屋⼤学 未来社会創造機構 特任助教Ø 2015年名古屋⼤学情報科学研究科助教
l研究テーマØ⼈物画像処理
²⼈物検出²⼈物追跡²⼈物検索²⼈物照合²歩⾏者属性認識
Ø背景画像推定← Pythonを使⽤
← ⼀部Pythonを使⽤← ⼀部Pythonを使⽤
2
本⽇の内容l機械学習とはl識別器の発展・流⾏の歴史l機械学習の枠組みlPythonでの機械学習l各種⼿法の⽐較lDeep Learningの利⽤lまとめ
サンプルコードはgithubにありますhttps://github.com/yasutomo57jp/ssii2016_tutorial
3
このチュートリアルを聴くと…l初学者
ØPythonを使って機械学習,クラス分類問題のプログラムが書けるようになる
l画像処理の専⾨家Ø機械学習の様々なアルゴリズムを
簡単に⽐較できるようになる
機械学習とはlデータから規則性や知識を⾒つけること
l出来ることØ回帰
²関数のパラメータを推定するØクラス分類
²クラスを分類する基準,ルールを⾒つけるØクラスタリング
²データを複数の集合に分割するルールを⾒つける
データに潜む規則性知識を発⾒
⼤量のデータ
機械学習
4
機械学習の例:多クラス分類l画像分類問題
Ø画像を⼊⼒として,どのクラスに属するかを出⼒Ø例
²MNIST:⼿書き⽂字認識²bird-200:⿃の200種分類問題²Caltech-101:101種類の物体認識
分類する基準を,⼤量の学習データから機械学習によって獲得する
5
機械学習による多クラス分類器の構築
学習データの準備• 画像+正解クラスラベルのペアを収集
特徴量の抽出• 画像から分類に適した特徴を取り出す
多クラス分類器の学習• ⼊⼒:特徴量+正解クラスラベル• 出⼒:多クラス分類器のパラメータ
=分類を⾏うための基準
機械学習
問題に応じて,様々なクラス分類器が提案されている
6
クラス分類器の発展・流⾏の歴史
1950 1960 1970 1980 1990 2000 2010
線形SVM (1963)
パーセプトロン (1958)
⾮線形SVM (1992)
バックプロパゲーション(1986)
AdaBoost (1995)
Random Forest (2001)
Deep Learningの流⾏(2006〜)
プレトレーニング
GPUの活⽤
多層化
汎化性能の向上 ⾮線形の問題へ
Bagging (1996)
ニューラルネットが下⽕に
7
多クラス分類器の学習と評価l学習段階
l評価段階
学習データの準備
識別器の初期化
識別器の学習
評価データの準備
評価データの分類
結果の集計,出力
プログラムによって実現
特徴量と正解ラベルのペア 評価データをクラス分類器にかける
クラス分類器が得られる特徴量と正解ラベルのペア
8
多クラス分類器の実現lよく使われるプログラミング⾔語/ツール
ØC/C++ØMatlabØRØPythonØその他(GUIで⼿軽に使えるもの)
²Weka (Java), Orange(Python), …
⼈⼯知能(機械学習)ブーム+
機械学習ではPythonがよく使われる
9
Pythonのいいところl無料で使えるl実⾏・デバッグが容易
Øスクリプト⾔語であるメリットlシンプルで覚えやすい
Ø基本的な⽂法が簡単lどの環境でも動く
ØWin, Mac, Linuxl様々なモジュールが存在lCとの組み合わせも可能
10
Pythonとモジュールl Pythonは基本機能はとてもシンプル
Ø 拡張モジュールが豊富²⾏列演算など:numpy²科学技術計算など:scipy²グラフの描画など:matplotlib²機械学習:scikit-learn²ディープラーニング:pylearn2, caffe, chainer²画像処理:pillow, scikit-image, opencv²シミュレーション:simpy²解析的な計算:theano²インタラクティブシェル:ipython
Ø https://pypi.python.org/pypi で公開² easy_install コマンドや,pip コマンドで簡単にインストール可能²⾃作モジュールを簡単に公開できる機能もある
11
Pythonでの機械学習
l機械学習パッケージ scikit-learnØhttp://scikit-learn.org/Ø機械学習に関する
様々な⼿法が実装されたライブラリ²クラス分類²クラスタリング²回帰²データマイニング
ØBSDライセンス
12
scikit-learnで扱うことのできる問題⼀覧
解きたい問題に対して何を使えば良いのかのガイドも載っています
13
多クラス分類問題の例題lMNIST database of handwritten digits
Ø0〜9の⼿書き数字認識問題Ø7万枚の画像+正解ラベルØ例題としてよく利⽤されるØscikit-learnでもデータセットが提供されている
²fetch_mldata("MNIST original") で取得可能
14
Pythonによる実装
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
学習段階
評価段階
説明の都合上,学習段階と評価段階をつなげたコードで説明します
15
Pythonによる実装
線形Support Vector Machine (線形SVM)を使った実装例
16
12345
678
910
11
1213
fromsklearn.datasets import fetch_mldatafromsklearn.cross_validation import train_test_splitfromsklearn.svm importLinearSVCfromsklearn.metrics importconfusion_matriximportnumpyasnp
mnist =fetch_mldata("MNISToriginal", data_home=".")data=np.asarray(mnist.data,np.float32)data_train,data_test,label_train,label_test =train_test_split(data,mnist.target,test_size=0.2)
classifier=LinearSVC()classifier.fit(data_train,label_train)
result=classifier.predict(data_test)
cmat =confusion_matrix(label_test, result)print(cmat)
たった13行で書けてしまう!
Pythonによる実装
from sklearn.datasets import fetch_mldatafromsklearn.cross_validation import train_test_splitfrom sklearn.svm import LinearSVCfrom sklearn.metrics import confusion_matriximport numpy as np
mnist = fetch_mldata("MNIST original", data_home=".")data = np.asarray(mnist.data, np.float32)data_train, data_test, label_train, label_test = train_test_split
classifier = LinearSVC()classifier.fit(data_train, label_train)
result = classifier.predict(data_test)
cmat = confusion_matrix(label_test, result)print(cmat)
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
17
必要なモジュールの読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
from sklearn.datasets import fetch_mldata
from sklearn.svm import LinearSVC
機械学習⽤の様々なサンプルデータを取得する関数をインポート
線形SVMを利⽤するためにLinearSVMクラスをインポート
import numpy as np
特徴量を扱うために数値計算パッケージのnumpyをnpという別名でインポート
from sklearn.cross_validation import train_test_split
学習データと評価データを分割するための関数をインポート
from sklearn.metrics import confusion_matrix
結果を混同⾏列で評価するための関数をインポート
18
mnist = fetch_mldata("MNIST original", data_home=".")
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
MNIST datasetのオリジナルデータを取得mnist.data 特徴量を格納した⾏列mnist.target 正解ラベルの配列
data_train, data_test, label_train, label_test = ¥train_test_split(data, mnist.target, test_size=0.2)
特徴量と正解ラベルを学習データと評価データへ分割
後の処理のために特徴量の型を浮動⼩数点型へ変換
data = np.array(mnist.data, np.float32)
19
mnist = fetch_mldata("MNIST original", data_home=".")
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
MNIST datasetのオリジナルデータを取得mnist.data 特徴量を格納した⾏列mnist.target 正解ラベルの配列
[[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0],...,[0, 0, 0, ..., 0, 0, 0]] [ 0., 0., ..., 9., 9.]
mnist.data mnist.target
各⾏には,1枚の画像を1⾏に伸ばしたもの(画素値)が格納されている
正解値の配列0~9の値をもつ
20
mnist = fetch_mldata("MNIST original", data_home=".")
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
MNIST datasetのオリジナルデータを取得mnist.data 特徴量を格納した⾏列mnist.target 正解ラベルの配列
data_train, data_test, label_train, label_test = ¥train_test_split(data, mnist.target, test_size=0.2)
特徴量と正解ラベルを学習データと評価データへ分割
後の処理のために特徴量の型を浮動⼩数点型へ変換
data = np.array(mnist.data, np.float32)
21
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
data_train, data_test, label_train, label_test = ¥train_test_split(data, mnist.target, test_size=0.2)
特徴量と正解ラベルを学習データと評価データへ分割
[[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0],...,[0, 0, 0, ..., 0, 0, 0]] [ 0., 0., ..., 9., 9.]
mnist.data mnist.target
data_test label_testdata_train label_train学習データ 評価データ
2割を評価用にする
22
識別器の初期化・学習
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
classifier = LinearSVC()
線形SVMのクラスのインスタンスを⽣成引数で,ソフトマージンのパラメータ等を指定可能
classifier.fit(data_train, label_train)
学習データ(特徴量,正解ラベル)を⽤いて識別器の学習を実⾏
特徴量 正解ラベル
23
評価
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
result = classifier.predict(data_test)
評価データの特徴量を,学習済み分類器で分類する
特徴量
分類結果正解ラベル同様,0〜9の値をもつ配列
24
結果の集計・出⼒
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒accuracy = accuracy_score(label_test, result)print(accuracy)
全体として何%の認識率なのかを調査
cmat = confusion_matrix(label_test, result)print(cmat)
混同⾏列での評価をする場合
認識率での評価をする場合
正解ラベル 分類結果
どのクラスへの誤分類が多いかを調査
from sklearn.metrics import accracy_score
25
MNIST datasetの分類結果
0 1 2 3 4 5 6 7 8 90 1282 0 15 0 0 6 33 1 8 91 01503 9 0 2 5 2 2 8 62 24 201266 3 14 3 29 9 22 103 19 20 1001162 4 43 15 12 38 324 5 12 9 11151 4 36 4 2 1075 33 11 14 34 341020 58 2 42 356 10 6 8 0 3 151360 0 3 17 4 24 39 4 17 1 41108 6 2348 33 91 81 13 29 58 27 1 932 999 9 12 7 9 37 8 0 36 71314
分類器 認識率 学習時間(秒) 評価時間(秒)線形SVM 0.864 130.0 0.032
PCのスペックCPU: Intel® Core™ i7-5930K 3.50GHzGPU: GeForce GTX Titan X
26
識別器を⾃由に切り替える
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
classifier = LinearSVC()
書き換えが必要なのは2箇所
classifier = SVC()
classifier = KNeighborsClassifier()
classifier = AdaBoostClassifier()
classifier = RandomForestClassifier()
from sklearn.svm import LinearSVC
① モジュールの読み込み
② 識別器の初期化
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import RandomForestClassifier
27
識別器を⾃由に切り替える
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
classifier = CLF()
インポート時に名前を付けておくと
from sklearn.svm importLinearSVC as CLF
① モジュールの読み込み
② 識別器の初期化
from sklearn.svm import SVC as CLF
from sklearn.neighbors import KNeighborsClassifier as CLF
from sklearn.ensemble import AdaBoostClassifier as CLF
from sklearn.ensemble import RandomForestClassifier as CLF
この部分を書き換える必要がなくなる
この場合1⾏書き換えるだけで,各種分類器を切り替えて利⽤・⽐較することが可能!
様々な識別器での結果
分類器 認識率 学習時間(秒) 評価時間(秒)線形SVM 0.864 130.0 0.032K-Nearest Neighbor 0.970 20.70 702.9AdaBoost 0.719 64.74 0.519Random Forest 0.946 1.026 0.152
【注意】全てデフォルトのパラメータを利⽤パラメータチューニングによって性能は変化する学習・評価サンプルの分割⽅法によっても結果は変化する
PCのスペックCPU: Intel® Core™ i7-5930K 3.50GHzGPU: GeForce GTX Titan X
28
mnist = fetch_mldata("MNIST original", data_home=".")
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
今回はMINST databaseを使ったが…
load_svmlight_file(filename)
1. OpenCV等を使って予め特徴抽出し,保存
別の取り組みたい問題のために⾃前で抽出した特徴量を使う場合
2. 保存した特徴量を読み込んでクラス分類
データの保存には svmlight 形式が便利読み込み⽤の関数が存在特徴量とラベルをまとめて読み込める
29
svmlight / libsvm 形式llibsvmなどのツールで利⽤されている形式
Øそのまま svm-train などのコマンドでも利⽤可
1 1:0.111 2:0.253 3:0.123 4:-0.641 …1 1:0.121 2:0.226 3:0.143 4:-0.661 …2 1:0.511 2:-0.428 3:0.923 4:0.348 …2 1:0.751 2:-0.273 3:0.823 4:0.632 …
クラスラベル
特徴量の次元番号:特徴量の値の組が次元数分ある
DEEP LEARNINGの利⽤
30
Deep Learningl 近年ものすごく注⽬を集めている
l 様々なニュースでも話題Ø Audi、⾃動運転成功の鍵はディープラーニングと発表Ø Facebook、“ほぼ⼈間レベル”の顔認識技術「DeepFace」を発表Ø グーグルの⼈⼯知能、囲碁の欧州チャンピオンに5連勝
Googleトレンドでの「Deep Learning」の調査結果
31
Deep Learningのためのツール
名前 開発元 環境 ⾔語 導⼊の容易さ
GPU化の容易さ その他
neural network toolbox
MathWorks WindowsMacLinux
Matlab ◎ ?
caffe BVLC Linux C++Python
△ ◎ 画像に強い
TensorFlow Google LinuxMac
Python ○ ○ AlphaGo
Torch7 Facebook LinuxMac
Lua ○ ○
chainer PreferredNetworks
LinuxMacWindows
Python ◎ ○
32
Deep Learningのためのツール
名前 開発元 環境 ⾔語 導⼊の容易さ
GPU化の容易さ その他
neural networktoolbox
MathWorks WindowsMacLinux
Matlab ◎ ?
caffe BVLC Linux C++Python
△ ◎ 画像に強い
TensorFlow Google LinuxMac
Python ○ ○ AlphaGo
Torch7 Facebook LinuxMac
Lua ○ ○
chainer PreferredNetworks
LinuxMacWindows
Python ◎ ○今回はChainerでの実装例を紹介する
33
今回紹介する実装lクラス分類器として
Ø(Deep) Neural NetworkØ3層のニューラルネットワークを例に説明
l特徴抽出+クラス分類器としてØConvolutional Neural NetworkØConvolution 2層,全結合3層を例に
34
35クラス分類器としてのDeep Learning
l⼩規模なニューラルネットワークを例に
重み付き和→活性化関数 重み付き和→活性化関数
いくつかの隠れ層 クラス数分の
出⼒ユニット特徴量の次元数分の⼊⼒ユニット
誤差逆伝播法による学習
決める必要があるものl層のパラメータ
Ø層数Ø各層のユニット数
l伝播のさせかたØ活性化関数
l学習のさせかたØ最適化⽅法
重み付き和→活性化関数 重み付き和→活性化関数 ・・・誤差逆伝播法による学習
36
決める必要があるものl層のパラメータ
Ø層数Ø各層のユニット数
l伝播のさせかたØ活性化関数
l学習のさせかたØ最適化⽅法
重み付き和→活性化関数 重み付き和→活性化関数 ・・・誤差逆伝播法による学習
37
決める必要があるものl層のパラメータ
Ø層数Ø各層のユニット数
l伝播のさせかたØ活性化関数
l学習のさせかたØ最適化⽅法
重み付き和→活性化関数 重み付き和→活性化関数 ・・・誤差逆伝播法による学習
38
決める必要があるものl層のパラメータ
Ø層数Ø各層のユニット数
l伝播のさせかたØ活性化関数
l学習のさせかたØ最適化⽅法
重み付き和→活性化関数 重み付き和→活性化関数 ・・・誤差逆伝播法による学習
39
Deep Learningの処理⼿順
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
前半の機械学習の流れ
Deep Learning
の流れ
40
必要なモジュールの読み込み必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
from chainer import FunctionSetfrom chainer import Variablefrom chainer import optimizersimport chainer.functions as F
from sklearn.metrics import confusion_matriximport numpy as np
chainerで必要なものをインポート
その他,機械学習の評価⽤等のために必要なインポート
41
層のパラメータ必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
from chainer import FunctionSetimport chainer.functions as F
model = Chain(l1=F.Linear(784, 200),l2=F.Linear(200, 100),l3=F.Linear(100, 10))
・・・ ・・・
・・・
・・・
784 200 10010
・・・ ・・・
・・・
from chainer import FunctionSetimport chainer.functions as F
model = Chain(l1=F.Linear(784, 200),l2=F.Linear(200, 100),l3=F.Linear(100, 10))
⼊⼒層のユニット数 中間層のユニット数
from chainer import Chainimport chainer.functions as F
model = Chain(l1=F.Linear(784, 200),l2=F.Linear(200, 100),l3=F.Linear(100, 10))
出⼒層のユニット数ネットワークのパラメータを保持するオブジェクト
42
l1 l2 l3
伝播のさせ⽅必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
・・・ ・・・
・・・
・・・
784 200 10010
def forward(x, train=True):h1 = F.sigmoid(model.l1(x))h2 = F.sigmoid(model.l2(h1))p = model.l3(h2)
return p
def forward(x, train=True):h1 = F.sigmoid(model.l1(x))h2 = F.sigmoid(model.l2(h1))p = model.l3(h2)
return p
43
活性化関数の変更l従来のニューラルネットワークでは
シグモイド関数がよく利⽤されるØDeep Learningでは勾配の計算の都合上,
ReLU (Rectified Linear Unit)などが利⽤される
lDropoutの導⼊による汎化性能向上Ø学習時,ランダムに誤差伝播を0にする
勾配が⼩さくなる 勾配⼀定
44
活性化関数の変更必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
def forward(x, is_train=True):h1 = F.sigmoid(model.l1(x))h2 = F.sigmoid(model.l2(h1))p = model.l3(h2)
return p
def forward(x, is_train=True):h1 = F.relu(model.l1(x))h2 = F.relu(model.l2(h1))p = model.l3(h2)
return p
def forward(x, is_train=True):h1 = F.dropout(F.relu(model.l1(x)), train=is_train)h2 = F.dropout(F.relu(model.l2(h1)), train=is_train)p = model.l3(h2)
return p
• 活性化関数をReLUにする• Dropoutを追加する
45
学習のさせ⽅必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
optimizer = optimizers.Adam()optimizer.setup(model)
SGD ( Stochastic Gradient Descent)AdaGradRMSpropAdam (ADAptive Moment estimation)
modelを登録する
⾊々なパラメータ更新⽅法が利⽤可
学習率を⾃動的に調整する改良
基本的には確率的勾配法が利⽤される
確率的勾配法のバリエーション
46
ネットワークの学習の流れ必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
ミニバッチによる逐次的な学習学習データが膨⼤:
→ランダムに分割し,少しずつ学習
ネットワークの学習
学習データをミニバッチへ分割して学習
指定回数の繰り返し
ミニバッチごとの繰り返し
誤差逆伝播法による最適化
47
ネットワークの学習 1/2必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
x_batch = data_train[perm[i:i+batchsize]]t_batch = label_train[perm[i:i+batchsize]]
optimizer.zero_grads()
x = Variable(x_batch)t = Variable(t_batch)p = forward(x)
loss = F.softmax_cross_entropy(p, t)accuracy = F.accuracy(p, t)
loss.backward()
optimizer.update()
ミニバッチごとの誤差逆伝播法による学習
ミニバッチ
型を変換
ネットワークを通した結果
誤差を評価誤差の逆伝播
パラメータの更新
48
ネットワークの学習の流れ必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
ミニバッチによる逐次的な学習学習データが膨⼤:
→ランダムに分割し,少しずつ学習
ネットワークの学習
学習データをミニバッチへ分割して学習
指定回数の繰り返し
ミニバッチごとの繰り返し
誤差逆伝播法による最適化
49
ネットワークの学習 2/2
perm = np.random.permutation(N)sum_accuracy = 0sum_loss = 0for i in range(0, N, batchsize):
(前述の順伝播,誤差逆伝播で lossとaccuracyを得る)
sum_loss += float(loss.data) * batchsizesum_accuracy += float(accuracy.data) * batchsize
l = sum_loss / Na = sum_accuracy /Nprint("loss: %f, accuracy: %f" % (l, a))
ミニバッチの分割の仕⽅を決定
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
ミニバッチの分割と繰り返し
この処理を,ミニバッチの分割の仕⽅を変えながらepoch分繰り返す
繰り返し回数
50
ネットワークの学習の流れ必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
ミニバッチによる逐次的な学習学習データが膨⼤:
→ランダムに分割し,少しずつ学習
ネットワークの学習
学習データをミニバッチへ分割して学習
指定回数の繰り返し
ミニバッチごとの繰り返し
誤差逆伝播法による最適化
51
評価のしかた
test_input = Variable(data_test)result_scores = forward(test_input, is_train=False)
各クラスのスコアが出てくるのでargmax を取る
今回は学習時ではない= Dropoutしない
results = np.argmax(result_scores, axis=1)
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
評価データをネットワークに通す
最終出⼒層の最⼤値を選択
52
CUDAによるGPUを使った⾼速化
model = Chain(l1=F.Linear(784, 200),l2=F.Linear(200, 100),l3=F.Linear(100, 10)).to_gpu()
x = Variable(cuda.to_gpu(x_batch))
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
CPU上での計算をGPU上へ移す (to_gpu())model と Variableへ渡す変数をGPUへ
GPUの利⽤
from chainer import cuda
必要なモジュールをインポート
modelをGPUへ
Variableへ渡す変数をGPUへ
53
MINST databaseでの分類結果
分類器 認識率 学習時間(秒) 評価時間(秒)線形SVM 0.864 130.0 0.032K-Nearest Neighbor 0.970 20.70 702.9AdaBoost 0.719 64.74 0.519Random Forest 0.946 1.026 0.152Neural Network (GPU) 0.970 1018.9(cpu: 1906) 0.063
【注意】ニューラルネットの学習は100回繰り返した.
PCのスペックCPU: Intel® Core™ i7-5930K 3.50GHzGPU: GeForce GTX Titan X
54
特徴抽出+識別器としてのDeep Learning
lConvolution層を持つニューラルネットワークØ局所的にのみ連結されたネットワーク
²画像処理における畳み込みフィルタ(convolution)に相当
Ø位置ずれへの頑健性²Pooling: 局所領域の特徴を集約16チャンネル
1チャンネル
ConvolutionPooling
64チャンネル16チャンネル
ConvolutionPooling
64チャンネル
55
CNNを使う時の処理⼿順必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
前述のD
eep Learning
の処理の⼿順
CNN
を使う場合の処理の⼿順
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
56
画像の読み込み必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
def conv_feat_2_image(feats):data = np.ndarray((len(feats), 1, 28, 28),
dtype=np.float32)for i, f in enumerate(feats):
data[i]=f.reshape(28,28)return data
train_images = conv_feat_2_image(train_features)test_images = conv_feat_2_image(test_features)
学習データ,評価データを画像列に変換する
画像列に変換する関数
CNNへの⼊⼒は2次元画像[特徴量][特徴量]
…[特徴量]
画像画像画像画像
枚数xチャンネル数x⾼さx幅
枚数x次元数
57
層のパラメータ必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
model = Chain(conv1=F.Convolution2D(1, 16, 3), conv2=F.Convolution2D(16, 64, 3), l1=F.Linear(576, 200),l2=F.Linear(200, 100),l3=F.Linear(100, 10)).to_gpu()
Convolution層が2つ,全結合層が3つ
モノクロ1→16チャンネル
16→64チャンネル
16チャンネル1チャンネル
Convolution3x3のフィルタ
16種類のフィルタ
Convolution層を追加する
58
伝播のさせ⽅必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
Pooling層を追加する
def forward(x, is_train=True):h1 = F.max_pooling_2d(F.relu(model.conv1(x)), 3)h2 = F.max_pooling_2d(F.relu(model.conv2(h1)), 3)h3 = F.dropout(F.relu(model.l1(h2)), train=is_train)h4 = F.dropout(F.relu(model.l2(h3)), train=is_train)p = model.l3(h4)return p
16チャンネル 16チャンネル
Pooling3x3
3x3の領域内で最⼤値を返す
59
特徴抽出+識別器としてのDeep Learning
lConvolution+Poolingのユニット数の計算Ø画像サイズの変化
²フィルタサイズとPoolingの移動幅によって決まるØ全結合層のユニット数
²最後のPooling後の画像サイズxチャンネル数
16チャンネル1チャンネル
ConvolutionPooling
64チャンネル16チャンネル
ConvolutionPooling
64チャンネル
28x28 26x26 9x9 8x8 3x3
3x3x64=576
MINST databaseでの分類結果
分類器 認識率 学習時間(秒) 評価時間(秒)線形SVM 0.864 130.0 0.032K-Nearest Neighbor 0.970 20.70 702.9AdaBoost 0.719 64.74 0.519Random Forest 0.946 1.026 0.152Neural Network (GPU) 0.970 1018(cpu:1906) 0.063CNN (GPU) 0.983 1509(cpu: 36324) 0.049
【注意】ニューラルネットの学習は100回繰り返した
PCのスペックCPU: Intel® Core™ i7-5930K 3.50GHzGPU: GeForce GTX Titan X
60
まとめ
lPythonでの機械学習Øscikit-learnで多様なクラス分類器を利⽤可
²2⾏の書き換えだけでOK
Øchainerを使えば簡単にDeep Learningを利⽤可²CUDAがあればGPU上での動作も容易
lデータが⼤量にあればDeep Learningは強⼒ØCNNで特徴抽出+分類器学習で⾼精度なのを確認
61
参考⽂献・Webページl今回のサンプルコード
Ø https://github.com/yasutomo57jp/ssii2016_tutorial
l電⼦情報通信学会総合⼤会 2016 企画セッション「パターン認識・メディア理解」必須ソフトウェアライブラリ ⼿とり⾜とりガイドØhttp://www.slideshare.net/yasutomo57jp/pythonde
ep-learning-60544586
62
Pythonを勉強するための資料集l Python Scientific Lecture Notes
Ø ⽇本語訳: http://turbare.net/transl/scipy-lecture-notes/index.htmlØ ⾮常におすすめØ numpy/scipyから画像処理,3D可視化まで幅広く学べる
l @shima__shimaさんØ 機械学習の Python との出会い
² numpyと簡単な機械学習への利⽤
l @payashimさんØ PyConJP 2014での「OpenCVのpythonインターフェース⼊⾨」の資料
² Pythonユーザ向けの,OpenCVを使った画像処理解説
63
今回説明しきれなかった内容lPythonのプログラミングのコツl機械学習のより発展的な内容
Øscikit-learn でのクロスバリデーションの⽅法Ø学習済みモデルを使ったFine-tuningの⽅法ØRecurrent Neural Networkの作り⽅
64
ぜひ質問ブースへお越しください