web-dev-qa-db-ja.com

畳み込みニューラルネットワークのパラメーターの数を計算する方法

AlexNet または VGG Net のパラメーターの正しい数を指定できません。

たとえば、VGG Netのconv3-256レイヤーのパラメーターの数を計算するには、答えは0.59M =(3 * 3)*(256 * 256)、つまり(カーネルサイズ)*(両方の積ジョイントレイヤーのチャネル数)、しかし、その方法では、138Mパラメーターを取得できません。

計算のどこが間違っているのか、正しい計算手順を教えてください。

38
Eric

16層のVGG Net(表1、列D)を参照する場合、138Mはこのネットワークのパラメーターの合計数を指します。つまり、すべての畳み込み層だけでなく、完全に接続されたもの。

3 x conv3-256層で構成される3番目の畳み込み段階を見る:

  • 最初のものには、N = 128の入力プレーンとF = 256の出力プレーンがあります。
  • 他の2つには、N = 256の入力プレーンとF = 256の出力プレーンがあります。

畳み込みカーネルは、これらの各レイヤーで3x3です。パラメータに関しては、次のことができます。

  • 128x3x3x256(重み)+ 256(バイアス)= 295,168最初のパラメータ、
  • 256x3x3x256(重み)+ 256(バイアス)= 590,080他の2つのパラメータ。

上で説明したように、すべてのレイヤーだけでなく、完全に接続されたレイヤーに対してもこれを行い、これらの値を合計して最終的な138Mの数値を取得する必要があります。

-

[〜#〜] update [〜#〜]:レイヤー間の内訳は次のとおりです。

conv3-64  x 2       : 38,720
conv3-128 x 2       : 221,440
conv3-256 x 3       : 1,475,328
conv3-512 x 3       : 5,899,776
conv3-512 x 3       : 7,079,424
fc1                 : 102,764,544
fc2                 : 16,781,312
fc3                 : 4,097,000
TOTAL               : 138,357,544

特に、完全に接続されたレイヤー(fc)の場合:

 fc1 (x): (512x7x7)x4,096 (weights) + 4,096 (biases)
 fc2    : 4,096x4,096     (weights) + 4,096 (biases)
 fc3    : 4,096x1,000     (weights) + 1,000 (biases)

(x)記事のセクション3.2を参照してください:完全に接続された層は、最初に畳み込み層に変換されます(最初のFC層は7×7変換層に、最後の2つのFC層は1×1コンバージョンレイヤー)

fc1に関する詳細

完全に接続されたレイヤーを供給する直前の空間解像度を超えると、7x7ピクセルになります。これは、このVGG Netが畳み込みの前にspatial paddingを使用するためです。

[...] convの空間パディング。レイヤー入力は、畳み込み後に空間解像度が保持されるようになっています。つまり、パディングは3×3の変換に対して1ピクセルです。レイヤー

このようなパディングを使用し、224x224ピクセルの入力画像を操作すると、解像度が次のようにレイヤーに沿って低下します。512個のフィーチャマップを持つ最後の畳み込み/プーリングステージの後、112x112、56x56、28x28、14x14および7x7です。

これにより、寸法が512x7x7のfc1に渡される特徴ベクトルが得られます。

58
deltheil

VGG-16ネットワークの計算の詳細な内訳は、 CS231n 講義ノートにも記載されています。

INPUT:     [224x224x3]    memory:  224*224*3=150K   weights: 0
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*3)*64 = 1,728
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*64)*64 = 36,864
POOL2:     [112x112x64]   memory:  112*112*64=800K  weights: 0
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*64)*128 = 73,728
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*128)*128 = 147,456
POOL2:     [56x56x128]    memory:  56*56*128=400K   weights: 0
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
POOL2:     [28x28x256]    memory:  28*28*256=200K   weights: 0
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [14x14x512]    memory:  14*14*512=100K   weights: 0
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [7x7x512]      memory:  7*7*512=25K      weights: 0
FC:        [1x1x4096]     memory:  4096             weights: 7*7*512*4096 = 102,760,448
FC:        [1x1x4096]     memory:  4096             weights: 4096*4096 = 16,777,216
FC:        [1x1x1000]     memory:  1000             weights: 4096*1000 = 4,096,000

TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
TOTAL params: 138M parameters
43
Ray

それでも、これが古い投稿であることは知っています。@ deltheilが受け入れた答えには間違いが含まれていると思います。そうでなければ、私は修正されることを嬉しく思います。畳み込み層にはバイアスがありません。つまり、128x3x3x256(重み)+ 256(バイアス)= 295,168は128x3x3x256(重み)= 294,9112でなければなりません

ありがとう

1
rav

以下のVGG-16アーキテクチャは (表1、列D)の@deltheilで強調表示されている元の論文 にあり、そこから引用しています

2.1アーキテクチャ

トレーニング中のConvNetへの入力は、固定サイズの224×224 RGB画像です。行う前処理は、各ピクセルからトレーニングセットで計算された平均RGB値を減算することだけです。

画像は、畳み込み(conv。)レイヤーのスタックを通過し、非常に小さな受容フィールドを持つフィルターを使用します:3×3(左/右、上/下、中央の概念をキャプチャするための最小サイズ) 。畳み込みストライドは1ピクセルに固定されています。 convの空間パディング。レイヤー入力は、畳み込み後に空間解像度が保持されるようになっています。つまり、パディングは3×3の変換に対して1ピクセルです。層。空間プーリングは5つの最大プーリングレイヤーによって実行されます。レイヤー(すべてのコンバージョンレイヤーの後に最大プーリングが続くわけではありません)。最大プーリングは、2×2ピクセルのウィンドウで、ストライド2で実行されます。

畳み込み層(異なるアーキテクチャで異なる深さ)のスタックの後に3つの完全接続(FC)層が続きます:最初の2つはそれぞれ4096のチャネルを持ち、3つ目は1000ウェイのILSVRC分類を実行するため、1000のチャネル(1つクラスごとに)。

最後の層は、ソフトマックス層です。

上記を使用し、

  • レイヤーの活性化形状を見つける式!

  • すべてのレイヤーに対応する重みを計算する式:

注:

  • 各アクティベーションシェイプ列を単純に乗算して、アクティベーションサイズを取得できます。

  • CONV3:入力で3 * 3のフィルターが畳み込まれることを意味します!

  • MAXPOOL3-2:平均、3番目のプーリング層、2 * 2フィルター、ストライド= 2、パディング= 0(プーリング層ではかなり標準的)

  • ステージ3:複数のCONVレイヤーがスタックされていることを意味します!同じパディング= 1、、ストライド= 1、フィルター3 * 3

  • Cin:入力レイヤーからの深度a.k.aチャンネルを意味します!

  • Cout:発信チャネルの深さを意味します(より複雑な機能を学習するために、異なるように設定します!)、

CinとCoutは、垂直エッジ、水平エッジと水平方向のエッジやエッジを45度など、さまざまなスケールで複数の機能を学習するために一緒にスタックするフィルターの数です!異なる種類のエッジのそれぞれ!!

  • n:INPUT-imageの場合、n = 224などの深さのない入力次元!

  • p:各レイヤーのパディング

  • s:各レイヤーに使用されるストライド

  • f:フィルターサイズ(CONVの場合は3 * 3、MAXPOOLレイヤーの場合は2 * 2)!

  • MAXPOOL5-2の後は、ボリュームを単純にフラット化し、最初のFCレイヤーとインターフェイスします。

テーブルを取得します:enter image description here

最後に、最後の列で計算されたすべての重みを追加すると、138,357,544(138百万)のパラメーターでVGG-15のトレーニングが行われます!

1
anu

各cnnレイヤーのパラメーターの数を計算する方法は次のとおりです。
いくつかの定義
n--フィルターの幅
m--フィルターの高さ
k--入力フィーチャマップの数
L--出力機能マップの数
パラメータの数#=(n * m * k + 1)* L。最初の寄与は重みからであり、2番目はバイアスからです。

1
saunter