Contenu connexe Similaire à Pythonによる機械学習入門 ~SVMからDeep Learningまで~ (20) Plus de Yasutomo Kawanishi (9) Pythonによる機械学習入門 ~SVMからDeep Learningまで~2. ⾃⼰紹介
l 経歴
Ø 2012年 京都⼤学⼤学院 情報学研究科 博⼠後期課程修了
Ø 2012年 京都⼤学 学術情報メディアセンター 特定研究員
Ø 2014年 名古屋⼤学 未来社会創造機構 特任助教
Ø 2015年 名古屋⼤学 情報科学研究科 助教
l 研究テーマ
Ø ⼈物画像処理
²⼈物検出
²⼈物追跡
²⼈物検索
²⼈物照合
²歩⾏者属性認識
Ø 背景画像推定
← Pythonを使⽤
← ⼀部Pythonを使⽤
← ⼀部Pythonを使⽤
2
8. クラス分類器の発展・流⾏の歴史
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
12. 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
15. 多クラス分類問題の例題
lMNIST database of handwritten digits
Ø0〜9の⼿書き数字認識問題
Ø7万枚の画像+正解ラベル
Ø例題としてよく利⽤される
Øscikit-learnでもデータセットが提供されている
²fetch_mldata("MNIST original") で取得可能
14
17. 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行で書けてしまう!
18. 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
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)
19
21. 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
22. 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
23. 特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
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
27. 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
30. 様々な識別器での結果
分類器 認識率 学習時間(秒) 評価時間(秒)
線形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
31. mnist = fetch_mldata("MNIST original", data_home=".")
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
今回はMINST databaseを使ったが…
load_svmlight_file(filename)
1. OpenCV等を使って予め特徴抽出し,保存
別の取り組みたい問題のために
⾃前で抽出した特徴量を使う場合
2. 保存した特徴量を読み込んでクラス分類
データの保存には svmlight 形式が便利
読み込み⽤の関数が存在
特徴量とラベルをまとめて読み込める
29
32. 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 …
クラスラベル
特徴量の次元番号:特徴量の値 の組が次元数分ある
34. Deep Learning
l 近年ものすごく注⽬を集めている
l 様々なニュースでも話題
Ø Audi、⾃動運転成功の鍵はディープラーニングと発表
Ø Facebook、“ほぼ⼈間レベル”の顔認識技術「DeepFace」を発表
Ø グーグルの⼈⼯知能、囲碁の欧州チャンピオンに5連勝
Googleトレンドでの「Deep Learning」の調査結果
31
35. 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
36. 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
45. 層のパラメータ
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
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
53. ネットワークの学習 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
55. 評価のしかた
test_input = Variable(data_test)
result_scores = forward(test_input, is_train=False)
各クラスのスコアが出てくるので
argmax を取る
今回は学習時ではない
= Dropoutしない
results = np.argmax(result_scores, axis=1)
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
評価データをネットワークに通す
最終出⼒層の最⼤値を選択
52
56. 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
57. 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
61. 層のパラメータ
必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
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
64. 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
67. 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