質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

10842閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

3クリップ

投稿2018/09/21 11:08

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

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

###参考
http://aidiary.hatenablog.com/entry/20170104/1483535144

akkina👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/24 02:16

ご回答ありがとうございます。 出力層の出力数はなぜ4096なのでしょうか。よろしければお教えください。
tiitoi

2018/09/24 09:43

出力層の出力数は1000です。回答の「各レイヤーの出力数、フィルター数」を見てください。1000 になっているのは、重みを学習したタスクがImage Net の1000クラス分類問題だからです。
退会済みユーザー

退会済みユーザー

2018/09/24 10:01

失礼いたしました。出力層前の全結合層の質問をしたかったのです。 改めて全結合層の4096の数字の意味をお聞かせ頂けると嬉しいです。 出力層の1000クラス分類のお話は勉強になりました。
tiitoi

2018/09/24 10:26

VGG の論文を貼っておきます。 https://arxiv.org/pdf/1409.1556.pdf 4096 という数に特に理論的な理由があるわけではありません。ネットワークのパラメータ数は解く問題に合わせて調整したほうがよいので、こうしたパラメータは変えても構いません。(過剰なパラメータは過学習の原因になる) Deep Learning のモデルはいろいろあると思いますが、その構造に理由付けがあったとしても、理論的に決められたものではなく、論文作者がいろいろ試してみてうまくいった値が載っているだけです。
tiitoi

2018/09/24 10:29

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

退会済みユーザー

2018/09/25 00:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問