###質問
VGG16のモデルにおけるパラメータ数がどのように求められているのかを教えてください。
例えば、全結合層のひとつではパラメータ数が4096となっていますがそれはなぜなのでしょうか。
また最初の畳み込み層のパラメータ数は1792なのもなぜでしょうか。
よろしければ計算式を教えていただけると嬉しいです。
###参考
http://aidiary.hatenablog.com/entry/20170104/1483535144
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
パラメータの計算方法
パラメータは以下のように計算できます。
- 全結合層
前の層の出力数が 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 の構造
python
1from keras.applications.vgg16 import VGG16 2from keras.layers import Conv2D, Dense 3 4model = VGG16(include_top=True, weights='imagenet') 5model.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 _________________________________________________________________
各レイヤーの出力数、フィルター数
python
1for i in range(1, len(model.layers)): 2 layer = model.layers[i] 3 4 if isinstance(layer, Dense): 5 print('{} Conv2 name: {}, units: {}'.format(i, layer.name, layer.units)) 6 if isinstance(layer, Conv2D): 7 print('{} Conv2 name: {}, filters: {}, kernel size: {}'.format( 8 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/21 12:03
総合スコア21958
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/09/24 02:16
2018/09/24 09:43
退会済みユーザー
2018/09/24 10:01
2018/09/24 10:26
2018/09/24 10:29
退会済みユーザー
2018/09/25 00:49
2021/05/06 00:34