VGG16モデルのパラメータ数について

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 1,292
退会済みユーザー

退会済みユーザー

質問

VGG16のモデルにおけるパラメータ数がどのように求められているのかを教えてください。
例えば、全結合層のひとつではパラメータ数が4096となっていますがそれはなぜなのでしょうか。
また最初の畳み込み層のパラメータ数は1792なのもなぜでしょうか。

よろしければ計算式を教えていただけると嬉しいです。

参考

http://aidiary.hatenablog.com/entry/20170104/1483535144

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

 パラメータの計算方法

パラメータは以下のように計算できます。

  • 全結合層

前の層の出力数が M、この層の出力数が N とした場合、

M * N + N = (M + 1) * N

N 個の各ニューロンは前の層の M 個のすべてのニューロンと結合しているので、結合の重みの数は M * N になります。
これに合わせて、N 個の各ニューロンはバイアスも持つので、この層のパラメータ数は合計は M * N + N = M * (N + 1) になります。

  • 畳み込み層

前の層の出力数が C、この層のフィルター数が N、フィルタサイズを (H, W) とた場合、

(H * W * C + 1)N

H * W * C のフィルタが N 枚あるということなので、フィルタの重みの数は C * N * H * W になります。
また各フィルターはバイアスをもつので、その数は N となります。
合計すると、H * W * C * N + N = (H * W * C + 1)N

 具体例

 VGG の構造

from keras.applications.vgg16 import VGG16
from keras.layers import Conv2D, Dense

model = VGG16(include_top=True, weights='imagenet')
model.summar()
Layer (type)                 Output Shape              Param #   
=================================================================
input_5 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
fc1 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________
fc2 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________
predictions (Dense)          (None, 1000)              4097000   
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
_________________________________________________________________

 各レイヤーの出力数、フィルター数

for i in range(1, len(model.layers)):
    layer = model.layers[i]

    if isinstance(layer, Dense):
        print('{} Conv2 name: {}, units: {}'.format(i, layer.name, layer.units))
    if isinstance(layer, Conv2D):
        print('{} Conv2 name: {}, filters: {}, kernel size: {}'.format(
            i, layer.name, layer.filters, layer.kernel_size))
1 Conv2 name: block1_conv1, filters: 64, kernel size: (3, 3)
2 Conv2 name: block1_conv2, filters: 64, kernel size: (3, 3)
4 Conv2 name: block2_conv1, filters: 128, kernel size: (3, 3)
5 Conv2 name: block2_conv2, filters: 128, kernel size: (3, 3)
7 Conv2 name: block3_conv1, filters: 256, kernel size: (3, 3)
8 Conv2 name: block3_conv2, filters: 256, kernel size: (3, 3)
9 Conv2 name: block3_conv3, filters: 256, kernel size: (3, 3)
11 Conv2 name: block4_conv1, filters: 512, kernel size: (3, 3)
12 Conv2 name: block4_conv2, filters: 512, kernel size: (3, 3)
13 Conv2 name: block4_conv3, filters: 512, kernel size: (3, 3)
15 Conv2 name: block5_conv1, filters: 512, kernel size: (3, 3)
16 Conv2 name: block5_conv2, filters: 512, kernel size: (3, 3)
17 Conv2 name: block5_conv3, filters: 512, kernel size: (3, 3)
20 Conv2 name: fc1, units: 4096
21 Conv2 name: fc2, units: 4096
22 Conv2 name: predictions, units: 1000

 質問の内容

全結合層のひとつではパラメータ数が4096となっていますがそれはなぜなのでしょうか。

4096 はパラメータ数でなく、その層の出力数です。

また最初の畳み込み層のパラメータ数は1792なのもなぜでしょうか。

最初の畳み込み層はフィルター数が64、カーネルサイズが (3, 3)、前の層は入力層なのでこの出力数は画像のチャンネルである3です。

先ほどの式に当てはめると、(3 * 3 * 3 + 1) * 64 = 1792 になります。

fc1 も見てみると、畳み込み層が出力した (7, 7, 512) の特徴マップを flatten した 25088 が前の層の出力数となります。
そして fc1 の出力数は 4096 なので、先ほどの式に当てはめると

(25088 + 1) * 4096 = 102764544

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/24 19:26

    VGG の論文を貼っておきます。
    https://arxiv.org/pdf/1409.1556.pdf

    4096 という数に特に理論的な理由があるわけではありません。ネットワークのパラメータ数は解く問題に合わせて調整したほうがよいので、こうしたパラメータは変えても構いません。(過剰なパラメータは過学習の原因になる)

    Deep Learning のモデルはいろいろあると思いますが、その構造に理由付けがあったとしても、理論的に決められたものではなく、論文作者がいろいろ試してみてうまくいった値が載っているだけです。

    キャンセル

  • 2018/09/24 19:29

    つまり、とりあえず論文と同じ出力数で試してみて、うまくいけばデフォルトのままでいいですし、うまくいかなければ、2000 でも 1000 でも好きに変えてうまくいった値を使えばいいです。

    キャンセル

  • 2018/09/25 09:49

    なるほど。現論文を読んでもFC層に関する記述はなかったため、気になっていました。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる