안녕하세요. 오늘은 ILSVRC-2014에서 2등한 모델인 VGGNet의 VGG16 모델을 keras로 구현을 해보고자 합니다.
위 테이블은 VGGNet 논문에 있는 테이블로, 오늘 구현해보고자 하는 VGG16은 빨간 사각형 내에 있는 D에 해당하는 모델입니다.
모델을 간략하게 설명해드리자면 다음과 같습니다.
- 13개의 conv layer, 5개의 maxpooling layer, 3개의 FC layer로 구성되어 있습니다.
- Input shape은 224 x 224 RGB image => (224,224,3) 입니다.
- conv layer의 kernel size = 3, filter size = 64 ~ 512 , padding = 1, stride = 1
- maxpooling layer의 stride = 2
- activation function(활성화함수) => relu
import tensorflow
from tensorflow import keras
# VGG 16 model의 input => 224 x 224 RGB image => (224 x 224 x 3)
# VGG16은 16 weight layer로 13개의 conv layer와 3개의 FC layer로 구성되어 있습니다.
# convolution layer는 3x3 size 이며, filter size는 block 마다 64에서 512까지 2의 배수로 증가합니다.
# activation function(활성화함수)로는 relu 함수를 사용합니다.
def VGG16():
model = keras.Sequential()
# First convolution block
# the number of convolution=2, filter size=64, kernel size=3, activation function=relu, padding=1=same
# the number of maxpooling=1, stride 2
model.add(keras.layers.Conv2D(input_shape=(224,224,3), filters=64, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.MaxPool2D(strides=(2,2)))
# Second convolution block
# filter size=128
model.add(keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.MaxPool2D(strides=(2,2)))
# Third convolution block
# the number of convolution=3, filter size=256
model.add(keras.layers.Conv2D(filters=256, kernel_size=3, padding='same', activation= 'relu'))
model.add(keras.layers.Conv2D(filters=256, kernel_size=3, padding='same', activation= 'relu'))
model.add(keras.layers.Conv2D(filters=256, kernel_size=3, padding='same', activation= 'relu'))
model.add(keras.layers.MaxPool2D(strides=(2,2)))
# Forth convolution block
# filter size = 512
model.add(keras.layers.Conv2D(filters=512, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.Conv2D(filters=512, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.Conv2D(filters=512, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.MaxPool2D(strides=(2,2)))
# Fifth convolution block
model.add(keras.layers.Conv2D(filters=512, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.Conv2D(filters=512, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.Conv2D(filters=512, kernel_size=3, padding='same', activation='relu'))
model.add(keras.layers.MaxPool2D(strides=(2,2)))
# FC layer & softmax layer
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(4096, activation='relu'))
model.add(keras.layers.Dense(4096, activation='relu'))
model.add(keras.layers.Dense(1000, activation='softmax'))
return model
'인공지능 > 구현' 카테고리의 다른 글
[파이토치] 보스턴 집값 데이터로 신경망 구현하기 (0) | 2022.09.06 |
---|---|
[파이토치] CNN (0) | 2022.08.06 |