https://zhuanlan.zhihu.com/p/35405071
论文地址:MobileNetv1
ハワード、アンドリューG.、他 「モバイルネット:モバイルビジョンアプリケーション向けの効率的な畳み込みニューラルネットワーク。」arXivプレプリントarXiv:1704.04861(2017)。
1.はじめに
Mobilenet v1は、2017年にGoogleによってリリースされたネットワークアーキテクチャです。モバイルデバイスと組み込みアプリケーションの限られたリソースを最大限に活用し、限られたリソースの下でさまざまなアプリケーションケースに対応するためにモデルの精度を効果的に最大化することを目的としています。Mobilenet v1は、分類、検出、埋め込み、セグメンテーションなどのタスクにも使用でき、他の一般的なモデル(VGGやResNetなど)のような画像のたたみ込み機能を抽出できます。
まず、コアの深さ分離可能たたみ込みDepthwise cnn + Pointwise cnn
上の図は通常の畳み込みです。
カーネルチャネル=入力チャネル、スキャンするinput-img(HW)の対応するポイントを乗算してから、
出力チャネル=カーネルnumの
乗算計算量を合計します。F = [Ci x 3 x 3] x (H x W)x Co#ここでのC-outはkernel-numに相当します
。上の図は深さ方向のたたみ込みです。各チャネルの分離はたたみ込みであり、HW C imgを取得してから、1 * 1たたみ込み(チャネルの場合) Fusion)
乗算計算
- 1左の図の深さ分離たたみ込み:F1 = [Ci x 3 x 3] x [H x W]
- 2右の画像1x1たたみ込み:F2 = [Ci 1 x 1 x 1] x [H x W] x Co
[深さ方向+縦方向] /通常のCNN計算= 1 / Co + 1/9
(ここでCoは出力画像チャネルです)数は次のとおりです。深度分離コンボリューションは、通常のCNNをもう1つのBNに置き換えます
(
2モデルネットワーク
次のパケットは、同様のVGG積層していることが分かる
vgg16
2つのが設けられているスーパーパラメータ計算モデルの大きさと量を制御することを
- 幅の乗数:チャネル数を制御するために使用され、Afa a、<1の場合、モデルは狭められ、計算量はa²に削減されます。
- 解像度乗数:pで表される機能マップのサイズを制御するために使用され、対応する機能マップにこの乗数を適用すると、計算量を減らすことができます
ハイパーパラメータα∈[0,1]が追加され、フィーチャマップチャネルの数が制御されます。アルファが小さいほど、モデルは小さくなります。役割は、入力チャネルと出力チャネルの数を変更し、フィーチャマップの数を減らし、ネットワークをより薄くすることです
。
もちろん、ネットワークの計算の圧縮にはコストがかかります。図11は、ImageNetでの[式] Mobilenet v1のさまざまな時点でのパフォーマンスを示しています。[式]を使用しても、ImageNetではMobilenet v1の精度が63.7%であることがわかります。
入力画像の解像度を制御するためにハイパーパラメータρが追加され、ρが小さいほど入力画像は小さくなります。
結果
1分類
計算量とパラメータサイズが何倍も削減されることを前提として、accはGooglenetとVGGnetの
入力画像のサイズに相当します。
2ターゲット検出。大規模ネットワークのmAPとはかなり異なりますが、計算量は大幅に減少します
3顔分類
知识蒸馏、Facenet教Mobilenet学习识别人脸
FaceNetモデルは、最先端の顔認識モデルです[25]。三重項損失に基づいて顔の埋め込みを構築します。モバイルFaceNetモデルを構築するには、トレーニングを使用してFaceNetとMobileNetの出力の差の2乗を最小化することにより、トレーニングにトレーニングを使用します。非常に小さなMobileNetモデルの結果を表14に示します。
Interlude:2015年に提案された蒸留蒸留の知識とは
論文
どんな知識蒸留がある:私達は新しいモデルと実際のタグの一致のソフトマックス分布を作成する必要があること、そして今ちょうど新しいモデルと元のモデルは、与えられた入力配電線でソフトマックスに合わせるようにする必要がある(元の関数の新しい関数近似)
生産モデル特定のロジットは[式]であり、新しいモデルによって生成されるロジットは[式]であり、
この関数を0に近づけます
。逆伝播アルゴリズムの化学では、蒸留は異なる沸点を持つ成分を分離するための効果的な方法です。一般的な手順は次のとおりです。まず、温度を上げて低沸点成分を蒸発させ、冷却・凝縮して目的物質の分離を行います。前述のプロセスでは、最初に温度[式]を上昇させ、次にテスト段階で「低温」に戻し、元のモデルの知識を抽出するため、蒸留と呼ぶのが本当に良い
class MobileNetv1(nn.Module):
def __init__(self):
super(MobileNetv1, self).__init__()
def conv_bn(dim_in, dim_out, stride):
return nn.Sequential(
nn.Conv2d(dim_in, dim_out, 3, stride, 1, bias=False),
nn.BatchNorm2d(dim_out),
nn.ReLU(inplace=True)
)
def conv_dw(dim_in, dim_out, stride):
return nn.Sequential(
nn.Conv2d(dim_in, dim_in, 3, stride, 1, groups= dim_in, bias=False),
nn.BatchNorm2d(dim_in),
nn.ReLU(inplace=True),
nn.Conv2d(dim_in, dim_out, 1, 1, 0, bias=False),
nn.BatchNorm2d(dim_out),
nn.ReLU(inplace=True),
)
self.model = nn.Sequential(
conv_bn( 3, 32, 2),
conv_dw( 32, 64, 1),
conv_dw( 64, 128, 2),
conv_dw(128, 128, 1),
conv_dw(128, 256, 2),
conv_dw(256, 256, 1),
conv_dw(256, 512, 2),
conv_dw(512, 512, 1),
conv_dw(512, 512, 1),
conv_dw(512, 512, 1),
conv_dw(512, 512, 1),
conv_dw(512, 512, 1),
conv_dw(512, 1024, 2),
conv_dw(1024, 1024, 1),
nn.AvgPool2d(7),
)
self.fc = nn.Linear(1024, 20)
def forward(self, x):
x = self.model(x)
x = x.view(-1, 1024)
x = self.fc(x)
return x
まとめ
- DepthwiseとPointwiseを使用して、深い分離性を実現し、計算量とモデルサイズを減らします
(記事で繰り返し言及されている低レイテンシとモデルサイズ)。 - モデルは、vggスタッキングと同様に、よりレトロで、残差なし、フュージョンフュージョンおよびその他のテクノロジー
- 短所:深度分解畳み込みの各チャネルは独立しており、畳み込みカーネルの次元は小さく、出力特徴には入力特徴がほとんどなく、加えてreluはゼロになりやすく、家庭教師の特徴抽出は失敗し、畳み込みカーネルは冗長です
独自の実験結果pytorchコード(非微調整)
6 mobilenetv1 2080 t-bs:64 v-bs:64 lr:0.01 100epoch
データセットGHIM-20分類、基本的にはエポックに適合= 8000 x 64/9000 = 57ラウンド
もう一つ:核バッチサイズの影響を研究するためにブログの実験を、以下の基本的なネットワークトレーニングのインパクトファクターの分類は、トレーニングモデルの品質割合を学ぶ
https://blog.csdn.net/weixin_44523062/article/details/105457045