VGG16とは
今までノリでVGG16を使ってきたので今回もっとちゃんと理解するためにまとめることにした。
VGG16とは畳み込みが13層、全結合層が3層の合計16層からなるニューラルネットワークです。2014年のILSVRCで2位になった。
転移学習、fine tuning 、などでよくつかわれる。
転移学習は
ImageNetという超たくさんの画像データを用いて学習済みのモデルがkerasには入っていて、それを用いることが多いです。(kerasでは重みをダウンロードする必要もない)
Layer (type) Output Shape Param #
=================================================================
input_1 (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
これが全体像です。
真ん中の(None, 14, 14, 512)みたいなのは、それぞれ画像の枚数、縦のサイズ、横のサイズ、その層の出力数を表しています。
パラメータの計算方法
畳み込み層では
フィルタ(カーネル)のサイズをH×Wとして、前の層の出力数(チャンネル数)をC、この層の出力数をNとおくと
パラメータ数はH×W×C×N+Nとなる。
全結合層では
前の層の出力数をC、この層の出力数をNとすると
パラメータ数はC×N+Nとなる。
ここでのフィルタ(カーネル)のサイズは3×3であり、プーリング層で毎回サイズを半分にしている。
活性化関数は最後のみがSoftmaxで、それ以外はReluである。