pythonによる機械学習入門 ~svmからdeep learningまで~

68
Pythonによる機械学習⼊⾨ 〜SVMからDeep Learningまで〜 第22回 画像センシングシンポジウム チュートリアル講演会 名古屋⼤学 情報科学研究科 メディア科学専攻 助教 川⻄康友 1

Upload: yasutomo-kawanishi

Post on 16-Apr-2017

34.163 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

Pythonによる機械学習⼊⾨〜SVMからDeep Learningまで〜

第22回 画像センシングシンポジウムチュートリアル講演会

名古屋⼤学 情報科学研究科メディア科学専攻 助教

川⻄康友

1

Page 2: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

⾃⼰紹介l経歴

Ø 2012年 京都⼤学⼤学院 情報学研究科 博⼠後期課程修了Ø 2012年 京都⼤学 学術情報メディアセンター 特定研究員Ø 2014年 名古屋⼤学 未来社会創造機構 特任助教Ø 2015年名古屋⼤学情報科学研究科助教

l研究テーマØ⼈物画像処理

²⼈物検出²⼈物追跡²⼈物検索²⼈物照合²歩⾏者属性認識

Ø背景画像推定← Pythonを使⽤

← ⼀部Pythonを使⽤← ⼀部Pythonを使⽤

2

Page 3: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

本⽇の内容l機械学習とはl識別器の発展・流⾏の歴史l機械学習の枠組みlPythonでの機械学習l各種⼿法の⽐較lDeep Learningの利⽤lまとめ

サンプルコードはgithubにありますhttps://github.com/yasutomo57jp/ssii2016_tutorial

3

Page 4: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

このチュートリアルを聴くと…l初学者

ØPythonを使って機械学習,クラス分類問題のプログラムが書けるようになる

l画像処理の専⾨家Ø機械学習の様々なアルゴリズムを

簡単に⽐較できるようになる

Page 5: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

機械学習とはlデータから規則性や知識を⾒つけること

l出来ることØ回帰

²関数のパラメータを推定するØクラス分類

²クラスを分類する基準,ルールを⾒つけるØクラスタリング

²データを複数の集合に分割するルールを⾒つける

データに潜む規則性知識を発⾒

⼤量のデータ

機械学習

4

Page 6: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

機械学習の例:多クラス分類l画像分類問題

Ø画像を⼊⼒として,どのクラスに属するかを出⼒Ø例

²MNIST:⼿書き⽂字認識²bird-200:⿃の200種分類問題²Caltech-101:101種類の物体認識

分類する基準を,⼤量の学習データから機械学習によって獲得する

5

Page 7: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

機械学習による多クラス分類器の構築

学習データの準備• 画像+正解クラスラベルのペアを収集

特徴量の抽出• 画像から分類に適した特徴を取り出す

多クラス分類器の学習• ⼊⼒:特徴量+正解クラスラベル• 出⼒:多クラス分類器のパラメータ

=分類を⾏うための基準

機械学習

問題に応じて,様々なクラス分類器が提案されている

6

Page 8: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

クラス分類器の発展・流⾏の歴史

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

Page 9: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

多クラス分類器の学習と評価l学習段階

l評価段階

学習データの準備

識別器の初期化

識別器の学習

評価データの準備

評価データの分類

結果の集計,出力

プログラムによって実現

特徴量と正解ラベルのペア 評価データをクラス分類器にかける

クラス分類器が得られる特徴量と正解ラベルのペア

8

Page 10: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

多クラス分類器の実現lよく使われるプログラミング⾔語/ツール

ØC/C++ØMatlabØRØPythonØその他(GUIで⼿軽に使えるもの)

²Weka (Java), Orange(Python), …

⼈⼯知能(機械学習)ブーム+

機械学習ではPythonがよく使われる

9

Page 11: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

Pythonのいいところl無料で使えるl実⾏・デバッグが容易

Øスクリプト⾔語であるメリットlシンプルで覚えやすい

Ø基本的な⽂法が簡単lどの環境でも動く

ØWin, Mac, Linuxl様々なモジュールが存在lCとの組み合わせも可能

10

Page 12: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 13: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

Pythonでの機械学習

l機械学習パッケージ scikit-learnØhttp://scikit-learn.org/Ø機械学習に関する

様々な⼿法が実装されたライブラリ²クラス分類²クラスタリング²回帰²データマイニング

ØBSDライセンス

12

Page 14: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

scikit-learnで扱うことのできる問題⼀覧

解きたい問題に対して何を使えば良いのかのガイドも載っています

13

Page 15: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

多クラス分類問題の例題lMNIST database of handwritten digits

Ø0〜9の⼿書き数字認識問題Ø7万枚の画像+正解ラベルØ例題としてよく利⽤されるØscikit-learnでもデータセットが提供されている

²fetch_mldata("MNIST original") で取得可能

14

Page 16: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

Pythonによる実装

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

学習段階

評価段階

説明の都合上,学習段階と評価段階をつなげたコードで説明します

15

Page 17: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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行で書けてしまう!

Page 18: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 19: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

必要なモジュールの読み込み

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

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

Page 20: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 21: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 22: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 23: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

特徴量の読み込み

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

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

Page 24: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

識別器の初期化・学習

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

classifier = LinearSVC()

線形SVMのクラスのインスタンスを⽣成引数で,ソフトマージンのパラメータ等を指定可能

classifier.fit(data_train, label_train)

学習データ(特徴量,正解ラベル)を⽤いて識別器の学習を実⾏

特徴量 正解ラベル

23

Page 25: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

評価

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

result = classifier.predict(data_test)

評価データの特徴量を,学習済み分類器で分類する

特徴量

分類結果正解ラベル同様,0〜9の値をもつ配列

24

Page 26: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

結果の集計・出⼒

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒accuracy = accuracy_score(label_test, result)print(accuracy)

全体として何%の認識率なのかを調査

cmat = confusion_matrix(label_test, result)print(cmat)

混同⾏列での評価をする場合

認識率での評価をする場合

正解ラベル 分類結果

どのクラスへの誤分類が多いかを調査

from sklearn.metrics import accracy_score

25

Page 27: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 28: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

識別器を⾃由に切り替える

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

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

Page 29: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

識別器を⾃由に切り替える

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

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⾏書き換えるだけで,各種分類器を切り替えて利⽤・⽐較することが可能!

Page 30: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

様々な識別器での結果

分類器 認識率 学習時間(秒) 評価時間(秒)線形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

Page 31: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

mnist = fetch_mldata("MNIST original", data_home=".")

特徴量の読み込み

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

今回はMINST databaseを使ったが…

load_svmlight_file(filename)

1. OpenCV等を使って予め特徴抽出し,保存

別の取り組みたい問題のために⾃前で抽出した特徴量を使う場合

2. 保存した特徴量を読み込んでクラス分類

データの保存には svmlight 形式が便利読み込み⽤の関数が存在特徴量とラベルをまとめて読み込める

29

Page 32: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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 …

クラスラベル

特徴量の次元番号:特徴量の値の組が次元数分ある

Page 33: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

DEEP LEARNINGの利⽤

30

Page 34: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

Deep Learningl 近年ものすごく注⽬を集めている

l 様々なニュースでも話題Ø Audi、⾃動運転成功の鍵はディープラーニングと発表Ø Facebook、“ほぼ⼈間レベル”の顔認識技術「DeepFace」を発表Ø グーグルの⼈⼯知能、囲碁の欧州チャンピオンに5連勝

Googleトレンドでの「Deep Learning」の調査結果

31

Page 35: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 36: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 37: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

今回紹介する実装lクラス分類器として

Ø(Deep) Neural NetworkØ3層のニューラルネットワークを例に説明

l特徴抽出+クラス分類器としてØConvolutional Neural NetworkØConvolution 2層,全結合3層を例に

34

Page 38: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

35クラス分類器としてのDeep Learning

l⼩規模なニューラルネットワークを例に

重み付き和→活性化関数 重み付き和→活性化関数

いくつかの隠れ層 クラス数分の

出⼒ユニット特徴量の次元数分の⼊⼒ユニット

誤差逆伝播法による学習

Page 39: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

決める必要があるものl層のパラメータ

Ø層数Ø各層のユニット数

l伝播のさせかたØ活性化関数

l学習のさせかたØ最適化⽅法

重み付き和→活性化関数 重み付き和→活性化関数 ・・・誤差逆伝播法による学習

36

Page 40: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

決める必要があるものl層のパラメータ

Ø層数Ø各層のユニット数

l伝播のさせかたØ活性化関数

l学習のさせかたØ最適化⽅法

重み付き和→活性化関数 重み付き和→活性化関数 ・・・誤差逆伝播法による学習

37

Page 41: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

決める必要があるものl層のパラメータ

Ø層数Ø各層のユニット数

l伝播のさせかたØ活性化関数

l学習のさせかたØ最適化⽅法

重み付き和→活性化関数 重み付き和→活性化関数 ・・・誤差逆伝播法による学習

38

Page 42: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

決める必要があるものl層のパラメータ

Ø層数Ø各層のユニット数

l伝播のさせかたØ活性化関数

l学習のさせかたØ最適化⽅法

重み付き和→活性化関数 重み付き和→活性化関数 ・・・誤差逆伝播法による学習

39

Page 43: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

Deep Learningの処理⼿順

必要なモジュールの読み込み

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

前半の機械学習の流れ

Deep Learning

の流れ

40

Page 44: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

必要なモジュールの読み込み必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

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

Page 45: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

層のパラメータ必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

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

Page 46: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

伝播のさせ⽅必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

・・・ ・・・

・・・

・・・

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

Page 47: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

活性化関数の変更l従来のニューラルネットワークでは

シグモイド関数がよく利⽤されるØDeep Learningでは勾配の計算の都合上,

ReLU (Rectified Linear Unit)などが利⽤される

lDropoutの導⼊による汎化性能向上Ø学習時,ランダムに誤差伝播を0にする

勾配が⼩さくなる 勾配⼀定

44

Page 48: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

活性化関数の変更必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

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

Page 49: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

学習のさせ⽅必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

optimizer = optimizers.Adam()optimizer.setup(model)

SGD ( Stochastic Gradient Descent)AdaGradRMSpropAdam (ADAptive Moment estimation)

modelを登録する

⾊々なパラメータ更新⽅法が利⽤可

学習率を⾃動的に調整する改良

基本的には確率的勾配法が利⽤される

確率的勾配法のバリエーション

46

Page 50: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

ネットワークの学習の流れ必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

ミニバッチによる逐次的な学習学習データが膨⼤:

→ランダムに分割し,少しずつ学習

ネットワークの学習

学習データをミニバッチへ分割して学習

指定回数の繰り返し

ミニバッチごとの繰り返し

誤差逆伝播法による最適化

47

Page 51: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

ネットワークの学習 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

Page 52: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

ネットワークの学習の流れ必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

ミニバッチによる逐次的な学習学習データが膨⼤:

→ランダムに分割し,少しずつ学習

ネットワークの学習

学習データをミニバッチへ分割して学習

指定回数の繰り返し

ミニバッチごとの繰り返し

誤差逆伝播法による最適化

49

Page 53: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

ネットワークの学習 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

Page 54: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

ネットワークの学習の流れ必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

ミニバッチによる逐次的な学習学習データが膨⼤:

→ランダムに分割し,少しずつ学習

ネットワークの学習

学習データをミニバッチへ分割して学習

指定回数の繰り返し

ミニバッチごとの繰り返し

誤差逆伝播法による最適化

51

Page 55: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

評価のしかた

test_input = Variable(data_test)result_scores = forward(test_input, is_train=False)

各クラスのスコアが出てくるのでargmax を取る

今回は学習時ではない= Dropoutしない

results = np.argmax(result_scores, axis=1)

必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

評価データをネットワークに通す

最終出⼒層の最⼤値を選択

52

Page 56: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 57: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 58: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

特徴抽出+識別器としてのDeep Learning

lConvolution層を持つニューラルネットワークØ局所的にのみ連結されたネットワーク

²画像処理における畳み込みフィルタ(convolution)に相当

Ø位置ずれへの頑健性²Pooling: 局所領域の特徴を集約16チャンネル

1チャンネル

ConvolutionPooling

64チャンネル16チャンネル

ConvolutionPooling

64チャンネル

55

Page 59: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

CNNを使う時の処理⼿順必要なモジュールの読み込み

画像の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

前述のD

eep Learning

の処理の⼿順

CNN

を使う場合の処理の⼿順

必要なモジュールの読み込み

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

56

Page 60: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

画像の読み込み必要なモジュールの読み込み

画像の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

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

Page 61: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

層のパラメータ必要なモジュールの読み込み

画像の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

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

Page 62: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

伝播のさせ⽅必要なモジュールの読み込み

画像の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

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

Page 63: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

特徴抽出+識別器としてのDeep Learning

lConvolution+Poolingのユニット数の計算Ø画像サイズの変化

²フィルタサイズとPoolingの移動幅によって決まるØ全結合層のユニット数

²最後のPooling後の画像サイズxチャンネル数

16チャンネル1チャンネル

ConvolutionPooling

64チャンネル16チャンネル

ConvolutionPooling

64チャンネル

28x28 26x26 9x9 8x8 3x3

3x3x64=576

Page 64: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 65: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

まとめ

lPythonでの機械学習Øscikit-learnで多様なクラス分類器を利⽤可

²2⾏の書き換えだけでOK

Øchainerを使えば簡単にDeep Learningを利⽤可²CUDAがあればGPU上での動作も容易

lデータが⼤量にあればDeep Learningは強⼒ØCNNで特徴抽出+分類器学習で⾼精度なのを確認

61

Page 66: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

参考⽂献・Webページl今回のサンプルコード

Ø https://github.com/yasutomo57jp/ssii2016_tutorial

l電⼦情報通信学会総合⼤会 2016 企画セッション「パターン認識・メディア理解」必須ソフトウェアライブラリ ⼿とり⾜とりガイドØhttp://www.slideshare.net/yasutomo57jp/pythonde

ep-learning-60544586

62

Page 67: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

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

Page 68: Pythonによる機械学習入門 ~SVMからDeep Learningまで~

今回説明しきれなかった内容lPythonのプログラミングのコツl機械学習のより発展的な内容

Øscikit-learn でのクロスバリデーションの⽅法Ø学習済みモデルを使ったFine-tuningの⽅法ØRecurrent Neural Networkの作り⽅

64

ぜひ質問ブースへお越しください