모든 라이브러리를 가져온 후 네트워크를 만들 수 있습니다. 예제에서는 VGG19에 대한 예제를 진행하지만, 신경망 형태는 앞서 살펴본 VGG16과 동일합니다. 그럼 이제 Model Subclassing API를 사용하여 네트워크를 만들어 보겠습니다.

    코드 6-15 VGG19 네트워크 생성

    class VGG19(Sequential):
        def __init__(self, input_shape):
            super().__init__()
    
            self.add(Conv2D(64, kernel_size=(3,3), padding='same',
                            activation='relu', input_shape=input_shape))
            self.add(Conv2D(64, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
    
            self.add(Conv2D(128, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(128, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))
    
            self.add(Conv2D(256, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(256, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(256, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(256, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
    
            self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
    
            self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(Conv2D(512, kernel_size=(3,3), padding='same',
                            activation='relu'))
            self.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
    
            self.add(Flatten())
            self.add(Dense(4096, activation='relu'))
            self.add(Dropout(0.5))
            self.add(Dense(4096, activation='relu'))
            self.add(Dropout(0.5))
            self.add(Dense(1000, activation='softmax'))
    
            self.compile(optimizer=tf.keras.optimizers.Adam(0.003),
                         loss='categorical_crossentropy',
                         metrics=['accuracy'])
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.