페이지

2022년 7월 31일 일요일

5.2.3 네트워크 구성하기

 이전 예제에서 MNIST를 위해 간단한 컨브넷을 만들었습니다. 이제 컨브넷에 친숙해졌을 것입니다. 여기서 사용할 구조도 일반적으로 동일합니다. Conv2D(relu 활성화 함수 사용)와  MaxPooling2D층을 번갈아 쌓은 컨브넷을 만들겠습니다.

이전보다 이미지가 크고 복잡한 문제이기 때문에 네트워크를 좀 더 크게 만들겠습니다. Conv2D + MaxPooling2D 단계를 하나 더 추가합니다. 이렇게 하면 네트워크의 용량을 늘리고 Flatten층의 크기가 너무 커지지 않도록 특성 맵의 크기를 줄일 수 있습니다. 150 * 150 크기(임의로 선택한 것입니다)의 입력으로 시작해서  Flatten 층 이전에 7 * 7 크기의 특성 맵으로 줄어듭니다.

특성 맵의 깊이는 네트워크에서 점진적으로 증가하지만(32에서 128까지). 특성 맵의 크기는 감소합니다.(150 * 150 에서 7 * 7까지). 이는 거의 모든 컨브넷에서 볼 수 있는 전형적인 패턴입니다.

이진 분류 문제이크로 네트워크는 하나의 유닛(크기가 1인 Dense 층)과 sigmoid활성화 함수로 끝납니다. 이 유닛은 한 클래스에 대한 확률을 인코딩할 것입니다.


from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (33), activation='relu',input_shape=(1501503)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation='relu',))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128, (33), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128, (33), activation='relu'))
model.add(layers.MaxPooling2D((22)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

층들을 거치면서 특성 맵의 차원이 어떻게 변하는지 살펴보겠습니다.
>>>model.summary()
Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_4 (Conv2D) (None, 148, 148, 32) 896 max_pooling2d_4 (MaxPooling (None, 74, 74, 32) 0 2D) conv2d_5 (Conv2D) (None, 72, 72, 64) 18496 max_pooling2d_5 (MaxPooling (None, 36, 36, 64) 0 2D) conv2d_6 (Conv2D) (None, 34, 34, 128) 73856 max_pooling2d_6 (MaxPooling (None, 17, 17, 128) 0 2D) conv2d_7 (Conv2D) (None, 15, 15, 128) 147584 max_pooling2d_7 (MaxPooling (None, 7, 7, 128) 0 2D) flatten_1 (Flatten) (None, 6272) 0 dense_1 (Dense) (None, 512) 3211776 dense_2 (Dense) (None, 1) 513 ================================================================= Total params: 3,453,121 Trainable params: 3,453,121 Non-trainable params: 0 _________________________________________________________________

컴파일 단계에서 이전과 같이 RMSprop 옵티마이저를 선택하겠습니다. 네트워의 마지막의 하나의
시그모이드 유닛이기 때문에 이진 크로스엔트로피(binary crossentropy)를 손실로 사용합니다
(표 4-1에서 다양한 경우에 사용할 수 있는 손실 함수 목록을 볼수 있습니다).

from tensorflow.keras import optimizers

model.compile(loss='binary_crossentropy'
              optimizer=optimizers.RMSprop(learning_rate=1e-4),
              metrics=['acc'])

댓글 없음: