새소식

반응형
Vision AI/미분류

VGGnet의 구조 + keras code

  • -
반응형

VGGnet은 2014년 ISLVRC 대회 (ImageNet 이미지 인식 대회)에서 준우승을 차지한 모델입니다. 이 글에서는 VGG16과 VGG19의 구조를 알아봅니다.

D가 VGG16, E가 VGG19이다.

모든 컨볼루션 레이어의 커널사이즈는 3x3이며, 제로패딩이 적용되었습니다.

 

VGG16은 5개의 블록 / 각 블록은 2, 2, 3, 3, 3개의 컨볼루션 레이어 / 각 블록의 컨볼루션 레이어는 64, 128, 256, 512, 512개의 필터수를 가지고 있습니다. 각 블록의 마지막단에는 maxpooling이 적용되었습니다. 이후에 4096개의 hidden layer 두 층이 있고, 1000개의 아웃풋을 softmax 활성화함수로 출력합니다.

 

VGG19는 5개의 블록 / 각 블록은 2, 2, 4, 4, 4개의 컨볼루션 레이어 / 각 블록의 컨볼루션 레이어는 64, 128, 256, 512, 512개의 필터수를 가지고 있습니다. 각 블록의 마지막단에는 마찬가지로 maxpooling이 적용되어 있고, 이후 4096개의 hidden layer 두 층, 1000개의 아웃풋을 softmax 활성화함수로 출력합니다.

 

VGG의 특징뽑는 방법을 그대로 사용하고 네트워크의 파라미터를 줄이고 싶다거나 수용력을 낮추고 싶으면 Fully Connected단은 Global Average Pooling으로 대체하거나 차원수를 줄여도 상관없습니다. 학습데이터에 적합한 네트워크는 모두 다를 것이니까요.

 

아래는 VGG16 그래프를 keras로 구현한 것입니다. 참고가 되셨길 바랍니다.

# VGG16
from tensorflow.keras import layers, models

img_input = layers.Input(shape=input_shape)

def conv_block(inputs, filter=64, kernel_size=(3, 3), stride=(1, 1), padding='same', activation='relu', block=1, layer=1):
	x = layers.Conv2D(filters=filter, kernel_size=kernel_size, strides=stride, padding=padding, activation=activation , name=f'block{block}_conv{layer}')(inputs)
	return x

def VGG16():
  # Block 1
  x = conv_block(img_input, filter=64, block=1, layer=1)
  x = conv_block(x, filter=64, block=1, layer=2)
  x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)

  # Block 2
  x = conv_block(x, filter=128, block=2, layer=1)
  x = conv_block(x, filter=128, block=2, layer=2)
  x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)

  # Block 3
  x = conv_block(x, filter=256, block=3, layer=1)
  x = conv_block(x, filter=256, block=3, layer=2)
  x = conv_block(x, filter=256, block=3, layer=3)
  x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)

  # Block 4
  x = conv_block(x, filter=512, block=4, layer=1)
  x = conv_block(x, filter=512, block=4, layer=2)
  x = conv_block(x, filter=512, block=4, layer=3)
  x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)

  # Block 5
  x = conv_block(x, filter=512, block=5, layer=1)
  x = conv_block(x, filter=512, block=5, layer=2)
  x = conv_block(x, filter=512, block=5, layer=3)
  x = layers.MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)

  # Classification block
  x = layers.Flatten(name='flatten')(x)
  x = layers.Dense(4096, activation='relu', name='fc1')(x)
  x = layers.Dense(4096, activation='relu', name='fc2')(x)
  x = layers.Dense(1000, activation='softmax', name='predictions')(x)

  # Create model.
  model = models.Model(inputs, x, name='vgg16')
  return model
  
 vgg16_model = VGG16()

 

참고

[1] https://arxiv.org/pdf/1409.1556.pdf

 

도움이 되셨다면 아무 광고나 클릭 한 번 부탁드립니다👍

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감과 광고 클릭 부탁드립니다~