안녕하세요. 오늘은 ILSVRC-2014에서 2등한 모델인 VGGNet의 VGG16 모델을 keras로 구현을 해보고자 합니다.

출처:https://arxiv.org/pdf/1409.1556v6.pdf

위 테이블은 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

+ Recent posts