VGG-16

이승수·2022년 7월 12일
0

VGG-16

VGG-16 (Visual Geometry Group - 16 layers)
숫자에 따라 layer가 달라진다(VGG-19, VGG-13)
논문 : https://arxiv.org/abs/1409.1556

특징

  • VGGNet이 가지는 가장 큰 특징은 처음으로 모든 Convolutional layer의 커널(필터) 사이즈를 3×3 으로 사용했다는 것이다.
  • 모든 합성곱층에서 3x3크기의 필터 사용했다. 대신 층을 깊게 쌓아서 기존 7x7, 11x11 필터 이상의 표현력을 가질 수 있도록 했다.
  • 활성화 함수로 ReLU를 사용, 가중치 초깃값은 He초기화 사용
    (층을 깊게 쌓았음에도 기울기 소실 문제가 발생하지 않음)
  • 기존에는 5×5나 더 큰 사이즈도 사용했지만, VGGNet을 기점으로 이후에 나온 대부분의 CNN은 핵심 Convolutional layer의 커널 크기를 3×3 으로 쓰게 된다.
  • VGGNet은 이렇듯 작은 사이즈의 커널을 사용함으로써 layer를 더 많이 사용함에도 파라미터 수의 증가를 상대적으로 최소화할 수 있었고 모델이 깊어진 만큼 표현력이 좋아졌기 때문에 성능은 비약적으로 향상되었다.

python code

# 하드 코딩
def VGG_16(input_shape):
    initializer = tf.keras.initializers.GlorotNormal()
    model = Sequential(name='VGG')
    model.add(Conv2D(64, kernel_size=(3,3), padding= 'same', activation= 'relu', input_shape= input_shape))
    model.add(Conv2D(64, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))

    model.add(Conv2D(128, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(Conv2D(128, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))

    model.add(Conv2D(256, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(Conv2D(256, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(Conv2D(256, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))

    model.add(Conv2D(512, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(Conv2D(512, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(Conv2D(512, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))

    model.add(Conv2D(512, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(Conv2D(512, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(Conv2D(512, kernel_size=(3,3), padding= 'same', activation= 'relu'))
    model.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))

    model.add(Flatten())
    model.add(Dense(4096, activation= 'relu'))
    model.add(Dropout(0.5))
    model.add(Dense(4096, activation= 'relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1000, activation= 'softmax'))
    
    return model

# 사전 학습된 모델 불러오기
from tensorflow.python.keras.applications.vgg16 import VGG16

input_tensor = Input(shape=(224,224,3))

model = VGG16(weights='imagenet',			# imagenet으로 사전 학습된 가중치 
			  include_top=False,			# 신경망 FCL X
			  input_tensor = input_tensor)
profile
AI/Data Science

0개의 댓글