pythonによる機械学習入門 ~deep learningに挑戦~

Post on 16-Apr-2017

42.991 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Pythonによる機械学習⼊⾨〜Deep Learningに挑戦〜

ITSS名古屋チャプタ2016年度 第1回講演会2016/07/15

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

川⻄康友

本⽇の内容l機械学習lプログラミング⾔語PythonlPythonでの機械学習l各種⼿法の⽐較lDeep Learningの利⽤ (Chainer / Keras)lまとめ

サンプルコードはgithubにありますhttps://github.com/yasutomo57jp/ssii2016_tutorialhttps://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, Linuxl様々なモジュールが存在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)を使った実装例

12345

678

910

11

1213

fromsklearn.datasets import fetch_mldatafromsklearn.cross_validation import train_test_splitfromsklearn.svm importLinearSVC asClassifierfromsklearn.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=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_mldatafromsklearn.cross_validation import train_test_splitfrom sklearn.svm import LinearSVC as Classifierfrom 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 = 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 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.856 128.5 0.023

PCのスペックCPU: Intel® Core™ i7-3970K 3.50GHzGPU: GeForce GTX 1080

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

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

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

書き換えの必要は1⾏だけ

from sklearn.svm importLinearSVC as Classifier

① モジュールの読み込み

from sklearn.svm import SVC as Classifier

from sklearn.neighbors import KNeighborsClassifier as Classifier

from sklearn.ensemble import AdaBoostClassifier as Classifier

from sklearn.ensemble import RandomForestClassifier as Classifier

1⾏書き換えるだけで,各種分類器を切り替えて利⽤・⽐較することが可能!

様々な識別器での結果

分類器 認識率 学習時間(秒) 評価時間(秒)線形SVM 0.856 128.5 0.023K-Nearest Neighbor 0.970 5.846 775.0AdaBoost 0.735 44.70 0.802Random Forest 0.945 2.789 0.063

【注意】全てデフォルトのパラメータを利⽤パラメータチューニングによって性能は変化する学習・評価サンプルの分割⽅法によっても結果は変化する

PCのスペックCPU: Intel® Core™ i7-3970K 3.50GHzGPU: 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 Learningl 近年ものすごく注⽬を集めている

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

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

Deep Learningのためのツール名前 開発元 環境 ⾔語 導⼊の

容易さGPU化の容易さ その他

neural network toolbox

MathWorks * Matlab ◎ ?

caffe BVLC Linux C++Python

△ ◎ 画像に強い

TensorFlow Google LinuxMac

Python ○ ○ AlphaGo

Torch7 Facebook LinuxMac

Lua ○ ○

chainer Preferred Networks

* Python ◎ ◎

keras Francois Chollet

* Python ◎ ◎

MXnet ワシントン⼤, CMU, etc.

* PythonRJulia

○ ◎

今回は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の処理⼿順

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

特徴量の読み込み

識別器の初期化・学習

評価

結果の集計・出⼒

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

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

前半の機械学習の流れ

Deep Learning

の流れ

CHAINERでの実装

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

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

from chainer import Chainfrom chainer import Variablefrom chainer import optimizersimport chainer.functions as Fimport chainer.links as L

from sklearn.metrics import confusion_matriximport 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 10010

・・・ ・・・

・・・

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 10010

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)AdaGradRMSpropAdam (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 = 0sum_loss = 0for i in range(0, N, batchsize):

(前述の順伝播,誤差逆伝播で lossとaccuracyを得る)

sum_loss += float(loss.data) * len(x_batch)sum_accuracy += float(accuracy.data) * len(x_batch)

l = sum_loss / Na = sum_accuracy /Nprint("loss: %f, accuracy: %f" % (l, a))

ミニバッチの分割の仕⽅を決定

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

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

ミニバッチの分割と繰り返し

この処理を,ミニバッチの分割の仕⽅を変えながらepoch分繰り返す

繰り返し回数

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

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

ミニバッチによる逐次的な学習

ネットワークの学習

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

指定回数の繰り返し

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

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

オンライン学習:1個ずつ学習→少しずつランダムにまとめて学習

評価のしかた

network.is_train = Falsetest_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.023K-Nearest Neighbor 0.970 5.846 775.0AdaBoost 0.735 44.70 0.802Random Forest 0.945 2.789 0.063Neural Network (GPU) 0.970 1018.9(cpu: 1906) 0.063

【注意】ニューラルネットの学習は100回繰り返した.

PCのスペックCPU: Intel® Core™ i7-3970K 3.50GHzGPU: GeForce GTX 1080

KERASでの実装

Kerasの仕組みlメインの計算部分はバックエンドが担当

Øバックエンド²Theano²TensorFlow

ØバックエンドがGPU対応していれば,⾃動的にGPUで実⾏される

l直感的な記述法Øネットワークの層を順番に書くØscikit-learn的な学習(fit),評価(predict)

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

特徴量の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

from keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Activation, Dropoutfrom 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.032K-Nearest Neighbor 0.970 20.70 702.9AdaBoost 0.719 64.74 0.519Random Forest 0.946 1.026 0.152NN (GPU, Chainer) 0.970 1018(cpu:1906) 0.063NN (GPU, Keras) 0.831 108.2 0.653

【注意】ニューラルネットの学習は100回繰り返した.

PCのスペックCPU: Intel® Core™ i7-3970K 3.50GHzGPU: GeForce GTX 1080

※DeepLearningの認識率はミニバッチの順番等にもよるので比較するのは困難

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

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

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

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

1チャンネル

ConvolutionPooling

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

ConvolutionPooling

64チャンネル

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

画像の読み込み

層のパラメータ

伝播のさせ方

学習のさせ方

ネットワークの学習

評価

結果の集計・出力

前述のD

eep Learning

の処理の⼿順

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チャンネル

Convolution3x3のフィルタ

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チャンネル

Pooling3x3

3x3の領域内で最⼤値を返す

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

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

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

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

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

ConvolutionPooling

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

ConvolutionPooling

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))

model.add(Dense(100))

⼀番最初の層の⼊⼒形状は指定する

以下はNeural Networkと同様

1次元にのばす

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.152NN (GPU, Chainer) 0.970 1018(cpu:1906) 0.063NN (GPU, Keras) 0.831 108.2 0.653CNN (GPU) 0.983 1509(cpu: 36324) 0.049CNN (GPU, Keras) 0.992 350.0 1.260

PCのスペックCPU: Intel® Core™ i7-3970K 3.50GHzGPU: GeForce GTX 1080

※DeepLearningの認識率はミニバッチの順番等にもよるので比較するのは困難

学習済みモデルの利⽤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のモデルを関数の⼀部として利⽤

classBinClassNet(Chain):def __init__(self,caffemodel):super(BinClassNet,self).__init__(

base=caffemodel,hlayer =L.Linear(4096,2000),olayer =L.Linear(2000,2))

self.train =Truedef __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)returnh3

7層目から出力

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

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

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も学習⼿順を簡単に書けるようになっています

top related