VGG16モデルのパラメータ数について
解決済
回答 1
投稿
- 評価
- クリップ 2
- VIEW 4,492

退会済みユーザー
質問
VGG16のモデルにおけるパラメータ数がどのように求められているのかを教えてください。
例えば、全結合層のひとつではパラメータ数が4096となっていますがそれはなぜなのでしょうか。
また最初の畳み込み層のパラメータ数は1792なのもなぜでしょうか。
よろしければ計算式を教えていただけると嬉しいです。
参考
http://aidiary.hatenablog.com/entry/20170104/1483535144
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/09/24 11:16
出力層の出力数はなぜ4096なのでしょうか。よろしければお教えください。
2018/09/24 18:43
2018/09/24 19:01
改めて全結合層の4096の数字の意味をお聞かせ頂けると嬉しいです。
出力層の1000クラス分類のお話は勉強になりました。
2018/09/24 19:26
https://arxiv.org/pdf/1409.1556.pdf
4096 という数に特に理論的な理由があるわけではありません。ネットワークのパラメータ数は解く問題に合わせて調整したほうがよいので、こうしたパラメータは変えても構いません。(過剰なパラメータは過学習の原因になる)
Deep Learning のモデルはいろいろあると思いますが、その構造に理由付けがあったとしても、理論的に決められたものではなく、論文作者がいろいろ試してみてうまくいった値が載っているだけです。
2018/09/24 19:29
2018/09/25 09:49