인공지능/CNN

VGG

쿠와와 2020. 12. 4. 17:47

주석을 봐도 모르겠으면 알려주세요

# Day_22_02_VGG.py
import tensorflow as tf


def model_vgg_dense():
    # slim 라이브러리에 있는 vgg 파일을 활용해서 케라스 vgg 모델을 구현하세요
    # 결관 summary 함수를 통해 shape 로 확인합니다.

    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Input(shape=[224, 224, 3]))       # input 바꾸지 않을 것임

    # 1번째 conver 완료
    model.add(tf.keras.layers.Conv2D(64, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(64, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    # 2번째 conver 완료
    model.add(tf.keras.layers.Conv2D(128, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(128, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    # 3번째 conver 완료
    model.add(tf.keras.layers.Conv2D(256, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(256, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(256, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    # 4번째 conver 완료
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    # 5번째 conver 완료
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    model.add(tf.keras.layers.Flatten())

    model.add(tf.keras.layers.Dense(4096, activation='relu'))
    model.add(tf.keras.layers.Dense(4096, activation='relu'))
    model.add(tf.keras.layers.Dense(1000, activation='softmax'))
    model.summary()


def model_vgg_conv2d():
    # dense 레이어를 conv2d 레이어로 교체한다.
    # 결관 summary 함수를 통해 shape 로 확인합니다.

    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Input(shape=[224, 224, 3]))  # input 바꾸지 않을 것임

    # model.add(tf.keras.layers.Conv2D(64, [2, 2], 2, 'same', activation='relu'))
    # same 과 valid 옵션 설명
    # same ->  삐져 나온 것을 어떤 것을 추가해서 나눠 떨어지게 함  stride 1인 경우에는 절대 줄어들지 않음
    # valid -> 삐져 나온 것을 버려버림 (남는 빅셀)

    # 1번째 conver 완료
    model.add(tf.keras.layers.Conv2D(64, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(64, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    # 2번째 conver 완료
    model.add(tf.keras.layers.Conv2D(128, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(128, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    # 3번째 conver 완료
    model.add(tf.keras.layers.Conv2D(256, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(256, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(256, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    # 4번째 conver 완료
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    # 5번째 conver 완료
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(512, [3, 3], 1, 'same', activation='relu'))
    model.add(tf.keras.layers.MaxPool2D([2, 2], 2, 'same'))

    model.add(tf.keras.layers.Conv2D(4096, [7, 7], 1, 'valid', activation='relu'))
    model.add(tf.keras.layers.Conv2D(4096, [1, 1], 1, activation='relu'))
    model.add(tf.keras.layers.Conv2D(1000, [1, 1], 1, activation='softmax'))

    model.summary()


# model_vgg_dense()
model_vgg_conv2d()