stMind

about Tech, Computer vision and Machine learning

GoogLeNet(Inception V1) and Inception V3 memo

CNNの中でもよく使われるアーキテクチャの一つであるGoogLeNet。GoogLeNetの層を構成するのがInceptionで、今までにv1からv4までの改良が行われていて、またresidual blockを導入したinception-resnetも提案されています。

Mediumの解説記事を参考に、基本となるGoogLeNet(V1)とKerasなどのフレームワークでもよく使われるV3を簡単にメモ。

A Simple Guide to the Versions of the Inception Network | by Bharath Raj | Towards Data Science

Review: GoogLeNet (Inception v1)— Winner of ILSVRC 2014 (Image Classification) | by Sik-Ho Tsang | Coinmonks | Medium

Inceptionのバージョンについて

Inception V4の論文では、以下のように定義されているので、ここでもそれを参照します。

  • GoogLeNet(Inception V1)
    • [CVPR2015] Going Deeper with Convolutions
  • Inception V2
    • [ICML2015] Batch normalization: Accelerating deep network training by reducing internal covariate shift
    • GoogLeNetに対してBNを導入したもの
  • Inception V3

Inception V1

課題

  • 注目する対象というのは、画像中で任意の場所に様々なサイズで存在
  • 認識するためにフィルタサイズが重要になるが、適切に設定するのは難しい
  • Deepなネットワークは過学習しやすく、計算量も大きい

V1のアイデア

  • どれか一つのサイズを選ぶのではなく、同じ階層で色々なサイズのフィルタを同時に使う!
    • 1x1、3x3、5x5の畳み込みフィルタと3x3のmax pooling
    • 最後にChannle方向にmapを重ねる(concatenate)
  • ただし、このままだと計算量が大きいので、1x1でmap数を削減してから、3x3と5x5のフィルタを適用する
    • 例えば、Inception 3a層では、28 x 28 x 192の入力に対して、28 x 28 x 256の出力を生成する。その内訳は、
      • 1x1 conv→64個のfeature mapを出力
      • 1x1 conv + 3x3 conv→96個のfeature mapにしてから128個のfeature mapを出力
      • 1x1 conv + 5x5 conv→16個のfeature mapにしてから32個のfeature mapを出力
      • 3x3 max pool→32個のfeature mapを出力
    • max poolingの場合は、pooling後に1x1 convを適用

  • Inception V1を9ブロック組み合わせたのがGoogLeNetで22層のアーキテクチャ
    • Max Pooling + Convだと27層
  • Deepなネットワークなので、勾配消失の問題が起こりやすい。そのため、中間層(4aと4d)に補助的な識別器を追加して、ロスを計算するようにする
# The total loss used by the inception net during training.
total_loss = real_loss + 0.3 * aux_loss_1 + 0.3 * aux_loss_2

Inception V3

課題

  • モデルサイズを大きくして精度向上をしつつ、パラメータ数削減による計算効率化を行う
    • パラメータ数削減は、Mobile用途や超大規模データを扱うシナリオでは重要

V3のアイデア

  • Factorization
    • 5x5 convを2層の3x3 convに分解(factorize)=> Figure 5のInception Block(Inception A)
      • 5x5に対し、3x3 + 3x3の2層で約28%のパラメータ数削減
    • n x nのconv層を、1 x nのconv層とn x 1のconv層に分解 => Figure 6のInception Block(Inception B)
      • 3x3の場合は、1x3 convと3x1 convに分解することで、33%程度の削減
    • n x nのconv層を、1 x nのconv層とn x 1のconv層の並列に分解 => Figure 7のInception Block(Inception C)
  • Auxiliary Classifiers
    • 補助的な識別器は、学習初期にはロスが収束することにあまり寄与せず、学習後期になってようやく精度向上に寄与することがわかった
      • 低層部を取り除いても最終精度はあまり変わらない
    • 補助的な識別器は4ブロックのInception Bのあとに1つだけ
      • Batch Normalizationを入れることで性能向上
  • Efficient Grid Size Reduction
    • d x d x kから(d/2) * (d/2) * 2kの特徴マップを得ようとする場合、2つのやり方がある
      • 1 x 1 x 2kのconvolutionをしてから、poolingする→この場合だと、(d x d x k) * (1 x 1 x 2k) = 2 d2 k2が支配的なoperation
      • 逆にpoolingをしてから、1 x 1 x 2kのconvolution→この場合、(d/2 x d/2 x k) * (1 x 1 x 2k) = 2 (d/2)2 k2が支配的なoperationで1/4の計算コスト
    • 先にpoolingをした場合、計算コストは小さくなるが、Representational bottleneckとなって、表現力が低下してしまう
      • d2 kに対して (d/2)2 k
    • strideが2のconvolutionとpoolingを並列に行い、出力をchannel方向にconcatする

42層のモデルで、GoogLeNetに対して2.5倍程度の計算コストで、Top1 errorを5.6%ほど改善している。

Inception V3のネットワーク構成

Inception V3のネットワーク構成図(https://ai.googleblog.com/2016/08/improving-inception-and-image.html