KEMBAR78
Pythonによる機械学習入門 ~SVMからDeep Learningまで~ | PDF
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, Linux
l様々なモジュールが存在
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
1
2
3
4
5
6
7
8
9
10
11
12
13
from	sklearn.datasets import	fetch_mldata
from	sklearn.cross_validation import	train_test_split
from	sklearn.svm import	LinearSVC
from	sklearn.metrics import	confusion_matrix
import	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(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_mldata
from	sklearn.cross_validation import	train_test_split
from sklearn.svm import LinearSVC
from sklearn.metrics import confusion_matrix
import 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 = t
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 9
0 1282 0 15 0 0 6 33 1 8 9
1 01503 9 0 2 5 2 2 8 6
2 24 201266 3 14 3 29 9 22 10
3 19 20 1001162 4 43 15 12 38 32
4 5 12 9 11151 4 36 4 2 107
5 33 11 14 34 341020 58 2 42 35
6 10 6 8 0 3 151360 0 3 1
7 4 24 39 4 17 1 41108 6 234
8 33 91 81 13 29 58 27 1 932 99
9 9 12 7 9 37 8 0 36 71314
分類器 認識率 学習時間(秒) 評価時間(秒)
線形SVM 0.864 130.0 0.032
PCのスペック
CPU: Intel® Core™ i7-5930K 3.50GHz
GPU: 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 import	LinearSVC 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.032
K-Nearest Neighbor 0.970 20.70 702.9
AdaBoost 0.719 64.74 0.519
Random Forest 0.946 1.026 0.152
【注意】
全てデフォルトのパラメータを利⽤
パラメータチューニングによって性能は変化する
学習・評価サンプルの分割⽅法によっても結果は変化する
PCのスペック
CPU: Intel® Core™ i7-5930K 3.50GHz
GPU: 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 Learning
l 近年ものすごく注⽬を集めている
l 様々なニュースでも話題
Ø Audi、⾃動運転成功の鍵はディープラーニングと発表
Ø Facebook、“ほぼ⼈間レベル”の顔認識技術「DeepFace」を発表
Ø グーグルの⼈⼯知能、囲碁の欧州チャンピオンに5連勝
Googleトレンドでの「Deep Learning」の調査結果
31
Deep Learningのためのツール
名前 開発元 環境 ⾔語
導⼊の
容易さ
GPU化の
容易さ
その他
neural
network
toolbox
MathWorks Windows
Mac
Linux
Matlab ◎ ?
caffe BVLC Linux C++
Python
△ ◎ 画像に
強い
TensorFlow Google Linux
Mac
Python ○ ○ AlphaGo
Torch7 Facebook Linux
Mac
Lua ○ ○
chainer Preferred	
Networks
Linux
Mac
Windows
Python ◎ ○
32
Deep Learningのためのツール
名前 開発元 環境 ⾔語
導⼊の
容易さ
GPU化の
容易さ
その他
neural
network
toolbox
MathWorks Windows
Mac
Linux
Matlab ◎ ?
caffe BVLC Linux C++
Python
△ ◎ 画像に
強い
TensorFlow Google Linux
Mac
Python ○ ○ AlphaGo
Torch7 Facebook Linux
Mac
Lua ○ ○
chainer Preferred	
Networks
Linux
Mac
Windows
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の処理⼿順
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
前
半
の
機
械
学
習
の
流
れ
DeepLearning
の
流
れ
40
必要なモジュールの読み込み
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
from chainer import FunctionSet
from chainer import Variable
from chainer import optimizers
import chainer.functions as F
from sklearn.metrics import confusion_matrix
import numpy as np
chainerで必要なものをインポート
その他,機械学習の評価⽤等のために
必要なインポート
41
層のパラメータ
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
from chainer import FunctionSet
import chainer.functions as F
model = Chain(
l1=F.Linear(784, 200),
l2=F.Linear(200, 100),
l3=F.Linear(100, 10))
・・・
・・・
・・・
・・・
784 200 100
10
・・・
・・・
・・・
from chainer import FunctionSet
import chainer.functions as F
model = Chain(
l1=F.Linear(784, 200),
l2=F.Linear(200, 100),
l3=F.Linear(100, 10))
⼊⼒層のユニット数 中間層のユニット数
from chainer import Chain
import 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 100
10
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)
AdaGrad
RMSprop
Adam (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 = 0
sum_loss = 0
for i in range(0, N, batchsize):
(前述の順伝播,誤差逆伝播で lossとaccuracyを得る)
sum_loss += float(loss.data) * batchsize
sum_accuracy += float(accuracy.data) * batchsize
l = sum_loss / N
a = sum_accuracy /N
print("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.032
K-Nearest Neighbor 0.970 20.70 702.9
AdaBoost 0.719 64.74 0.519
Random Forest 0.946 1.026 0.152
Neural Network (GPU) 0.970 1018.9(cpu: 1906) 0.063
【注意】
ニューラルネットの学習は100回繰り返した.
PCのスペック
CPU: Intel® Core™ i7-5930K 3.50GHz
GPU: GeForce GTX Titan X
54
特徴抽出+識別器としてのDeep Learning
lConvolution層を持つニューラルネットワーク
Ø局所的にのみ連結されたネットワーク
²画像処理における畳み込みフィルタ(convolution)に相当
Ø位置ずれへの頑健性
²Pooling: 局所領域の特徴を集約
16チャンネル
1チャンネル
Convolution
Pooling
64チャンネル
16チャンネル
Convolution
Pooling
64チャンネル
55
CNNを使う時の処理⼿順
必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
前
述
の
DeepLearning
の
処
理
の
⼿
順
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チャンネル
Convolution
3x3のフィルタ
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チャンネル
Pooling
3x3
3x3の領域内で最⼤値を返す
59
特徴抽出+識別器としてのDeep Learning
lConvolution+Poolingのユニット数の計算
Ø画像サイズの変化
²フィルタサイズとPoolingの移動幅によって決まる
Ø全結合層のユニット数
²最後のPooling後の画像サイズxチャンネル数
16チャンネル
1チャンネル
Convolution
Pooling
64チャンネル
16チャンネル
Convolution
Pooling
64チャンネル
28x28 26x26 9x9 8x8 3x3
3x3x64=576
MINST databaseでの分類結果
分類器 認識率 学習時間(秒) 評価時間(秒)
線形SVM 0.864 130.0 0.032
K-Nearest Neighbor 0.970 20.70 702.9
AdaBoost 0.719 64.74 0.519
Random Forest 0.946 1.026 0.152
Neural Network (GPU) 0.970 1018(cpu:1906) 0.063
CNN (GPU) 0.983 1509(cpu: 36324) 0.049
【注意】
ニューラルネットの学習は100回繰り返した
PCのスペック
CPU: Intel® Core™ i7-5930K 3.50GHz
GPU: 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
ぜひ質問ブースへお越しください

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