반응형
vggnet-using-keras

VGGNet

image

  • 이번에는 VGGNet에 대하여 알아보겠습니다. VGGNet은 14년도 ImageNet 대회에서 2등을 하고 그해 localization대회에서 1등을 차지했습니다.VGGNet의 특징은 더 깊어지고 더 작은 필터를 사용했다는것입니다. 이웃픽셀을 포함할 수 있는 가장작은 필터인 3x3 필터를 사용했습니다. 그리고 작은 필터를 유지하고 주기적으로 pooling을 수행했습니다.
  • 왜 작은 필터를 사용할까요? 우선 필터의 크기가 작으면 파라미터의 수가 적고 depth를 더 키울 수 있습니다. 3x3 with stride1 CONV를 3번 쌓게 되면 effective receptive field는 무엇일까요? 정답은 7x7입니다. 왜 이렇게 되는지 살펴보겠습니다. 첫 번째 layer에서 하나의 픽셀은 CONV를 통해 3x3의 정보를 가지게 됩니다 두 번째 레이어에서 하나의 픽셀은 3x3의 정보를 가진 상태에서 또다시 3x3의 CONV를 통해 5x5의 정보를 가집니다. 이런식으로 3x3의 CONV를 3번 쌓게되면 7x7의 effective receptive field 가지게 됩니다. 이 부분이 VGGNet이 AlexNet 보다 깊게 층을 쌓을 수 있었던 이유입니다.

Model - VGG16

  • VGGNet 뒤의 숫자는 layer의 수를 나타 냅니다 image

ImageNet weight를 가진 VGG16 불러오기

In [1]:
from keras.applications.vgg16 import VGG16
import numpy as np
#include_top은 네트워크의 최상단에 완전 연결 레이어를 넣을지 여부입니다..
model = VGG16(weights='imagenet', include_top=True,  input_shape=(224, 224, 3))
model.summary()
Using TensorFlow backend.
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5
553467904/553467096 [==============================] - 36s 0us/step
Model: "vgg16"
_________________________________________________________________
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
_________________________________________________________________

VGG16 구현하기

  • 쉽게 구현할 수 있습니다.
  • 오직 3X3 CONV with stride1, pad1 그리고 2X2 MAX POOL with stride2 로 구성되어있습니다
In [2]:
from keras.layers import Input, Conv2D, MaxPooling2D
from keras.layers import Dense, Flatten
from keras.models import Model, Sequential

input_shape = (224, 224, 3)
model = Sequential()
#conv1-1,1-2
model.add(Conv2D(filters=64, kernel_size=(3,3), strides = 1, padding="same", activation="relu",input_shape=input_shape))
model.add(Conv2D(filters=64, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
#MAXPOOL1
model.add(MaxPooling2D(pool_size=(2, 2), strides = 2))

#conv2-1, 2-2
model.add(Conv2D(filters=128, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
model.add(Conv2D(filters=128, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
#MAXPOOL2
model.add(MaxPooling2D(pool_size=(2, 2), strides = 2))

#conv3-1, 3-2, 3-3
model.add(Conv2D(filters=256, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
#MAXPOOL3
model.add(MaxPooling2D(pool_size=(2, 2), strides = 2))

#conv4-1, 4-2, 4-3
model.add(Conv2D(filters=512, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
#MAXPOOL4
model.add(MaxPooling2D(pool_size=(2, 2), strides = 2))

#conv5-1, 5-2, 5-3
model.add(Conv2D(filters=512, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), strides = 1, padding="same", activation="relu"))
#MAXPOOL5
model.add(MaxPooling2D(pool_size=(2, 2), strides = 2))

model.add(Flatten())
#FC6, 7, 8
model.add(Dense(4096, activation='relu'))
model.add(Dense(4096, activation='relu'))
model.add(Dense(1000, activation='softmax'))
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 224, 224, 64)      1792      
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 224, 224, 64)      36928     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 112, 112, 64)      0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 112, 112, 128)     73856     
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 112, 112, 128)     147584    
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 56, 56, 128)       0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 56, 56, 256)       295168    
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 56, 56, 256)       590080    
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 56, 56, 256)       590080    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 28, 28, 256)       0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 28, 28, 512)       1180160   
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 28, 28, 512)       2359808   
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 28, 28, 512)       2359808   
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 14, 14, 512)       0         
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv2d_12 (Conv2D)           (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 14, 14, 512)       2359808   
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 7, 7, 512)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 25088)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              102764544 
_________________________________________________________________
dense_2 (Dense)              (None, 4096)              16781312  
_________________________________________________________________
dense_3 (Dense)              (None, 1000)              4097000   
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
_________________________________________________________________

Model - VGG19

  • vgg19는 keras applications을 통해서만 가져오겠습니다.
  • 보시면 VGG16보다 Pooling사이에 CONV가 한층 더 추가된걸로 보입니다.
  • effective receptive field를 통해 params수는 VGG16에 비해 많이 증가되지 않았습니다.

ImageNet weight를 가진 VGG19 불러오기

In [3]:
from keras.applications.vgg19 import VGG19
#include_top은 네트워크의 최상단에 완전 연결 레이어를 넣을지 여부입니다..
model = VGG19(weights='imagenet', include_top=True,  input_shape=(224, 224, 3))
model.summary()
Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg19_weights_tf_dim_ordering_tf_kernels.h5
574717952/574710816 [==============================] - 37s 0us/step
Model: "vgg19"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (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_conv4 (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_conv4 (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_conv4 (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: 143,667,240
Trainable params: 143,667,240
Non-trainable params: 0
_________________________________________________________________
In [2]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
반응형

+ Recent posts