Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

77,143 views

Published on

SSII2016 チュートリアル

Published in: Technology
  • Be the first to comment

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

  1. 1. Pythonによる機械学習⼊⾨ 〜SVMからDeep Learningまで〜 第22回 画像センシングシンポジウム チュートリアル講演会 名古屋⼤学 情報科学研究科 メディア科学専攻 助教 川⻄康友 1
  2. 2. ⾃⼰紹介 l 経歴 Ø 2012年 京都⼤学⼤学院 情報学研究科 博⼠後期課程修了 Ø 2012年 京都⼤学 学術情報メディアセンター 特定研究員 Ø 2014年 名古屋⼤学 未来社会創造機構 特任助教 Ø 2015年 名古屋⼤学 情報科学研究科 助教 l 研究テーマ Ø ⼈物画像処理 ²⼈物検出 ²⼈物追跡 ²⼈物検索 ²⼈物照合 ²歩⾏者属性認識 Ø 背景画像推定 ← Pythonを使⽤ ← ⼀部Pythonを使⽤ ← ⼀部Pythonを使⽤ 2
  3. 3. 本⽇の内容 l機械学習とは l識別器の発展・流⾏の歴史 l機械学習の枠組み lPythonでの機械学習 l各種⼿法の⽐較 lDeep Learningの利⽤ lまとめ サンプルコードはgithubにあります https://github.com/yasutomo57jp/ssii2016_tutorial 3
  4. 4. このチュートリアルを聴くと… l初学者 ØPythonを使って機械学習,クラス分類問題の プログラムが書けるようになる l画像処理の専⾨家 Ø機械学習の様々なアルゴリズムを 簡単に⽐較できるようになる
  5. 5. 機械学習とは l データから規則性や知識を⾒つけること l 出来ること Ø 回帰 ²関数のパラメータを推定する Ø クラス分類 ²クラスを分類する基準,ルールを⾒つける Ø クラスタリング ²データを複数の集合に分割するルールを⾒つける データに潜む規則性 知識を発⾒ ⼤量の データ 機械学習 4
  6. 6. 機械学習の例:多クラス分類 l画像分類問題 Ø画像を⼊⼒として,どのクラスに属するかを出⼒ Ø例 ²MNIST:⼿書き⽂字認識 ²bird-200:⿃の200種分類問題 ²Caltech-101:101種類の物体認識 分類する基準を, ⼤量の学習データから 機械学習によって獲得する 5
  7. 7. 機械学習による多クラス分類器の構築 学習データの準備 • 画像+正解クラスラベルのペアを収集 特徴量の抽出 • 画像から分類に適した特徴を取り出す 多クラス分類器の学習 • ⼊⼒:特徴量+正解クラスラベル • 出⼒:多クラス分類器のパラメータ =分類を⾏うための基準 機械学習 問題に応じて, 様々なクラス分類器が 提案されている 6
  8. 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
  9. 9. 多クラス分類器の学習と評価 l学習段階 l評価段階 学習データ の準備 識別器の 初期化 識別器の 学習 評価データ の準備 評価データ の分類 結果の 集計,出力 プログラムによって実現 特徴量と正解ラベルのペア 評価データを クラス分類器にかける クラス分類器が得られる特徴量と正解ラベルのペア 8
  10. 10. 多クラス分類器の実現 lよく使われるプログラミング⾔語/ツール ØC/C++ ØMatlab ØR ØPython Øその他(GUIで⼿軽に使えるもの) ²Weka (Java), Orange(Python), … ⼈⼯知能(機械学習)ブーム + 機械学習ではPythonがよく使われる 9
  11. 11. Pythonのいいところ l無料で使える l実⾏・デバッグが容易 Øスクリプト⾔語であるメリット lシンプルで覚えやすい Ø基本的な⽂法が簡単 lどの環境でも動く ØWin, Mac, Linux l様々なモジュールが存在 lCとの組み合わせも可能 10
  12. 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
  13. 13. Pythonでの機械学習 l機械学習パッケージ scikit-learn Øhttp://scikit-learn.org/ Ø機械学習に関する 様々な⼿法が実装されたライブラリ ²クラス分類 ²クラスタリング ²回帰 ²データマイニング ØBSDライセンス 12
  14. 14. scikit-learnで扱うことのできる問題⼀覧 解きたい問題に対して何を使えば良いのかのガイドも載っています 13
  15. 15. 多クラス分類問題の例題 lMNIST database of handwritten digits Ø0〜9の⼿書き数字認識問題 Ø7万枚の画像+正解ラベル Ø例題としてよく利⽤される Øscikit-learnでもデータセットが提供されている ²fetch_mldata("MNIST original") で取得可能 14
  16. 16. Pythonによる実装 必要なモジュールの読み込み 特徴量の読み込み 識別器の初期化・学習 評価 結果の集計・出⼒ 学習段階 評価段階 説明の都合上, 学習段階と評価段階を つなげたコードで 説明します 15
  17. 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. 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
  19. 19. 必要なモジュールの読み込み 必要なモジュールの読み込み 特徴量の読み込み 識別器の初期化・学習 評価 結果の集計・出⼒ 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
  20. 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. 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. 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. 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
  24. 24. 識別器の初期化・学習 必要なモジュールの読み込み 特徴量の読み込み 識別器の初期化・学習 評価 結果の集計・出⼒ classifier = LinearSVC() 線形SVMのクラスのインスタンスを⽣成 引数で,ソフトマージンのパラメータ等を 指定可能 classifier.fit(data_train, label_train) 学習データ(特徴量,正解ラベル)を⽤いて 識別器の学習を実⾏ 特徴量 正解ラベル 23
  25. 25. 評価 必要なモジュールの読み込み 特徴量の読み込み 識別器の初期化・学習 評価 結果の集計・出⼒ result = classifier.predict(data_test) 評価データの特徴量を,学習済み分類器で 分類する 特徴量 分類結果 正解ラベル同様, 0〜9の値をもつ配列 24
  26. 26. 結果の集計・出⼒ 必要なモジュールの読み込み 特徴量の読み込み 識別器の初期化・学習 評価 結果の集計・出⼒ accuracy = accuracy_score(label_test, result) print(accuracy) 全体として何%の認識率なのかを調査 cmat = confusion_matrix(label_test, result) print(cmat) 混同⾏列での評価をする場合 認識率での評価をする場合 正解ラベル 分類結果 どのクラスへの誤分類が多いかを調査 from sklearn.metrics import accracy_score 25
  27. 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
  28. 28. 識別器を⾃由に切り替える 必要なモジュールの読み込み 特徴量の読み込み 識別器の初期化・学習 評価 結果の集計・出⼒ 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
  29. 29. 識別器を⾃由に切り替える 必要なモジュールの読み込み 特徴量の読み込み 識別器の初期化・学習 評価 結果の集計・出⼒ 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⾏書き換えるだけで,各種分類器を 切り替えて利⽤・⽐較することが可能!
  30. 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. 31. mnist = fetch_mldata("MNIST original", data_home=".") 特徴量の読み込み 必要なモジュールの読み込み 特徴量の読み込み 識別器の初期化・学習 評価 結果の集計・出⼒ 今回はMINST databaseを使ったが… load_svmlight_file(filename) 1. OpenCV等を使って予め特徴抽出し,保存 別の取り組みたい問題のために ⾃前で抽出した特徴量を使う場合 2. 保存した特徴量を読み込んでクラス分類 データの保存には svmlight 形式が便利 読み込み⽤の関数が存在 特徴量とラベルをまとめて読み込める 29
  32. 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 … クラスラベル 特徴量の次元番号:特徴量の値 の組が次元数分ある
  33. 33. DEEP LEARNINGの利⽤ 30
  34. 34. Deep Learning l 近年ものすごく注⽬を集めている l 様々なニュースでも話題 Ø Audi、⾃動運転成功の鍵はディープラーニングと発表 Ø Facebook、“ほぼ⼈間レベル”の顔認識技術「DeepFace」を発表 Ø グーグルの⼈⼯知能、囲碁の欧州チャンピオンに5連勝 Googleトレンドでの「Deep Learning」の調査結果 31
  35. 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. 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
  37. 37. 今回紹介する実装 lクラス分類器として Ø(Deep) Neural Network Ø3層のニューラルネットワークを例に説明 l特徴抽出+クラス分類器として ØConvolutional Neural Network ØConvolution 2層,全結合3層を例に 34
  38. 38. 35クラス分類器としてのDeep Learning l⼩規模なニューラルネットワークを例に 重み付き和→活性化関数 重み付き和→活性化関数 いくつか の隠れ層 クラス数分の 出⼒ユニット 特徴量の次元数分の ⼊⼒ユニット 誤差逆伝播法による学習
  39. 39. 決める必要があるもの l層のパラメータ Ø層数 Ø各層のユニット数 l伝播のさせかた Ø活性化関数 l学習のさせかた Ø最適化⽅法 重み付き和→活性化関数 重み付き和→活性化関数 ・・・ 誤差逆伝播法による学習 36
  40. 40. 決める必要があるもの l層のパラメータ Ø層数 Ø各層のユニット数 l伝播のさせかた Ø活性化関数 l学習のさせかた Ø最適化⽅法 重み付き和→活性化関数 重み付き和→活性化関数 ・・・ 誤差逆伝播法による学習 37
  41. 41. 決める必要があるもの l層のパラメータ Ø層数 Ø各層のユニット数 l伝播のさせかた Ø活性化関数 l学習のさせかた Ø最適化⽅法 重み付き和→活性化関数 重み付き和→活性化関数 ・・・ 誤差逆伝播法による学習 38
  42. 42. 決める必要があるもの l層のパラメータ Ø層数 Ø各層のユニット数 l伝播のさせかた Ø活性化関数 l学習のさせかた Ø最適化⽅法 重み付き和→活性化関数 重み付き和→活性化関数 ・・・ 誤差逆伝播法による学習 39
  43. 43. Deep Learningの処理⼿順 必要なモジュールの読み込み 特徴量の読み込み 識別器の初期化・学習 評価 結果の集計・出⼒ 必要なモジュールの読み込み 特徴量の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 前 半 の 機 械 学 習 の 流 れ DeepLearning の 流 れ 40
  44. 44. 必要なモジュールの読み込み 必要なモジュールの読み込み 特徴量の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 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
  45. 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
  46. 46. 伝播のさせ⽅ 必要なモジュールの読み込み 特徴量の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 ・・・ ・・・ ・・・ ・・・ 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
  47. 47. 活性化関数の変更 l従来のニューラルネットワークでは シグモイド関数がよく利⽤される ØDeep Learningでは勾配の計算の都合上, ReLU (Rectified Linear Unit)などが利⽤される lDropoutの導⼊による汎化性能向上 Ø学習時,ランダムに誤差伝播を0にする 勾配が⼩さくなる 勾配⼀定 44
  48. 48. 活性化関数の変更 必要なモジュールの読み込み 特徴量の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 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
  49. 49. 学習のさせ⽅ 必要なモジュールの読み込み 特徴量の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 optimizer = optimizers.Adam() optimizer.setup(model) SGD ( Stochastic Gradient Descent) AdaGrad RMSprop Adam (ADAptive Moment estimation) modelを登録する ⾊々なパラメータ更新⽅法が利⽤可 学習率を ⾃動的に 調整する 改良 基本的には確率的勾配法が利⽤される 確率的勾配法のバリエーション 46
  50. 50. ネットワークの学習の流れ 必要なモジュールの読み込み 特徴量の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 ミニバッチによる逐次的な学習 学習データが膨⼤: →ランダムに分割し,少しずつ学習 ネットワークの学習 学習データをミニバッチへ分割して学習 指定回数の繰り返し ミニバッチごとの繰り返し 誤差逆伝播法による最適化 47
  51. 51. ネットワークの学習 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
  52. 52. ネットワークの学習の流れ 必要なモジュールの読み込み 特徴量の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 ミニバッチによる逐次的な学習 学習データが膨⼤: →ランダムに分割し,少しずつ学習 ネットワークの学習 学習データをミニバッチへ分割して学習 指定回数の繰り返し ミニバッチごとの繰り返し 誤差逆伝播法による最適化 49
  53. 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
  54. 54. ネットワークの学習の流れ 必要なモジュールの読み込み 特徴量の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 ミニバッチによる逐次的な学習 学習データが膨⼤: →ランダムに分割し,少しずつ学習 ネットワークの学習 学習データをミニバッチへ分割して学習 指定回数の繰り返し ミニバッチごとの繰り返し 誤差逆伝播法による最適化 51
  55. 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. 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. 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
  58. 58. 特徴抽出+識別器としてのDeep Learning lConvolution層を持つニューラルネットワーク Ø局所的にのみ連結されたネットワーク ²画像処理における畳み込みフィルタ(convolution)に相当 Ø位置ずれへの頑健性 ²Pooling: 局所領域の特徴を集約 16チャンネル 1チャンネル Convolution Pooling 64チャンネル 16チャンネル Convolution Pooling 64チャンネル 55
  59. 59. CNNを使う時の処理⼿順 必要なモジュールの読み込み 画像の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 前 述 の DeepLearning の 処 理 の ⼿ 順 CNN を 使 う 場 合 の 処 理 の ⼿ 順 必要なモジュールの読み込み 特徴量の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 56
  60. 60. 画像の読み込み 必要なモジュールの読み込み 画像の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 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
  61. 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
  62. 62. 伝播のさせ⽅ 必要なモジュールの読み込み 画像の読み込み 層のパラメータ 伝播のさせ方 学習のさせ方 ネットワークの学習 評価 結果の集計・出力 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
  63. 63. 特徴抽出+識別器としてのDeep Learning lConvolution+Poolingのユニット数の計算 Ø画像サイズの変化 ²フィルタサイズとPoolingの移動幅によって決まる Ø全結合層のユニット数 ²最後のPooling後の画像サイズxチャンネル数 16チャンネル 1チャンネル Convolution Pooling 64チャンネル 16チャンネル Convolution Pooling 64チャンネル 28x28 26x26 9x9 8x8 3x3 3x3x64=576
  64. 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
  65. 65. まとめ lPythonでの機械学習 Øscikit-learnで多様なクラス分類器を利⽤可 ²2⾏の書き換えだけでOK Øchainerを使えば簡単にDeep Learningを利⽤可 ²CUDAがあればGPU上での動作も容易 lデータが⼤量にあればDeep Learningは強⼒ ØCNNで特徴抽出+分類器学習で⾼精度なのを確認 61
  66. 66. 参考⽂献・Webページ l今回のサンプルコード Ø https://github.com/yasutomo57jp/ssii2016_tutorial l電⼦情報通信学会総合⼤会 2016 企画セッション 「パターン認識・メディア理解」 必須ソフトウェアライブラリ ⼿とり⾜とりガイド Øhttp://www.slideshare.net/yasutomo57jp/pythonde ep-learning-60544586 62
  67. 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
  68. 68. 今回説明しきれなかった内容 lPythonのプログラミングのコツ l機械学習のより発展的な内容 Øscikit-learn でのクロスバリデーションの⽅法 Ø学習済みモデルを使ったFine-tuningの⽅法 ØRecurrent Neural Networkの作り⽅ 64 ぜひ質問ブースへお越しください

×