파이썬 이것저것/파이썬 딥러닝 관련

[Python] 딥러닝 CNN(VGG16 모델 구현하기)

agingcurve 2022. 7. 17. 15:34
반응형

VGGNet은 ILSVRC 2014년도에 2위를 한 모델로 모델의 깊이에 따른 변화를 비교할 수 있게 만든 모델

 

이전까지의 모델들은 첫 번째 Conv Layer에서는 입력 영상의 축소를 위해 11 x 11, 7 x 7의 filter 를 사용한 것에 비해 VGGNet 은 Convolution Layer 에 3 x 3 filter 를 사용한 것이 특징

 

import tensorflow as tf
from tensorflow import keras

def VGG16():
    # Sequential 모델 선언
    model = keras.Sequential()
    # TODO : 지시사항을 잘 보고 VGG16 Net을 완성해보세요.
    
    # 첫 번째 Conv Block
    # 입력 Shape는 ImageNet 데이터 세트의 크기와 같은 RGB 영상 (224 x 224 x 3)입니다.
    model.add(keras.layers.Conv2D(filters = 64, kernel_size = (3,3), padding = "same" ,activation="relu", input_shape = (224, 224, 3)))
    model.add(keras.layers.Conv2D(filters = 64, kernel_size = (3,3), padding = "same", activation = "relu", ))
    model.add(keras.layers.MaxPooling2D(2))
    
    # 두 번째 Conv Block
    model.add(keras.layers.Conv2D(filters = 128, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.Conv2D(filters = 128, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.MaxPooling2D(2)),
    
    # 세 번째 Conv Block
    model.add(keras.layers.Conv2D(filters = 256, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.Conv2D(filters = 256, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.Conv2D(filters = 256, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.MaxPooling2D(2)),
    
    # 네 번째 Conv Block
    model.add(keras.layers.Conv2D(filters = 512, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.Conv2D(filters = 512, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.Conv2D(filters = 512, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.MaxPooling2D(2)),

    # 다섯 번째 Conv Block
    # TODO: 다섯 번째 Conv Block은 네 번째 Block과 동일합니다. 앞의 코드를 참고하여 다섯 번째 Block를 추가하세요
    model.add(keras.layers.Conv2D(filters = 512, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.Conv2D(filters = 512, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.Conv2D(filters = 512, kernel_size = (3,3), activation = "relu", padding = "same" ))
    model.add(keras.layers.MaxPooling2D(2)),
    
    # Fully Connected 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")) # 마지막 레이어의 노드수를 2로 변경하세요
    
    return model