본문 바로가기
공부/Deep Learning

혼자 공부하는 머신러닝 + 딥러닝 8장

by 유스베리이 2023. 11. 19.

8-2 합성곱 신경망을 사용한 이미지 분류

합성곱 신경망 모델 구성 단계

 

패션 MNIST 데이터 불러오기

데이터 스케일을 0~255사이에서 0~1 사이로 바꾸고 훈련세트와 검증세트로 나눔


from tensorflow import keras
from sklearn.model_selection import train_test_split

(train_input, train_target), (test_input, test_target) = \
keras.datasets.fashion_mnist.load_data()

 
train_scaled = train_input.reshape(-1, 28, 28, 1) / 255.0  
입력 이미지는 항상 깊이(채널) 차원이 있어야함. Conv2D 층을 사용하기 위해 마지막에 채널 차원을 추가해야함

train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)

 

 

train_scaled 의 차원은 (50000,28,28,1)

 


합성곱 신경망 만들기

합성곱 신경망 구조는 합성곱 층으로 이미지에서 특징을 감지한 후 밀집층으로 클래스에 따른 분류 확률을 계산

 

1. 첫 번째 합성곱 층인 Con2D 추가

 
 
model = keras.Sequential() 
// 클래스의 객체를 만듦
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu'
                      padding='same', input_shape=(28,28,1)))

// 32개의 필터, 커널의 크기는 (3,3) , 렐루 활성화 함수와, 세임 패딩 사용

 

2. 첫 번째 풀링 층 추가

MaxPooling2D (최대풀링) , AveragePooling2D(평균풀링)

 

model.add(keras.layers.MaxPooling2D(2))

 

(28,28) 크기에 세임패딩을 적용해서 가로세로크기는 동일 -> (2,2) 풀링을 적용하여 맵의 크기는 (14,14)

합성곱 층에서 32개 필터 사용 -> 특성 맵의 깊이는 32

따라서 맵의 크기는 (14,14,32) 

 

3. 두번째 합성곱 - 풀링 층 추가

model.add(keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu',
padding='same'))
//필터의 개수는 64로 늘림
model.add(keras.layers.MaxPooling2D(2))
// 풀링층에서 크기를 절반으로 줄임

 

(14,14,32) 크기에 세임패딩을 적용해서 가로세로크기는 동일 -> (2,2) 풀링을 적용하여 맵의 크기는 (7,7)

 64개 필터로 늘림  -> 특성 맵의 깊이는 64

따라서 맵의 크기는 (7,7,64)

 

4. 3차원 특성 맵을 일렬로 펼침

마지막에 10개의 뉴런을 가진 (밀집) 출력층에서 확률을 계산해야하기 때문

중간에 밀집 은닉층을 두고 출력층에 전달

 

model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100, activation='relu')) //은닉층
model.add(keras.layers.Dropout(0.4)) //드롭 아웃 층은 은닉층의 과대적합을 막아 성능 개선해줌
model.add(keras.layers.Dense(10, activation='softmax'))  //출력층 , 클래스 10개를 분류하는 다중 분류 문제 -> softmax

Summary() 

모델 구조 summary()로 출력

 

#모델 파라미터 개수 계산#

첫 번째 합성곱층 : 3 x 3 x 1 x 32 + 32 = 320 

두 번째 합성곱층 : 3 x 3 x 32 x 64 + 64 = 18,496

Flatten 클래스 : 3,136 x 100 + 100 = 313,700

마지막 출력층 : 1,010


plot_model() : 층의 구성을 그림으로 표현

                        keras.utils.plot_model(model)                                keras.utils.plot_model(model, show_shapes=True)

 

 

모델 컴파일과 훈련

케라스 API는 딥러닝 모델의 종류나 구성 방식에 상관없이 컴파일과 훈련 과정 동일

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
metrics='accuracy')

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-cnn-model.h5',
save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,
restore_best_weights=True)

history = model.fit(train_scaled, train_target, epochs=20,
validation_data=(val_scaled, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])

 

ADAM 옵티마이저 사용, ModelCheckpoing, EarlyStopping  콜백으로 조기 종료 기법 구현

preds = model.predict(val_scaled[0:1])
print(preds)

 

 

9번째 값이 1이가 나머지는 0에 가까움 ->아홉번째 클래스가 확실함

 

샘플을 '가방'으로 예측 완료