「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る([[ニューラルネットワーク]]、[[画像処理とコンピュータビジョン(AI)]]) --一般的なフツーの[[ニューラルネットワーク]] ---[[順伝播型ニューラルネットワーク(FNN)>ニューラルネットワーク#mcd402f7]] ---[[ディープニューラルネットワーク(DNN)>ニューラルネットワーク#ge448516]] ---畳み込みニューラルネットワーク(CNN) --[[再帰型ニューラルネットワーク(RNN)]] ---[[長短期記憶ニューラルネットワーク(LSTM)]] ---[[RNN Encoder-Decoder(Sequence-to-Sequence)]] --[[生成モデル>機械学習の理論#p3f4e303]]系の[[ニューラルネットワーク]] ---[[自己符号化器(AE:オートエンコーダ)]] ---[[テキスト生成系(Transformer系)]] ---[[敵対的生成ネットワーク(GAN)]] *目次 [#qe9e0017] #contents *概要 [#v359904c] (Convolutional Neural Network: CNN) **特徴 [#v6676d34] -一般的な順伝播型ニューラルネットワークとは異なる。 -1989年に単純な数字画像の認識のために開発された[[LeNet>深層学習(deep learning)#gecfeadd]]が原型 -データの空間的構造を学習する画像分類において、圧倒的な性能を発揮した。 -視覚神経系を模した畳み込み処理で画像から特徴抽出することで性能が出た。 -[[大規模画像認識競技会(ILSVRC)>#x295ae3d]]で使われている[[ImageNet>G検定:試験対策#f5df0a4a]]と言う大規模な画像データセットが利用できる。 -大規模コーパスで学習されたモデルの重みは公開されていて、転移学習で新たなタスク向けに再学習し、新たなタスクのモデルを作成する。 **できること [#c28a3736] ***[[物体識別>画像処理とコンピュータビジョン(AI)#c30857f1]] [#a1519834] -[[LeNet>深層学習(deep learning)#gecfeadd]] -[[AlexNet, GoogLeNet, VGGNet, ResNet>深層学習(deep learning)#y3991151]] ***[[物体検出>画像処理とコンピュータビジョン(AI)#j5d31a6f]] [#k0fca054] -R-CNN -Fast R-CNN -Faster R-CNN -FCOS -YOLO -SSD ***[[領域検出>画像処理とコンピュータビジョン(AI)#o768dc51]] [#b4bc7523] -FCN (Fully Convolutional Network) ***[[特定物体検出>画像処理とコンピュータビジョン(AI)#d53f797d]] [#sc11e1ed] -YOCLACT -Mask R-CNN *詳細 [#hac529cb] **ILSVRC [#x295ae3d] 大規模画像認識競技会(ILSVRC) ***内容 [#i0d2d27a] -[[ImageNet>G検定:試験対策#f5df0a4a]]画像を使った1000分類 -(チーター、ジャガー、ヒョウ、ユキヒョウとか単純でない) -256*256カラー画像(訓練 : 検証 : テスト = 120万 : 5万 : 15万) ***進展 [#a3cc232e] |before 2017|after 2017|h |#ref(ILSVRCbefore2017.png,left,nowrap,ILSVRCbefore2017,30%)|#ref(ILSVRCafter2017.png,left,nowrap,ILSVRCafter2017,30%)| **パート [#w5d47a4e] CNNは大きく分けて2つのパートに分けることができる。 -特徴量抽出パート --[[畳み込み層>#wf1a76fb]] --[[プーリング層>#j79f3aa4]]~ -識別パート~ 脳の神経系を模した全結合層と出力層(≒ [[DNN>ニューラルネットワーク#ge448516]])~ --全結合層を繰り返すことで最終的な出力を得る --得られた特徴量を活性化関数、[[Softmax関数>ニューラルネットワーク(推論)#b77bdfd7]]を用いてアウトプット ***畳み込み層 [#wf1a76fb] -視神経系(視覚を司る神経系)を模して画像から特徴抽出する。 -全結合層に入力する特徴を取り出すために自動化された前処理。 -畳み込み処理 --画像のフィルタ処理+活性化関数 --特徴マップを生成(様々な特徴を取り出す) -特徴 --細かい(局所的な)特徴の組み合わせから、~ 大まかな(大局的、複雑な)特徴を捉えられる。 ---手前の階層 → 波長の光に反応 ---奥の階層に進むにつれ → 線の向き、折れ線の角、直線の交差に反応 ---最奥の階層 → 特定の模様(≒ 特定のカテゴリ)に反応 --ただし、理論的な裏付けは無い。~ 生体の神経系を見よう見まねで模倣してみたら上手くいっただけで、~ CNNが高性能を実現している理由は厳密には分かっていない。 -特徴マップの生成~ --特徴マップは、画像の局所的な特徴を抽出したもの。 --1つのカーネル(フィルタ、ウィンドウ)につき1つの特徴マップが生成される。 --カーネルをn個、用意して、特徴マップをn個、生成する。 --特定のパターンを検出する「カーネルの行列」と「画像中の一部領域」の内積を計算し~ て得たスカラを「画像中の一部領域」の中心に置いて、元画像と同じサイズの特徴マップを作る。 ---「画像の一部領域」と「カーネルの行列」のサイズは同じにする。 ---位置を探し少しずつずらしながら(ストライド)内積を計算してスカラにする。 ---RGB(複数チャンネル)の場合、チャンネル毎の「カーネルの行列」で得たスカラを足し1つの特徴マップを得る。 ---ベクトルの内積と同じ様にパターンが似ている場合、スカラの値は大きくなる。 ---一部領域の中心部分と同じ位置に計算したスカラを置き、元画像と同じサイズの特徴マップを作る。 ---最後に、特徴マップにバイアスの値を足す。 -パディングとストライド --パディング(P):入力データの周りを一定の値で埋める操作 --ストライド(S):畳み込み操作において、ウィンドウを移動させるピクセル数 --式~ 入力サイズ(H, W)、フィルタ・サイズ(FH, FW)、出力サイズ(OH, OW) ---OH = 1 + (H + 2P - FH) / S ---OW = 1 + (W + 2P - FW) / S --例 ---4×4のサイズの画像に対して、3×3のカーネルをパディング0、ストライド1で適当した場合の特徴マップのサイズ~ = 1 + (4 + 0 - 3) / 1 = 1 + 1/1 = 2 なので 2×2 ---5×5のサイズの画像に対して、3×3のカーネルをパディング1、ストライド1で適当した場合の特徴マップのサイズ~ = 1 + (5 + 2 - 3) / 1 = 1 + 4/1 = 5 なので 5×5 -イメージ --計算の全体像(とあるが1画像の処理)~ #ref(filter.png,left,nowrap,filter) --フルのイメージはコチラをご参照~ https://1drv.ms/p/s!Amfs5caPP9r5jlAZEt6cg2zg_2cU?e=CgwVew --○の画像を斜線のフィルタを使って特徴マップにした例 #ref(ConvolutionalLayer.png,left,nowrap,畳み込み層,60%) ***プーリング層 [#j79f3aa4] -位置ずれや形の歪みに対する頑健性 --特徴マップから位置のズレに対して頑強な特徴抽出を行う。 --特徴同士の位置関係で見る(絶対座標ではなく、相対座標で見る)。 -特徴が特徴マップ中のどの部分に位置するか? --出力が縮小され処理の計算量が減る。 --位置ずれや形の歪みに「頑健になる」(≒同じ値を返す)。 -プーリングの種類 --最大値 ---MaxPooling:通常 ---GlobalMaxPooling:全結合層へ渡す前、Flatten代替 --平均値 ---AvgPooling:通常 ---GlobalAvgPooling:全結合層へ渡す前、Flatten代替 --Lp(Lp pooling) ---Lpノルムの値を使用する。 ---Global~は無いっぽい。 -パディングとストライド --パディング(P):なし --ストライド(S): ---(以下は)ウィンドウサイズと同じの固定値(の例) ---ウィンドウサイズと同じではない場合もある(略) --式~ 入力サイズ(H, W)、ウィンドウ・サイズ(WH, WW)、出力サイズ(OH, OW) ---OH = H / WH ---OW = W / WW --例 ---4×4の特徴マップに対して、2×2のウィンドウを適当した場合の出力のサイズ~ = 4 / 2 = 2 なので 2×2 ---6×6の特徴マップに対して、3×3のウィンドウを適当した場合の出力のサイズ~ = 6 / 3 = 2 なので 2×2 -イメージ --特徴マップにプーリングを施した例 #ref(PoolingLayer.png,left,nowrap,プーリング層,60%) **パラメタ [#c983cefd] CNNのパラメタには、[[畳み込み層>#m6368b2f]]のパラメタと[[全結合層>#g52ecf28]]のパラメタがある。 ***畳み込み層 [#m6368b2f] -この時点でカーネルは畳み込みのパラメタとして機能する。 -カーネルは重みパラメタとして機能し誤差逆伝播法によって学習できる。 ***全結合層 [#g52ecf28] -全結合層の重みは[[DNN>ニューラルネットワーク#ge448516]]の重みと同じ。 -重みパラメタは誤差逆伝播法によって学習できる。 **様々な畳み込み [#k2ad6c23] ***depth-wise畳込 [#x8fd2ba5] depth-wise Convolution(グループ化畳込) ***point-wise畳込 [#qfbf41f7] 1*1 Convolution(1*1畳込)、 -概要 --空間グリッド上の1点のみにチャンネル方向に畳み込む --点単位畳み込み層 (pointwise convolution)とも呼ばれる。 --Network-in-Networkで提案されたアイデアで[[GoogLeNet>#w86a9171]]の~ [[Inceptionモジュール>#o50ffd37]]で採用されたことをきっかけに広く使われるようになった。 -内容 --入力画像のサイズを変えずにチャンネル数(特徴マップ数)を変更する畳み込み操作 --特徴マップ上の各1グリッドにおいて深さ方向の畳み込みのみを個別実行するという処理 --チャンネル数を減らすことでパラメタ数が減り次元削減の効果が現れる~ 上記はConvのFN(フィルタ数)で特徴マップ数が変わることから、~ あまり、処理内容を詳しくイメージできなくても、「確かに。」となる。~ (チャンネル数(CH)は二層目以降ではフィルタ数(FN)に対応した特徴マップ数になる) -用途 --「画素単位での識別器」としての使用~ 物体検出、[[セマンティック・セグメンテーション>画像処理とコンピュータビジョン(領域検出)]]の終盤層で~ 空間サイズが狭まった特徴マップに対し使用することが試された。 --「チャンネル方向の次元削減」としての使用~ フィルタ数を少なくしておくと、「チャンネル方向の次元削減」が可能。 ***逆畳み込み [#k21bbb51] -様々な呼称がある。 --逆畳み込み(Deconvolution) --転置畳み込み(Transposed Convolution) --上昇畳込み(Up Convolution) --アップサンプリング(Up Sampling) -畳み込みの逆プロセスではない事に注意。 --入力データを拡大してから畳み込みを行う処理 --一度畳み込みで圧縮したデータをもとのサイズに戻す。 --入力データを完全に復元するものでもない --[[セグメンテーション>画像処理とコンピュータビジョン(AI)#o768dc51]]や[[生成分野>ニューラルネットワーク#ff89dd92]]などでよく使われる。 https://nisshingeppo.com/ai/whats-deconvolution/ **モジュールやブロック [#o97abafa] ***Inceptionモジュール [#o50ffd37] -概要 --省パラメタながらも高い表現力を持ち計算効率性も良い「ブロック」([[構造>https://www.google.com/search?q=Inception%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB&tbm=isch]]) --大きな畳み込みフィルタを小さな畳み込みフィルタのグループで近似し、少ないパラメタ数で表現力を改善している。 ---CNNはパラメタ数が増えてもスパース(疎)になってしまい無駄が多いのでデンス(密)にしたい。 ---スパース(疎)をデンス(密)にする ≒ 人間 / 犬 / 猫の目 / 鼻 / 口を共通化するみたいな話。 ---スパース(疎)をデンス(密)にするには、相関のあるニューロンをまとめる。~ ・相関のあるニューロンとは特徴マップ上の同じ位置のニューロン~ ・[[1*1 Conv>#qfbf41f7]]で次元削減すると相関のあるニューロンをまとめられる。 ---コレは重み0のパラメタを排除しているとみなせるため、相対的にデンス(密)になる。 -並列化 --多様なサイズ経路に4並列化(=ワイド化) --多様な畳み込みサイズの特徴マップを合成 -パラメタ削減~ 各経路の次元削減による軽量化 --4並行パス構成だとパラメタ数が多い --何個も繋げていくとパラメタが多過ぎて上手く学習できなくなる。 --[[1*1 Conv>#qfbf41f7]]を3つの各経路の最初に導入し次元削減後に[[畳み込み>#wf1a76fb]] --同時期の[[VGGNet>#b9831538]]よりも、かなりパラメタ数が少ないながら同等の精度を達成。 ***Residualブロック [#z4eca8cf] (残差ブロック) -概要 --劣化問題を解決する残差学習に対応した「ブロック」([[構造>https://www.google.com/search?q=Residual%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF&tbm=isch]]) ---Bottleneckアーキテクチャ(1*1, 3*3, 1*1) ---畳み込み層とSkip Connection(Identity mapping)~ ・層が深くても恒等写像の維持が可能になる(変換が必要ない時、重み0でOK)~ ・また、僅かな勾配も消失することなく残すので僅かな変換も可能になる。 ---<ResNet-34>~ ・[[3*3 Conv>#wf1a76fb]](FNは指定の値)~ ・[[3*3 Conv>#wf1a76fb]](FNは指定の値)~ ・入力を残差接続で迂回させて足す。 ---<ResNet-152>~ TypeA, B, C, D でFN値が異なる。~ ・[[1*1 Conv>#qfbf41f7]](FN = A:64, B:128, C:256, D:512)~ ・[[3*3 Conv>#wf1a76fb]](FN = A:64, B:128, C:256, D:512)~ ・[[1*1 Conv>#qfbf41f7]](FN = A:256, B:512, C:1024, D:2048)~ ・入力を残差接続で迂回させて足す。 --処理内容は、単純に、 ---[[1*1 Conv>#qfbf41f7]]、[[n*n Conv>#wf1a76fb]]した後に、 ---入力を残差接続 (residual connection) で迂回させて足す。 ---足す際のサイズ調整には2通りの方法がある。~ ・(パラメタ節約)単純に画像を圧縮しチャネルは削る方法~ ・(精度は高い)[[1*1 Conv>#qfbf41f7]](S>1)で画像を圧縮しチャネルを削る方法 -劣化問題・残差学習~ degradation(劣化問題) と residual learning(残差学習) --degradation(劣化問題) ---深くしたほうが性能が悪くなる(18層 → 34層)。 ---しかも訓練データに対しても性能劣化した(過学習&汎化性能でもない) ---深くした方が「数学的には」・「表現力が豊か」であるはず。 ---「数学的には」→ 学習の(近似計算の最適化)問題を考慮していない。 ---「表現力が豊か」→ (34が18に劣るというのは)恒等写像の学習が困難と言う仮説 --residual learning(残差学習) ---通常の学習はy=h(x)のhのパラメタを学習 ---残差学習はy=h(x)=f(x)+xのfのパラメタを学習(xは恒等写像 ---パラメタ0で恒等写像を出力(学習?)可能 ≒ 恒等写像との差分を学習するようになる。 ---その他にも、[[勾配消失>ニューラルネットワーク#id252e38]]が起き難いと言うメリットもあるらしい。 -パラメタ削減 --residual learning(残差学習)ではパラメタが増加しない。 --ResNet-152のResidualブロックでは[[3*3 Conv>#qfbf41f7]]前後で~ [[1*1 Conv>#qfbf41f7]]により実質パラメタの削減・復元を行っている。 **著名なモデル(物体識別) [#l62c4148] ***LeNet [#n2ea2983] -LeNet --[[歴史>深層学習(deep learning)#gecfeadd]]~ 誤差逆伝播法の発見から僅か2年後 --論文(89)~ Introduction(多変量解析には無かった) ---誤差逆伝播法 ---訓練&テスト・データ ---複雑なモデルには大規模なデータ ---過学習に気を付ける。 --タスク ---手書き文字認識(MINST未満のマウスdeペイント文字) ---16 * 16の480枚(訓練 : テスト = 320 : 160) --アーキテクチャ ---図がない。 ---構造の説明~ ・入力 : 16*16~ ・Conv : FN=2, FHW=3*3, S=2, + tanh → 8*8*2~ ・Conv : FN=4, FHW=5*5, S=2, + tanh → 4*4*4~ ・4*4*4 をFlatten → Affine → tanh(≠ Softmax)で10~ ・損失関数は、Categorical Cross EntropyではなくMSE --精度とポイント ---精度:98.4% ---ポイント~ ・AffineよりConvでパラメタ数削減~ ・チャンネルを増やすと良い結果が出る -LeNet-5 --[[歴史>深層学習(deep learning)#l4dfaaff]] ---10年後の性能向上版 ---(間にLeNet-1、-4、Boosted -4 とか色々ある) --論文(98)~ Introduction:(SDGの)局所解だけどOK --タスク~ 郵便番号のようなものを分類 --アーキテクチャ ---[[LeNet-5 図>https://www.google.com/search?q=LeNet-5&tbm=isch]] ---構造の説明~ ・入力 : 32*32(Padding済みらしい)~ ・Conv : FN=6, FHW=5*5, S=1, + tanh → 28*28*6~ ・Avg Pooling : 2*2, S=1, + tanh → 14*14*6~ ・Conv : FN=16, FHW=5*5, S=1, + tanh → 10*10*16~ (フィルタの見る特徴マップがマッピングで指定されているらしい)~ ・Avg Pooling : 2*2, S=1, + tanh → 5*5*6~ ・Conv : FN=120, FHW=1*1, S=1, + tanh → 1*1*120(実質Affine)~ ・1*1*120 をFlatten → Affine + tanhで84 → Affine + ERBF(≠ Softmax)で10 ***AlexNet [#w1e5ff6b] -[[歴史>深層学習(deep learning)#gecfeadd]]~ --[[ReLU>ニューラルネットワーク#x80775f2]]の発見から僅か2年後 --[[ドロップアウト(Dropout)>深層学習のテクニック#hf3c7a28]]の発見の同年 --[[ILSVRC>#x295ae3d]]2012で優勝し、Deep Learningブームの火付け役となった -論文(12)~ Introduction: --活性化関数に[[ReLU>ニューラルネットワーク#x80775f2]]を使用 --[[ドロップアウト(Dropout)>深層学習のテクニック#hf3c7a28]]の導入 --大量のデータ + [[GPUと並列計算>深層学習(deep learning)#y9b7e27c]] -タスク~ [[ILSVRC>#x295ae3d]] -アーキテクチャ --[[AlexNet 図>https://www.google.com/search?q=AlexNet&tbm=isch]] --特徴の説明~ --構造の説明 ---入力 : 224*224*3ch([[256*256をデータ拡張>深層学習のテクニック#l8a79d61]]) ---Conv : FN=96, FHW=11*11, S=4, + LRN → 55*55*96 → 55*55*48*2(分割して並列化) ---Max Pooling : 3*3, S=2 → 27*27*48*2(サイズで割るんじゃなくてストライドで割る感じ) ---Conv : FN=128, FHW=5*5, P=2, S=1, + LRN = 27*27*128*2 ---Max Pooling : 3*3, S=2 → 13*13*128*2 ---Conv : FN=192, FHW=3*3, P=1, S=1, + LRN = 13*13*192*2(入力データを2ノード間で交換するらしい) ---Conv : FN=192, FHW=5*5, P=2, S=1, + LRN = 13*13*192*2 ---Conv : FN=128, FHW=5*5, P=2, S=1, + LRN = 13*13*128*2 ---Max Pooling : 3*3, S=2 → 6*6*128*2 ---6*6*128*2 をFlatten → Affine で2024*2 → Affine で2024*2 → Affine で2024*2 → Affine + Softmaxで1000 -精度とポイント --精度: ---誤答率16%と2位が前年度優勝と≒の26%に大差 ---ココからの怒涛の精度改善のきっかけになった。 ---なお、AlexNetでのCIFAR-10の精度は89%らしい。 --ポイント ---非DL時代からDL時代へ。 ---力技のモデル(CNN層をシンプルに積重ね深く、並列計算で大きく出来た) ---LRN(Local Response Normalization、局所応答正規化)はマイナーテク ***GoogLeNet [#w86a9171] -[[歴史>深層学習(deep learning)#gd4ee195]] --Google, 2014 --分類、検出部門で優勝 --[[Inceptionモジュール>#o50ffd37]]で更に深いCNNを構成 -論文(15)~ Introduction: -タスク~ [[ILSVRC>#x295ae3d]] -アーキテクチャ --[[GoogLeNet 図>https://www.google.com/search?q=GoogLeNet&tbm=isch]] --9個の[[Inceptionモジュール>#o50ffd37]] -精度とポイント --精度:6.7% --ポイント~ 深いネットワークを構築できる。 ---1*1 Convで軽量になった[[Inceptionモジュール>#o50ffd37]]を積み重ねる(ネットワーク in ネットワーク) ---ネットワークの途中からの分岐でクラス分類を行うAuxiliary Classifier の Auxiliary Lossは、~ 勾配消失問題に対処する効果があり、また、バッチ正規化、アンサンブル学習と同様の効果が得られる。 ***VGGNet [#b9831538] このうちの性能が良かった VGG16 または VGG19 が使われている。 -[[歴史>深層学習(deep learning)#gd4ee195]] --オックスフォード, 2014 --分類部門で2位 --多層から成るCNN -論文(14)~ 19層より深いものも試したが、19層がベストだった。 -タスク~ [[ILSVRC>#x295ae3d]] -アーキテクチャ --[[VGGNet 図>https://www.google.com/search?q=VGGNet&tbm=isch]] --特徴の説明~ アーキテクチャがシンプル ---VGG16 は 畳み込み13層と全結合3層の計16 ---VGG19 は 畳み込み16層と全結合3層の計19 --構造の説明 ---入力 : 224*224*3ch([[256*256をデータ拡張>深層学習のテクニック#l8a79d61]]) ---Conv : FN=64, FHW=3*3, P=1(以下Conv3でFWH, P略) ---Conv3 : FN=64 ---Max Pooling : 2*2, S=2(以下略) → 112*112*64 ---Conv3 : FN=128 ---Conv3 : FN=128 ---Max Pooling → 56*56*128 ---Conv3 : FN=256(VGG16*3、VGG19*4 ---Max Pooling → 28*28*256 ---Conv3 : FN=512(VGG16*3、VGG19*4 ---Max Pooling → 14*14*512 ---Conv3 : FN=512(VGG16*3、VGG19*4 ---Max Pooling → 7*7*512 ---7*7*512 をFlatten → Affineで4096 → Affineで4096 → Affine + Softmaxで1000 -精度とポイント --精度:6.8% --ポイント ---[[3*3 Conv>#wf1a76fb]]だけでこの精度 ---奥の階層が汎用的な特徴を獲得しているから~ [[転移学習>深層学習のテクニック#ebe9edcc]]、[[ファイン・チューニング>深層学習のテクニック#ea94272b]]に利用できる。 ***ResNet [#x56d1a9e] [[Residualブロックにおける残差学習の導入>畳み込みニューラルネットワーク(CNN)#z4eca8cf]]により、152層の深いネットワークの学習を可能にした -[[歴史>深層学習(deep learning)#ca8279e0]] --Microsoft Research, 2015 --初めて人間のエラー率 5% を上回る精度を達成。 --[[Residualブロックにおける残差学習の導入>畳み込みニューラルネットワーク(CNN)#z4eca8cf]]により、より深いCNNの学習方法を提案 --ある層で求める最適な出力を学習するのではなく層の入力を参照した残差関数を学習。 --入力層から出力層まで伝播する値と入力層の値を足し合わせたモデルで入力層まで、~ 勾配値がきちんと伝わり、今では1000層といったかなり深い構造でも学習が可能となった。 -論文(16) --[[勾配消失>ニューラルネットワーク#id252e38]]の話は全く触れていない。 --[[劣化問題>#z4eca8cf]]の問題から、どのようにResNetへ辿り着いたか? --18、34、154、1202層のものを評価して劣化問題が発生しないことを確認している。 --1202でも学習可能で[[AlexNet>#w1e5ff6b]]よりパラメタ数が少ない(汎化性能は154の方が良い)。 --あとは、[[Heの初期値>深層学習のテクニック#cda1d3c9]]と[[バッチ正規化>深層学習のテクニック#t3c6ab88]]などによって[[劣化問題からの最適化問題>#z4eca8cf]]に取り組んでいる。 -タスク~ [[ILSVRC>#x295ae3d]] -アーキテクチャ --[[ResNet 図>https://www.google.com/search?q=ResNet&tbm=isch]] --[[Residualブロック>#z4eca8cf]] --構造の説明 ---<ResNet-34>~ ・入力 : 224*224*3ch([[256*256をデータ拡張>深層学習のテクニック#l8a79d61]])~ ・Conv : FN=64, FHW=7*7, S=2~ ・Max Pooling : 3*3, S=2~ ・Residualブロック(全部のConvのFN= 64, 先頭ConvだけS=2)を3層~ ・Residualブロック(全部のConvのFN=128, 先頭ConvだけS=2)を4層~ ・Residualブロック(全部のConvのFN=256, 先頭ConvだけS=2)を6層~ ・Residualブロック(全部のConvのFN=512, 先頭ConvだけS=2)を3層~ ・Global Average Pooling~ ・...をFlatten → Affine + Softmaxで1000 ---<ResNet-152>~ ・入力 : 224*224*3ch([[256*256をデータ拡張>深層学習のテクニック#l8a79d61]])~ ・Conv : FN=256, FHW=7*7, S=2~ ・Max Pooling : 3*3, S=2~ ・ResidualブロックA(先頭ConvだけS=2)を3層~ ・ResidualブロックB(先頭ConvだけS=2)を8層~ ・ResidualブロックC(先頭ConvだけS=2)を36層~ ・ResidualブロックD(先頭ConvだけS=2)を3層~ ・Global Average Pooling~ ・...をFlatten → Affine + Softmaxで1000 -精度とポイント --精度:3.57% --ポイント:[[Residualブロック>#z4eca8cf]] -WideResNet --概要 ---層の深さを減らし幅(フィルタ数)を増やす。 ---結果としてパラメタ数は増えるが高精度かつ高速。 --[[Residualブロック>#z4eca8cf]]の改良~ 表現力を向上させる方法は以下の3つが考えられる。 +++ブロックにより多くの畳み込み層を加える。 +++より多くの特徴マップを加えることで畳み込み層を広げる。 +++畳み込みフィルターサイズを大きくする。~ --検証結果、フィルター数を大きくするのが効果的。 ---小さいフィルターの方が効率的と研究では明らかになっている。 ---パラメタk:フィルタ数を k 倍する(パラメタ数と計算量は k の 2乗 ---シート中のk=1 のとき、元のResNetと同じで、k>1のときWideResNet。 ***HighwayNets、DenseNet [#gd254232] -HighwayNets (2015 --ただ持ち越すだけで良いか? --持ち越す割合を重みとして一緒に学習する。 --f(x)+x → f(x)+wx -DenseNet (2016 --全層間をスキップ接続する --複数のスキップが合流する所は足し算じゃないよね? ***EfficientNet [#fcab09bd] -Google, 2019 --シンプルな CNN モデルを効率的(Efficient)にスケーリング --スケーリングとは計算リソースを大きくすることで精度向上を目指す意味 --パラメタは関係しあっているためバランスをとりながらスケーリングする。 -パラメタ --深さ:層の深さ、α^φ~ 層を深くすることで ---複雑な特徴を捉えられる ---その分学習コストがかかる ---勾配消失問題により精度向上に限界がある --幅:フィルタ数、β^φ~ 広さ(フィルタ数)を広げることで ---細かい特徴を捉えられる ---広さに対して深さが浅いと複雑な特徴を捉え辛い --解像度:入力画像の大きさ、γ^φ~ 解像度が高いほうが細かい特徴を捉えられる -FLOPSは (α*β^2*γ^2)^ϕに従って増えてしまうため~ α*β^2*γ^2 ≒ 2に制限することで増え方を 2^ϕ で増えるようにした。 -αβγを[[グリッド・サーチ>データマイニング(DM)- Python#d182a112]]で求める(φはパラメタ) ***MobileNet [#wa2069dd] スマホ用CNNで、ボトルネックの畳み込みの分割で計算量を減らす。 -CNNはパラメタ数が多過ぎるのでパラメタ数削減を考える。 -空間方向とチャネル方向の畳み込みを別々に行いパラメタの数を減らす。 --各チャネルを独立に畳み込み、チャネル方向を大きさ1のカーネルを用いて畳み込み。 --パラメタ数 = FH*FW*FN*CH → = FH*FW*CH + 1*1*CH*FN = FH*FW*CH + CH*FN **CNNの応用([[物体識別>画像処理とコンピュータビジョン(物体識別)]]以外) [#w56cd36b] ***[[物体検出>画像処理とコンピュータビジョン(物体検出)]] [#t47c7e94] ***[[領域検出>画像処理とコンピュータビジョン(領域検出)]] [#pc6ea947] ***[[特定領域検出>画像処理とコンピュータビジョン(特定領域検出)]] [#q2e37b90] *参考 [#k630d354] -深層学習についてのレポート(CNN編)~ https://www.osscons.jp/joho108j0-537/#_537 -コンテンツへのリンク - OSSコンソーシアム~ https://www.osscons.jp/joho108j0-537 --深層学習についてのレポート(CNN編)~ https://1drv.ms/p/s!Amfs5caPP9r5jlAZEt6cg2zg_2cU --機械学習・深層学習についてのNotebook~ https://github.com/OpenTouryoProject/DxCommon/tree/master/Notebook/Jupyter -[[O'Reilly Japan - ゼロから作るDeep Learning>ニューラルネットワーク#w79e9c10]]~ (Pythonで学ぶディープラーニングの理論と実装) **YouTube [#o71ae073] ***[[予備校のノリで学ぶ「大学の数学・物理」>深層学習(deep learning)#p9b8901b]] [#d1881660] -高校数学からはじめる深層学習入門~ (畳み込みニューラルネットワークの理解)~ https://www.youtube.com/watch?v=xzzTYL90M8s ***[[t-uesugi/videos>深層学習(deep learning)#ga71ee2d]] [#f3040f2d] -深層学習概論 --1. 画像の扱い~ https://www.youtube.com/watch?v=V-lVzF7Ue7M --2. 畳み込み層~ https://www.youtube.com/watch?v=AWUyOdJJ7Sg --3. プーリング層~ https://www.youtube.com/watch?v=hwCudq8ZCwg --4. ミニバッチ学習~ https://www.youtube.com/watch?v=nty3w5HnHZ4 --5. ドロップアウトとバッチ正規化~ https://www.youtube.com/watch?v=Dk4wEI8WDPU ***[[AIcia Solid Project>深層学習(deep learning)#z59ed24b]] [#o0b2397c] -CNN紹介動画~ https://www.youtube.com/playlist?list=PLhDAH9aTfnxIGIvLciL1CtE59VGrEx4ER -深層学習 ディープラーニングの世界(中にCNNも含まれる~ https://www.youtube.com/playlist?list=PLhDAH9aTfnxKXf__soUoAEOrbLAOnVHCP --畳み込み層の本当の意味、あなたは説明できますか?~ https://www.youtube.com/watch?v=vU-JfZNBdYU --プーリング層 - シンプルだけど大きな役割を担う層~ https://www.youtube.com/watch?v=MLixg9K6oeU **Qiita [#cb0de391] -畳み込みニューラルネットワークの最新研究動向 (〜2017)~ https://qiita.com/yu4u/items/7e93c454c9410c4b5427 **[[TensorFlow・Kerasでの実装例>TensorFlow・Keras#m54cf129]] [#beba8a51]