pythonによる機械学習入門 ~deep learningに挑戦~
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も学習⼿順を簡単に書けるようになっています