O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

実践者向けディープラーニング勉強会4回 ResNetでのKMNIST分類

134 visualizações

Publicada em

https://dl4-practitioners.connpass.com/event/132618/

Publicada em: Tecnologia
  • Seja o primeiro a comentar

実践者向けディープラーニング勉強会4回 ResNetでのKMNIST分類

  1. 1. ResNetを使った Kuzushiji-MNISTの分類の試し方 1
  2. 2. 照山 康平 IT系ベンダー会社勤務 ◦ 汎用機のOS開発保守 ◦ AI関連お手伝い 情報系大学学部卒 AI歴半年くらい ◦ ちゃんとやりだしたのはここ2,3カ月 2
  3. 3. くずし字って? 「くずし書きにした文字。(大辞林 第三版)」 ・・・ん? ◦ 「くずし字」という言葉自体に明確な定義はなく、非常に幅広い範囲で使われている様子。 ◦ ここでは、日本の古典籍(1867年以前の書籍)等に出てくる文字を指していきます。 人文学オープンデータ共同利用センター 日本古典籍くずし字データセット (http://codh.rois.ac.jp/char-shape/unicode/U+3042/) こんな 文字 → 3
  4. 4. そんで? 現在、くずし字を読める人が非常に少なく、古典籍を解読するのが困難になってきたため、人 ではなく、機械(AI)で解読してみる動きが出てきた。 この、「くずし字をAIで読む」をやってみる 人文学オープンデータ共同利用センター 日本古典籍くずし字データセット (http://codh.rois.ac.jp/char-shape/unicode/U+3042/) 4
  5. 5. Kuzushiji-MNIST MNISTのくずし字版として有名な、K-MNISTを使って画像から文字を分類する 人文学オープンデータ共同利用センター(http://codh.rois.ac.jp/kmnist/) ↓ このような画像データ 5
  6. 6. KMNIST – 環境 OS ◦ CentOS Linux release 7.6.1810 (Core) GPU ◦ NVIDIA Tesla V100 CPU ◦ 48 cores / Intel(R) Xeon(R) Gold 5118 CPU @ 2.30GHz RAM ◦ 384GiB プログラミング環境 ◦ Python3.6 + Keras 2.2.4 , backend=TensorFlow 6
  7. 7. KMNIST – データセット トレーニングデータ数 ◦ 232,365件 テストデータ数 ◦ 38,547件 クラス数 ◦ 49(あ,い,う,…,ん) 7
  8. 8. KMNIST – データイメージ データイメージ 28 28 実際の中身(28 x 28で、値は0~255の濃淡の配列データ) [[ 0 0 0 0 0 0 0 0 0 0 69 213 39 32 193 52 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 58 235 65 0 0 64 222 15 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 8 213 59 0 0 0 9 229 93 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 47 164 0 0 1 37 30 174 90 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 77 132 28 84 172 252 239 199 10 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 65 253 248 255 203 132 26 200 123 56 62 38 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 1 117 150 72 6 0 0 176 255 255 255 200 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 208 255 250 173 39 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 15 150 246 132 48 1 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 1 28 0 8 92 230 254 247 39 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 46 213 142 227 227 119 67 254 50 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 61 212 244 176 33 0 9 244 63 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 7 17 1 0 0 1 220 109 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 188 127 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 28 190 128 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 3 126 253 254 118 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 4 185 255 255 255 203 16 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 42 242 249 255 255 255 165 2 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 99 235 246 255 179 178 253 115 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 51 226 255 212 24 30 249 192 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 32 157 38 0 0 197 229 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 170 242 6 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 197 188 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 6 231 129 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 39 254 50 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 115 216 6 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 196 104 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 55 246 36 0 0 0 0 0 0 0 0 0 0]] 濃い 薄い 8
  9. 9. データを整形(画像) ◦ データイメージ KMNIST – データ整形 [[..., [0. ], [0. ], [0.27058825], [0.8352941 ], [0.15294118], [0.1254902 ], [0.75686276], [0.20392157], [0. ], ...], [..., [0. ], [0.22745098], [0.92156863], [0.25490198], [0. ], [0. ], [0.2509804 ], [0.87058824], [0.05882353], ...], [..., [0.03137255], [0.8352941 ], [0.23137255], [0. ], [0. ], [0. ], [0.03529412], [0.8980392 ], [0.3647059 ], ...], : [[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 213, 39, 32, 193, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 235, 65, 0, 0, 64, 222, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [ 0, 0, 0, 0, 0, 0, 0, 0, 8, 213, 59, 0, 0, 0, 9, 229, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] : (高さ, 幅, チャネル数)の形式に変更 ・28 = 元と同じ高さ ・28 = 元と同じ幅 ・ 1 = 濃淡の値の数 チャネルの値を、0~255から0.0~1.0(浮動少数)に変更 [[ ... 0, 0, 69, 213, 39, ... ] [ ... 0, 58, 235, 65, 0, ... ] : [[ ... [ 0], [ 0], [ 69], [213], [ 39], ... ] [ ... [ 0], [ 58], [235], [ 65], [ 0], ... ] : 9
  10. 10. データを整形(ラベル) ◦ データイメージ KMNIST – データ整形 [[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. 0. 0. 0. 0. 1. 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. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 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. 0. 0. 0.] ,[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 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. 0. 0.] :] [30 ,19 ,20 :] ■ One-Hot エンコーディング あるカラムだけ1で、他のカラムは全て0の行列への変換 例えば、 y = [ 犬, 猫, 鳥, 猫, 犬 ] を One-Hotエンコーディングすると、以下のようになる。 また、この場合、登場する値の種類=クラス数が3なので、 行列のサイズは、 5(値の数)×3(クラス数)になる。 ラベルをOne-Hot エンコーディング Y = [[ 1 0 0 ], ← 犬 [ 0 1 0 ], ← 猫 [ 0 0 1 ], ← 鳥 [ 0 1 0 ], ← 猫 [ 1 0 0 ]] ← 犬 10
  11. 11. 試しに、隠れ層3つくらいのネットワークで学習してみる KMNIST – お試しモデル構築 Convolution Max Pooling Convolution Max Pooling Dense Dense 11
  12. 12. KMNIST – お試し結果 3層モデルでの訓練&テスト結果 KMNIST判定なら、3層くらいでかなりの精度に 精度精度精度精度 損失損失損失損失 トレーニング 0.9940 0.0197 テスト 0.9332 0.4194 12
  13. 13. KMNIST – ResNet お題通り、ResNetに挑戦 (もう十分な精度だけど・・・) 13
  14. 14. ResNetって?(一般的なNNの問題) 一般的に、ニューラルネットワークは、層が深いほど表現力が高くなり、学習精度が向上する。 しかし、深すぎると勾配消失が起きてしまい、学習が進まなくなる。 ◦ 重みの更新(バックプロパゲーション)は、活性化関数の微分した値を掛けて、前の層に伝播していく ため、層が深いほど重みが0に近づいていく。 ◦ このため、以下のように50層の方が20層より、学習がうまくいかなくなる現象が起きる。 図:20層と50層のプレーンのネットワークを持つCIFAR-10のトレーニング誤差(左)とテスト誤差(右) (https://arxiv.org/abs/1512.03385) 14
  15. 15. ResNetって?(問題の解) これに対して、ResNetではshortcut connectionを導入することで解決 仕組み ◦ 入力画像から直接出力画像の類似度を求めるのではなく、 入力画像との差分(残差画像)を最小にするように学習させる 利点 ◦ 層が深くなっても、ちゃんと誤差が下がり、勾配損失/発散問題を解消 ◦ 残差学習により最適化が簡単になる ◦ 訓練が早くなる 残差関数: ‫ܨ‬ ‫ݔ‬ = ‫ܪ‬ ‫ݔ‬ − ‫ݔ‬ (出力と入力の差分を求める) ① 残差ブロックでは、‫ܨ‬ ‫ݔ‬ が最小になるように学習 ② ①の学習結果 ‫ܨ‬ ‫ݔ‬ に ‫ݔ‬ を足し合わせて ‫ܪ‬ ‫ݔ‬ を導く 出展:https://arxiv.org/abs/1512.03385 15
  16. 16. ResNetって? 実装イメージ ◦ Python & Keras 16
  17. 17. KMNIST – Plain net vs Residual net プレーンの3層, 18層, ResNet 18層, 34層で比較 ◦ 以下は、モデルのイメージ ◦ プレーンのネットワークは、ResNetからShortcutConnectionを抜いたものを構築 Residual net Plain net 出展:https://arxiv.org/abs/1512.03385 17
  18. 18. KMNIST – Plain net vs Residual net プレーンの3層, 18層, ResNet 18層, 34層で比較 3層くらいがもっともよい結果に… KMNISTくらいの特徴量のデータを、深い層で学習すると本来不要な特徴まで抽出してしまい、 返って分類が難しくなった結果だと解釈。 18
  19. 19. くずし字チャレンジ KMNISTでは、ResNetのような強力なネットワークとは 合わなかったので、もう少し複雑なデータの分類に挑戦 → くずし字チャレンジ! AIを使って、古典籍を読んでいく取り組み ◦ レベル1 ・・・ 1文字判定 ◦ レベル2 ・・・ 縦3文字判定 ◦ レベル3 ・・・ 未知数文字判定 1文字判定(レベル1)に挑戦 コンテスト 第21回 PRMUアルゴリズムコンテスト<https://sites.google.com/view/alcon2017prmu/> データ出展 人文学オープンデータ共同利用センター<http://codh.rois.ac.jp/char-shape/book/> 今回使用するデータセットは、コンテストのものではなく、さらに 漢字も追加された「日本古典籍くずし字データセット」で挑戦! 間違えてそれでやっちゃったので・・・。 19
  20. 20. 日本古典籍くずし字データセット KMISTと違い、各文字データは文献資料から切り取っているだけなので、サイズも色合いもまち まちで、ラベルに対するデータ量も少ない トレーニングデータ数 ◦ 63,635件 テストデータ数 ◦ 15,780件 クラス数 ◦ 1,737件 KMNIST データセット 日本古典籍くずし字データセット 20
  21. 21. データ準備 各画像でサイズがバラバラなので、リサイズして大きさを合わせる 線の太さや、全体の縦横比が崩れたりで、本当にこれでいいのか怪しい・・・ 21
  22. 22. データ準備 ラベル数に対して画像(データ)の数もバリエーションも少ないため、 keras.preprocessing.image.ImageDataGenerator を使って水増し やっていること: 拡大縮小、上下左右移動、少しだけ回転・せん断、コントラスト・明暗変更 を、ごちゃまぜにして画像を生成 ※ 大きな回転や、反転とかは、文字が変わってしまうためやらない 22
  23. 23. 学習 モデルを作って学習・・・の前に DataGenerator を使っているためフィッティングは fit_generator() で行うが、そのまま使う とデータ生成処理(CPU)に引っ張られて、学習が非常に遅くなってしまう マルチプロセス化必須! ◦ シングルプロセスで実行すると、3層ネットワークの1epochに10時間かかりました・・・ 画像生成 学習 GPU 23
  24. 24. 結果 訓練・テスト × 精度・損失 のグラフ 24
  25. 25. 結果 モデルモデルモデルモデル 精精精精 度度度度 訓練訓練訓練訓練 損損損損 失失失失 訓練訓練訓練訓練 学習時間学習時間学習時間学習時間 (分分分分/エポックエポックエポックエポック)テスト テスト Plain 3層 0.000081 16.1168 30 0.000056 16.1172 Plain 18層 0.8539 1.5626 163 0.7578 2.1671 Plain 34層 0.4538 3.1093 305 0.4454 3.1480 ★ ResNet 18層 0.9952 0.0644 45 0.8937 0.0644 ResNet 34層 0.9798 0.3031 73 0.8709 0.8073 ResNet 50層 0.9804 0.2906 105 0.8426 0.9218 KMNISTとは違い、 浅い層での分類は難しそう プレーンでも18層くらいならそれなりの 精度は得られるが、後一歩及ばず。 (それと、凄く時間がかかる!) ResNetだと、お手軽に精度が高くなる。 KMNISTの時の同様に、 18層以上だと、 不要な特徴も抽出してしまって、逆に精 度が落ちてくるのだと思われます。 25
  26. 26. まとめ ある程度の特徴量があり、表現力が必要なデータを扱う場合は、ResNetは断然強力 逆に、あまり特徴がないデータの場合、ResNetで層を深めていっても性能がいいネットワークに なるとは限らない。 26

×