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.

NINと画像分類

1,612 views

Published on

2016/12/17に株式会社メディア工房様にて開催された人工知能ハッカソンでの発表資料。
発表内容は下記の3点である。

1. Chainerを使用したCNNによるキノコの分類問題への取り組み
2. パラメータ調整について
3. NIN(Network in Network)について

Published in: Technology
  • Be the first to comment

NINと画像分類

  1. 1. NINと画像分類 for 【第1回】人工知能ハッカソン in メディア工房 Tomomi Daigo sat.Dec.17.2016
  2. 2. 自己紹介 名前:大郷 友海 職業:プログラマ
  3. 3. 話すこと 1. Chainerで画像分類を試みている 2. 正解率(accuracy)が上がらない 3. NIN(Network in Network)について
  4. 4. 話すこと 1. Chainerで画像分類を試みている 2. 正解率(accuracy)が上がらない 3. NIN(Network in Network)について
  5. 5. 1. Chainerで画像分類を試みている
  6. 6. 動機 ・ キノコを分類したい! http://cdn-ak.f.st-hatena.com/images/fotolife/d/defender_21/20160114/20160114085535.jpg
  7. 7. データセット ・ 画像検索で集めたキノコ画像742枚 ・ クラス数は7 ・ 256*256(カラー)に揃える
  8. 8. プログラム ・ chainer v1.5.01 付属のexamplesより、imagenetをコピー ・ ブログ記事等を参考に動かす ・ threadingなどコードが難しいため、簡略化 ・ モデルは3層CNN + 2層全結合層 を作成 試行錯誤の末・・・ 1  https://github.com/pfnet/chainer/releases?after=v1.6.2
  9. 9. 結果 Validationの正解率(accuracy) = 56.25%
  10. 10. 内訳・・・アルゴリズム ・ 学習用画像は540枚 ・ (画像-平均画像) / 標準偏差 で正規化 ・ 224*224(カラー)にランダム切り抜き ・ 16枚ずつミニバッチ学習 ・ epoch=50 ・ optimizerはAdam ・ WeightDecay=0.0005, GradientClipping=8.75
  11. 11. 内訳・・・モデル ・ L.Convolution2D(3, 6, 7), ・ L.Convolution2D(6, 3, 5), ・ L.Convolution2D(3, 2, 3), ・ l1=F.Linear(1152,500), ・ l2=F.Linear(500,7), < reluとmax_pooling_2d(ksize=3, stride=2) < reluとaverage_pooling_2d(ksize=3, stride=2) < reluとaverage_pooling_2d(ksize=3, stride=2) < reluと F.dropout(ratio=0.3) in, out, ksize
  12. 12. 2. 正解率(accuracy)が上がらない
  13. 13. 結果 Validationの正解率(accuracy) = 56.25% ・・・せっかくなのでもう少し上げたい。
  14. 14. データセット見直し ・ 画像検索で集めたキノコ画像742枚→ノイズ付加で水増し1 して13,356枚に! ・ クラス数は7 ・ 256*256(カラー)に揃える →64, 32pxおよびモノクロも試す 1  http://qiita.com/bohemian916/items/9630661cd5292240f8c7
  15. 15. アルゴリズム見直し ・ 学習用画像は540枚 →10,017枚 ・ (画像-平均画像) / 標準偏差 で正規化 ・ 224*224(カラー)にランダム切り抜き →192,128,64,32,28px等・・・ ・ 16枚ずつミニバッチ学習 →20, 8枚(20枚以上は厳しい) ・ epoch=50 →200等(上げると過学習する) ・ optimizerはAdam ・ WeightDecay=0.0005, GradientClipping=8.75 →Clippingを1〜10まで変化
  16. 16. モデル見直し ・ L.Convolution2D(in_channels, out_channels, ksize)をひたすら調整 ・ Convolution→BatchNormalization→relu→maxPooling とするとaccuracy改善 するらしいが、今回は観測できず。 ・ Convolution層のチャネル数が入力から出力側へ向けて大きくなっていく構造を よく見かけた。どういうことかというと・・・ 1  http://hirotaka-hachiya.hatenablog.com/entry/2016/08/06/175824
  17. 17. モデル見直し ・ L.Convolution2D(3, 6, 7), ・ L.Convolution2D(6, 3, 5), ・ L.Convolution2D(3, 2, 3), ・ l1=F.Linear(1152,500), ・ l2=F.Linear(500,7), こうではなく て、 ・ L.Convolution2D(3, 6, 7), ・ L.Convolution2D(6, 9, 5), ・ L.Convolution2D(9,12, 3), ・ l1=F.Linear(1152,500), ・ l2=F.Linear(500,7), こう。(値は適当) ksizeはその逆パターン?(未確 認) in, out, ksize
  18. 18. 見直し結果 良さそうなものもあったが、全体的に過学習気味。 (train と validation の差が非常に大きい・・・)
  19. 19. 見直し結果 ・ 大きめのミスに気づく  epoch毎に画像をランダムに並び替えるはずが、最初の1回しか並び替えていない 修正すると・・・
  20. 20. 見直し結果 一気に未学習気味になった。epochを上げても改善せず。 (train も validation も正解率が小さい・・・)
  21. 21. (参考) 過学習 / 未学習 ● 過学習に有効 ○ 学習データを増やす ○ 変数を減らす ○ λ(正則化パラメータ)を大きくする ● 高バイアスに有効 ○ 変数増やす ○ 多項式にする(モデルを複雑にする) ○ λ減らす ※2 ※1 "Python Machine Learning" より引用 参考: http://chezou.hatenablog.com/entry/2016/05/29/215739 ※2 http://lab.synergy-marketing.co.jp/blog/tech/machine-learning-stanford-3 ※1
  22. 22. NIN ・ 未学習気味になったものと同じアルゴリズムで、chainer付属のninを移植して学習 させてみると・・・
  23. 23. NIN 正解率が63.9%に!
  24. 24. 3. NIN(Network in Network)について
  25. 25. NIN(Network in Network) ・ Min Linら(2014)の提案したニューラルネットワークアーキテクチャ1 ・ 従来のCNNの線形フィルタを多層パーセプトロン(MLP)に置き換える ・ CNNは層が進むほど広域をフィルタして高次の概念を生成するが、この提案は局 所的な画像が統合されて高次の概念になる前により良い抽象化をすることに意義が ある。 1  https://arxiv.org/abs/1312.4400
  26. 26. NIN(Network in Network) http://qiita.com/muddydixon/items/11ce0e7352c82bc07fcc ↑ 論文中にあるNINの全体図。3つのMLP層とGlobalAveragePooling層が使 用されている ←NIN内の各レイヤ出力の計算式。活性化関数にreluが使われている。  i,jは入力フィーチャマップpixelのインデックス。kはチャネルのインデックス、  nはMLP層の数 
  27. 27. Global Average Pooling   1  https://arxiv.org/abs/1312.4400 ・ 同論文で提案されている正則化手法(regularizer)1 ・ 従来のCNNはConvolutionで特徴抽出をし、全結合層で分類するが、全結合層は 過学習しやすい。 ・ 本手法はこの全結合層をAveragePoolingで置き換え、CNNと各クラスへの出力 を橋渡しする。(クラスラベル1つにつき1つのフィーチャーマップが出力される) ・ 学習パラメータを持たないため、過学習に強い
  28. 28. chainer付属nin.pyのモデル定義  w = math.sqrt(2) mlpconv1=L.MLPConvolution2D(3, (96, 96, 96), 11, stride=4, wscale=w), mlpconv2=L.MLPConvolution2D(96, (256, 256, 256), 5, pad=2, wscale=w), mlpconv3=L.MLPConvolution2D(256, (384, 384, 384), 3, pad=1, wscale=w), mlpconv4=L.MLPConvolution2D(384, (1024, 1024, 1000), 3, pad=1,wscale=w),
  29. 29. chainer付属nin.pyのforward   h = F.max_pooling_2d(F.relu(self.conv1(x)), 3, stride=2) h = F.max_pooling_2d(F.relu(self.conv2(h)), 3, stride=2) h = F.max_pooling_2d(F.relu(self.conv3(h)), 3, stride=2) h = self.conv4(F.dropout(h, train=self.train)) y = F.reshape(F.average_pooling_2d(h, 6), (x.data.shape[0], 1000))
  30. 30. 展望  ・ NIN等の手法から学んで、分類精度を上げて行きたい。
  31. 31.   ご清聴ありがとうございました。

×