Pythonによる機械学習⼊⾨
〜Deep Learningに挑戦〜
ITSS名古屋チャプタ2016年度 第1回講演会
2016/07/15
名古屋⼤学 情報科学研究科
メディア科学専攻 助教
川⻄康友
本⽇の内容
l機械学習
lプログラミング⾔語Python
lPythonでの機械学習
l各種⼿法の⽐較
lDeep Learningの利⽤ (Chainer / Keras)
lまとめ
サンプルコードはgithubにあります
https://github.com/yasutomo57jp/ssii2016_tutorial
https://github.com/yasutomo57jp/deeplearning_samples
機械学習とは
l データから規則性や知識を⾒つけること
l 出来ること
Ø 回帰
²関数のパラメータを推定する
Ø クラス分類
²クラスを分類する基準,ルールを⾒つける
Ø クラスタリング
²データを複数の集合に分割するルールを⾒つける
データに潜む規則性
知識を発⾒
⼤量の
データ
機械学習
機械学習の例:多クラス分類
l画像分類問題
Ø画像を⼊⼒として,どのクラスに属するかを出⼒
Ø例
²MNIST:⼿書き⽂字認識
²bird-200:⿃の200種分類問題
²Caltech-101:101種類の物体認識
分類する基準を,
⼤量の学習データから
機械学習によって獲得する
多クラス分類器の学習と評価
l学習段階
l評価段階
学習データ
の準備
識別器の
初期化
識別器の
学習
評価データ
の準備
評価データ
の分類
結果の
集計,出力
プログラムによって実現
特徴量と正解ラベルのペア 評価データを
クラス分類器にかける
クラス分類器が得られる特徴量と正解ラベルのペア
多クラス分類器の実現
lよく使われるプログラミング⾔語/ツール
ØC/C++
ØMatlab
ØR
ØPython
Øその他(GUIで⼿軽に使えるもの)
²Weka (Java), Orange(Python), …
⼈⼯知能(機械学習)ブーム
+
機械学習ではPythonがよく使われる
Pythonのいいところ
l無料で使える
l実⾏・デバッグが容易
Øスクリプト⾔語であるメリット
lシンプルで覚えやすい
Ø基本的な⽂法が簡単
lどの環境でも動く
ØWin, Mac, Linux
l様々なモジュールが存在
lC/C++との組み合わせも可能
様々なPython環境
lpythonインタプリタ
Øpythonコードを1⾏ずつ⼊⼒・実⾏
lエディタ+pythonインタプリタ
Ø好きなエディタでコードを書く
Øpython hoge.py で実⾏
lipython(インタラクティブPython)
Øシェル機能を搭載したpythonインタプリタ
lIDLE, spyder, PyCharm, Eclipse+PyDev
Ø統合開発環境
pythonインタプリタ
ipython
シェルのように使える
IDLE
付属のエディタでコードを書き、F5キーで実行できる
pythonインタプリタの画面
エディタ
spyder
Matlabライクな開発環境
ipythonの画面
ヘルプ画面
jupyter (ipython notebook)
ブラウザ上でipythonの
実⾏結果を表⽰
jupyter (ipython notebook)
グラフなどの描画も
ブラウザ上で可能
Pythonとモジュール
l Pythonは基本機能はとてもシンプル
Ø 拡張モジュールが豊富
² ⾏列演算など:numpy
² 科学技術計算など:scipy
² グラフの描画など:matplotlib
² 機械学習:scikit-learn
² ディープラーニング:pylearn2, caffe, chainer, keras
² 画像処理:pillow, scikit-image, opencv
² シミュレーション:simpy
² 解析的な計算:theano
² インタラクティブシェル:ipython
Ø https://pypi.python.org/pypi で公開
² easy_install コマンドや,pip コマンドで簡単にインストール可能
² ⾃作モジュールを簡単に公開できる機能もある
Pythonでの機械学習
l機械学習パッケージ scikit-learn
Øhttp://scikit-learn.org/
Ø機械学習に関する
様々な⼿法が実装されたライブラリ
²クラス分類
²クラスタリング
²回帰
²データマイニング
ØBSDライセンス
scikit-learnで扱うことのできる問題⼀覧
解きたい問題に対して何を使えば良いのかのガイドも載っています
多クラス分類問題の例題
lMNIST database of handwritten digits
Ø0〜9の⼿書き数字認識問題
Ø7万枚の画像+正解ラベル
Ø例題としてよく利⽤される
Øscikit-learnでもデータセットが提供されている
²fetch_mldata("MNIST original") で取得可能
Pythonによる実装
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
学習段階
評価段階
説明の都合上,
学習段階と評価段階を
つなげたコードで
説明します
Pythonによる実装
線形Support Vector Machine (線形SVM)を使った実装例
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 as	Classifier
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	=	Classifier()
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 as Classifier
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 = Classifier()
classifier.fit(data_train, label_train)
result = classifier.predict(data_test)
cmat = confusion_matrix(label_test, result)
print(cmat)
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
[[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.]
minst.targetmnist.data
特徴量とラベルの表現形式
学習⽤正解ラベル学習⽤特徴量
numpyのndarray(多次元配列)形式
1⾏が1つの特徴量.それに対応するラベル.
(サンプル数, 特徴量)の⾏列
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
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割を評価用
にする
識別器の初期化・学習
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
classifier = Classifier()
読み込んだモジュールでの識別器
(ここでは線形SVM)のクラスのインスタンスを⽣成
引数で,ソフトマージンのパラメータ等を指定可能
classifier.fit(data_train, label_train)
学習データ(特徴量,正解ラベル)を⽤いて
識別器の学習を実⾏
特徴量 正解ラベル
評価
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
result = classifier.predict(data_test)
評価データの特徴量を,学習済み分類器で
分類する
特徴量
分類結果
正解ラベル同様,
0〜9の値をもつ配列
結果の集計・出⼒
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
accuracy = accuracy_score(label_test, result)
print(accuracy)
全体として何%の認識率なのかを調査
cmat = confusion_matrix(label_test, result)
print(cmat)
混同⾏列での評価をする場合
認識率での評価をする場合
正解ラベル 分類結果
どのクラスへの誤分類が多いかを調査
from sklearn.metrics import accracy_score
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.856 128.5 0.023
PCのスペック
CPU: Intel® Core™ i7-3970K 3.50GHz
GPU: GeForce GTX 1080
識別器を⾃由に切り替える
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
書き換えの必要は1⾏だけ
from sklearn.svm import	LinearSVC as Classifier
① モジュールの読み込み
from sklearn.svm import SVC as Classifier
from sklearn.neighbors import KNeighborsClassifier as Class
from sklearn.ensemble import AdaBoostClassifier as Classifi
from sklearn.ensemble import RandomForestClassifier as Clas
1⾏書き換えるだけで,各種分類器を
切り替えて利⽤・⽐較することが可能!
様々な識別器での結果
分類器 認識率 学習時間(秒) 評価時間(秒)
線形SVM 0.856 128.5 0.023
K-Nearest Neighbor 0.970 5.846 775.0
AdaBoost 0.735 44.70 0.802
Random Forest 0.945 2.789 0.063
【注意】
全てデフォルトのパラメータを利⽤
パラメータチューニングによって性能は変化する
学習・評価サンプルの分割⽅法によっても結果は変化する
PCのスペック
CPU: Intel® Core™ i7-3970K 3.50GHz
GPU: GeForce GTX 1080
mnist = fetch_mldata("MNIST original", data_home=".")
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
今回はMINST databaseを使ったが…
load_svmlight_file(filename)
1. OpenCV等を使って予め特徴抽出し,保存
別の取り組みたい問題のために
⾃前で抽出した特徴量を使う場合
2. 保存した特徴量を読み込んでクラス分類
データの保存には svmlight 形式が便利
読み込み⽤の関数が存在
特徴量とラベルをまとめて読み込める
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 …
クラスラベル
特徴量の次元番号:特徴量の値 の組が次元数分ある
mnist = fetch_mldata("MNIST original", data_home=".")
特徴量の読み込み
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
今回はMINST databaseを使ったが…
load_svmlight_file(filename)
1. OpenCV等を使って予め特徴抽出し,保存
別の取り組みたい問題のために
⾃前で抽出した特徴量を使う場合
2. 保存した特徴量を読み込んでクラス分類
データの保存には svmlight 形式が便利
読み込み⽤の関数が存在
特徴量とラベルをまとめて読み込める
DEEP LEARNINGに挑戦
Deep Learning
l 近年ものすごく注⽬を集めている
l 様々なニュースでも話題
Ø Audi、⾃動運転成功の鍵はディープラーニングと発表
Ø Facebook、“ほぼ⼈間レベル”の顔認識技術「DeepFace」を発表
Ø グーグルの⼈⼯知能、囲碁の欧州チャンピオンに5連勝
Googleトレンドでの「Deep Learning」の調査結果
Deep Learningのためのツール
名前 開発元 環境 ⾔語
導⼊の
容易さ
GPU化の
容易さ
その他
neural
network
toolbox
MathWorks * Matlab ◎ ?
caffe BVLC Linux C++
Python
△ ◎ 画像に
強い
TensorFlow Google Linux
Mac
Python ○ ○ AlphaGo
Torch7 Facebook Linux
Mac
Lua ○ ○
chainer Preferred
Networks
* Python ◎ ◎
keras Francois
Chollet
* Python ◎ ◎
MXnet ワシントン⼤,
CMU, etc.
* Python
R
Julia
○ ◎
今回はChainerとKerasでの実装例を紹介する
Deep Learningライブラリの基本
l誤差逆伝播法による学習
Ø各層で関数を微分して重み更新
²関数の微分機能が必要
l関数を表現するオブジェクト
Ø演算結果ではなく,式の構造を保持
Ø微分機能:微分した関数のオブジェクトを返す
lその他の便利機能
ØGPU上で計算する機能
Øネットワーク(関数の集まり)の構築機能
Ø学習データを与えると⾃動的に学習してくれる機能
今回紹介する例題と実装
lクラス分類器として
Ø(Deep) Neural Network
Ø3層のニューラルネットワークを例に説明
l特徴抽出+クラス分類器として
ØConvolutional Neural Network
ØConvolution 2層,全結合3層を例に
l学習済みモデルの読み込みと実⾏・Fine tuning
クラス分類器としてのDeep Learning
l⼩規模なニューラルネットワークを例に
重み付き和→活性化関数 重み付き和→活性化関数
いくつか
の隠れ層 クラス数分の
出⼒ユニット
特徴量の次元数分の
⼊⼒ユニット
誤差逆伝播法による学習
決める必要があるもの
l層のパラメータ
Ø層数
Ø各層のユニット数
l伝播のさせかた
Ø活性化関数
l学習のさせかた
Ø最適化⽅法
重み付き和→活性化関数 重み付き和→活性化関数 ・・・
誤差逆伝播法による学習
決める必要があるもの
l層のパラメータ
Ø層数
Ø各層のユニット数
l伝播のさせかた
Ø活性化関数
l学習のさせかた
Ø最適化⽅法
重み付き和→活性化関数 重み付き和→活性化関数 ・・・
誤差逆伝播法による学習
決める必要があるもの
l層のパラメータ
Ø層数
Ø各層のユニット数
l伝播のさせかた
Ø活性化関数
l学習のさせかた
Ø最適化⽅法
重み付き和→活性化関数 重み付き和→活性化関数 ・・・
誤差逆伝播法による学習
決める必要があるもの
l層のパラメータ
Ø層数
Ø各層のユニット数
l伝播のさせかた
Ø活性化関数
l学習のさせかた
Ø最適化⽅法
重み付き和→活性化関数 重み付き和→活性化関数 ・・・
誤差逆伝播法による学習
Deep Learningの処理⼿順
必要なモジュールの読み込み
特徴量の読み込み
識別器の初期化・学習
評価
結果の集計・出⼒
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
前
半
の
機
械
学
習
の
流
れ
DeepLearning
の
流
れ
CHAINERでの実装
必要なモジュールの読み込み
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
from chainer import Chain
from chainer import Variable
from chainer import optimizers
import chainer.functions as F
import chainer.links as L
from sklearn.metrics import confusion_matrix
import numpy as np
chainerで必要なものをインポート
その他,機械学習の評価⽤等のために
必要なインポート
層のパラメータ
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
class MyNetwork(Chain):
def __init__(self):
super(MyNetwork, self).__init__(
l1=F.Linear(784, 200),
l2=F.Linear(200, 100),
l3=F.Linear(100, 10))
self.is_train = True
・・・
・・・
・・・
・・・
784 200 100
10
・・・
・・・
・・・
class MyNetwork(Chain):
def __init__(self):
super(MyNetwork, self).__init__(
l1=F.Linear(784, 200),
l2=F.Linear(200, 100),
l3=F.Linear(100, 10))
self.is_train = True
⼊⼒層のユニット数 中間層のユニット数
class MyNetwork(Chain):
def __init__(self):
super(MyNetwork, self).__init__(
l1=F.Linear(784, 200),
l2=F.Linear(200, 100),
l3=F.Linear(100, 10))
self.is_train = True
出⼒層のユニット数
ネットワークのモデルを
表現するクラス
l1 l2 l3
伝播のさせ⽅
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
・・・
・・・
・・・
・・・
784 200 100
10
class MyNetwork(Chain):
def __call__(self, x):
h1 = F.sigmoid(self.l1(x))
h2 = F.sigmoid(self.l2(h1))
p = model.l3(h2)
return p
class MyNetwork(Chain):
def __call__(self, x):
h1 = F.sigmoid(self.l1(x))
h2 = F.sigmoid(self.l2(h1))
p = model.l3(h2)
return p
活性化関数の変更
l従来のニューラルネットワークでは
シグモイド関数がよく利⽤される
ØDeep Learningでは勾配の計算の都合上,
ReLU (Rectified Linear Unit)などが利⽤される
lDropoutの導⼊による汎化性能向上
Ø学習時,ランダムに誤差伝播を0にする
勾配が⼩さくなる 勾配⼀定
活性化関数の変更
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
def __call__(self, x):
h1 = F.sigmoid(self.l1(x))
h2 = F.sigmoid(self.l2(h1))
p = self.l3(h2)
return p
def __call__(self, x):
h1 = F.relu(self.l1(x))
h2 = F.relu(self.l2(h1))
p = self.l3(h2)
return p
def __call__(self, x):
h1 = F.dropout(F.relu(self.l1(x)),
train=self.is_train)
h2 = F.dropout(F.relu(self.l2(h1)),
train=self.is_train)
p = self.l3(h2)
return p
• 活性化関数をReLUにする
• Dropoutを追加する
学習のさせ⽅
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
ネットワークのインスタンスの⽣成
分類器としての評価を⾏うクラスを利⽤
network = MyNetwork()
model = L.Classifier(network)
model.compute_accuracy = True
誤差関数を指定可能
学習のさせ⽅
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
optimizer = optimizers.Adam()
optimizer.setup(model)
SGD ( Stochastic Gradient Descent)
AdaGrad
RMSprop
Adam (ADAptive Moment estimation)
modelを登録する
⾊々なパラメータ更新⽅法が利⽤可
学習率を
⾃動的に
調整する
改良
基本的には確率的勾配法が利⽤される
確率的勾配法のバリエーション
ネットワークの学習の流れ
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
ミニバッチによる逐次的な学習
オンライン学習:1個ずつ学習
→少しずつランダムにまとめて学習
ネットワークの学習
学習データをミニバッチへ分割して学習
指定回数の繰り返し
ミニバッチごとの繰り返し
誤差逆伝播法による最適化
ネットワークの学習 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)
loss = model(x, t)
accuracy = model.accuracy
loss.backward()
optimizer.update()
ミニバッチごとの誤差逆伝播法による学習
ミニバッチ
型を変換
ネットワークを通して
誤差を評価
誤差の逆伝播
パラメータの更新
ネットワークの学習の流れ
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
ミニバッチによる逐次的な学習
ネットワークの学習
学習データをミニバッチへ分割して学習
指定回数の繰り返し
ミニバッチごとの繰り返し
誤差逆伝播法による最適化
オンライン学習:1個ずつ学習
→少しずつランダムにまとめて学習
ネットワークの学習 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) * len(x_batch)
sum_accuracy += float(accuracy.data) * len(x_batc
l = sum_loss / N
a = sum_accuracy /N
print("loss: %f, accuracy: %f" % (l, a))
ミニバッチの分割の
仕⽅を決定
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
ミニバッチの分割と繰り返し
この処理を,
ミニバッチの分割の仕⽅を変えながらepoch分繰り返す
繰り返し回数
ネットワークの学習の流れ
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
ミニバッチによる逐次的な学習
ネットワークの学習
学習データをミニバッチへ分割して学習
指定回数の繰り返し
ミニバッチごとの繰り返し
誤差逆伝播法による最適化
オンライン学習:1個ずつ学習
→少しずつランダムにまとめて学習
評価のしかた
network.is_train = False
test_input = Variable(data_test)
result_scores = network(test_input)
各クラスのスコアが出てくるので
argmax を取る
今回は学習時ではない
= Dropoutしない
results = np.argmax(result_scores, axis=1)
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
評価データをネットワークに通す
最終出⼒層の最⼤値を選択
CUDAによるGPUを使った⾼速化
model = L.Classifier(network)
model.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へ
MINST databaseでの分類結果
分類器 認識率 学習時間(秒) 評価時間(秒)
線形SVM 0.856 128.5 0.023
K-Nearest Neighbor 0.970 5.846 775.0
AdaBoost 0.735 44.70 0.802
Random Forest 0.945 2.789 0.063
Neural Network (GPU) 0.970 1018.9(cpu: 1906) 0.063
【注意】
ニューラルネットの学習は100回繰り返した.
PCのスペック
CPU: Intel® Core™ i7-3970K 3.50GHz
GPU: GeForce GTX 1080
KERASでの実装
Kerasの仕組み
lメインの計算部分はバックエンドが担当
Øバックエンド
²Theano
²TensorFlow
ØバックエンドがGPU対応していれば,
⾃動的にGPUで実⾏される
l直感的な記述法
Øネットワークの層を順番に書く
Øscikit-learn的な学習(fit),評価(predict)
必要なモジュールの読み込み
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activation, Dropout
from keras.utils.np_utils import to_categorical
kerasで必要なものをインポート
ネットワーク構築
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
kerasではネットワーク構築は⼀気にやる
model = Sequential()
model.add(Dense(200, input_dim=784))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(Dense(100))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(Dense(10))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
⼀番最初の層の
⼊⼒次元数は指定する
誤差関数,最適化法,
途中の評価⽅法を指定
ネットワークの学習・評価
model.fit(data_train, label_train_category,
nb_epoch=100, batch_size=100, verbose=1)
ミニバッチの分割の
仕⽅を決定
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
Kerasでの学習・評価は⾮常に簡単
results = model.predict_classes(data_test, verbose=1)
学習
評価
繰り返し回数
途中状態の可視化
label_test_category = to_categorical(label_test)
ラベルの変換
多クラスの時クラス番号は
カテゴリベクトルにしておく
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
NN (GPU, Chainer) 0.970 1018(cpu:1906) 0.063
NN (GPU, Keras) 0.831 108.2 0.653
【注意】
ニューラルネットの学習は100回繰り返した.
PCのスペック
CPU: Intel® Core™ i7-3970K 3.50GHz
GPU: GeForce GTX 1080
※Deep	Learningの認識率はミニバッチの順番等にもよるので比較するのは困難
特徴抽出+識別器としてのDeep Learning
lConvolution層を持つニューラルネットワーク
Ø局所的にのみ連結されたネットワーク
²画像処理における畳み込みフィルタ(convolution)に相当
Ø位置ずれへの頑健性
²Pooling: 局所領域の特徴を集約
16チャンネル
1チャンネル
Convolution
Pooling
64チャンネル
16チャンネル
Convolution
Pooling
64チャンネル
CNNを使う時の処理⼿順
必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
前
述
の
DeepLearning
の
処
理
の
⼿
順
CNN
を
使
う
場
合
の
処
理
の
⼿
順
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
画像の読み込み
必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
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次元数
CHAINERでの実装
層のパラメータ
必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
class MyNetwork(Chain):
def __init__(self):
super(MyNetwork, self).__init__(
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))
self.is_train = True
Convolution層が2つ,
全結合層が3つ
モノクロ1→16チャンネル
16→64チャンネル
16チャンネル1チャンネル
Convolution
3x3のフィルタ
16種類のフィルタ
Convolution層を追加する
伝播のさせ⽅
必要なモジュールの読み込み
画像の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
Pooling層を追加する
def __call__(self, x):
h1 = F.max_pooling_2d(F.relu(self.conv1(x)), 3)
h2 = F.max_pooling_2d(F.relu(self.conv2(h1)), 3)
h3 = F.dropout(F.relu(self.l1(h2)), train=self.is_train)
h4 = F.dropout(F.relu(self.l2(h3)), train=self.is_train)
p = self.l3(h4)
return p
16チャンネル 16チャンネル
Pooling
3x3
3x3の領域内で最⼤値を返す
特徴抽出+識別器としてのDeep Learning
lConvolution+Poolingのユニット数の計算
Ø画像サイズの変化
²フィルタサイズとPoolingの移動幅によって決まる
Ø全結合層のユニット数
²最後のPooling後の画像サイズxチャンネル数
16チャンネル
1チャンネル
Convolution
Pooling
64チャンネル
16チャンネル
Convolution
Pooling
64チャンネル
28x28 26x26 9x9 8x8 3x3
3x3x64=576
KERASでの実装
ネットワーク構築
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
kerasではネットワーク構築は⼀気にやる
model.add(Convolution2D(32, 3, 3, border_mode='same',
input_shape=(1, 28, 28)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(3, 3),
border_mode='same'))
model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(3, 3),
border_mode='same'))
model.add(Flatten())
model.add(Dense(200))
model.add(Activation("relu"))
model.add(Dropout(0.5))
⼀番最初の層の
⼊⼒形状は指定する
以下はNeural Networkと同様
1次元にのばす
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
NN (GPU, Chainer) 0.970 1018(cpu:1906) 0.063
NN (GPU, Keras) 0.831 108.2 0.653
CNN (GPU) 0.983 1509(cpu: 36324) 0.049
CNN (GPU, Keras) 0.992 350.0 1.260
PCのスペック
CPU: Intel® Core™ i7-3970K 3.50GHz
GPU: GeForce GTX 1080
※Deep	Learningの認識率はミニバッチの順番等にもよるので比較するのは困難
学習済みモデルの利⽤
lいちからネットワークを学習させるのは困難
Ø別データセットで学習させたものを流⽤
²ネットワークの出⼒を"付け替えて"追加学習
Ømodel zooでは多数の学習済みモデルが公開
²https://github.com/BVLC/caffe/wiki/Model-Zoo
²様々なモデル
– AlexNet, GoogLeNet, VGG, etc.
²様々なデータセット
– ImageNet, Places205, etc.
学習済みモデルの読み込みと利⽤
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
model	=	caffe.CaffeFunction("pretrained.caffemodel")
model.to_gpu()
ChainerはCaffeでの学習済みモデルを
容易に読み込むことが出来る
読み込んだモデルは,関数として利⽤可
result	=	model(inputs={"data":	 x},	outputs=["fc8"],	train=False)
入力を,どの層に
入れるか
どの層から出力を
とるか
この場合,result[0]に fc8 の出⼒を得る
そのまま出⼒すれば,元のネットワークの出⼒が出来る
学習済みモデルの読み込みと利⽤
必要なモジュールの読み込み
特徴量の読み込み
層のパラメータ
伝播のさせ方
学習のさせ方
ネットワークの学習
評価
結果の集計・出力
caffeのモデルを関数の⼀部として利⽤
class	BinClassNet(Chain):
def __init__(self,	caffemodel):
super(BinClassNet,	self).__init__(
base	=	caffemodel,
hlayer =	L.Linear(4096,	2000),
olayer =	L.Linear(2000,	2))
self.train =	True
def __call__(self,	x):
h1	=	self.base(inputs={"data":	x},	outputs=["fc7"],
train=self.train)
h2	=	F.relu(self.hlayer(h1[0]))
h3	=	self.olayer(h2)
return	h3
7層目から出力
参考⽂献・Webページ
l今回のサンプルコード
Øhttps://github.com/yasutomo57jp/deeplearning_sa
mples
lSSII2016の時の講演のサンプルコード
Ø 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を使った画像処理解説
まとめ
lPythonで機械学習
ØScikit-learnで様々な分類器を切り替えて利⽤
lDeep Learningツールの紹介
ØChainer
²⽐較的分かりやすい記述⽅法
²caffeの学習済みモデルを読み込める
ØKeras
²記述⽅法が直感的
²学習⼿順が容易
– 最近はChainerも学習⼿順を簡単に書けるようになっています

Pythonによる機械学習入門 ~Deep Learningに挑戦~