본문 바로가기

AI/딥러닝(Deep Learning)

[딥러닝/DL]5. 합성곱 신경망을 사용한 이미지 분류

728x90
반응형

이전에 Pupbani는 합성곱과 풀링이 무엇인지, 합성곱 신경망 층과 풀링 층을 만드는 법을 배웠었다.

이제 Pupbani는 실제 합성곱 신경망 모델을 만들어 보려고 한다.

 

먼저 데이터를 준비하자.

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

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

reshape를 통해 깊이가 있는 데이터로 만들었다.

 

그 다음은 합성곱 신경망 모델을 만들어 보자.

model = keras.Sequential(name="ConvModel")
# 합성곱 층1, 입력데이터 (28,28,1)
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', 
                              input_shape=(28,28,1)))
# 풀링 층1
model.add(keras.layers.MaxPooling2D(2))
# 합성곱 층2
model.add(keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu', padding='same'))
# 풀링 층2
model.add(keras.layers.MaxPooling2D(2))

# Flatten 층
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'))

model.summary()

2개의 합성곱 신경망 층풀링 층을 추가하고 Flatten, Dense, Dropout, 출력 층을 추가했다.

summary() 메서드로 모델의 층을 확인할 수 있다. 

 

케라스가 제공하는 plot_model() 함수를 호출하면 층을 보기 좋게 확인할 수 있다.

plot_model() 함수는 keras.utils 패키지 아래 있으며 model을 매개변수로 받는다.

keras.utils.plot_model(model)

이 plot_model() 함수는 매개변수에 따라 다른 형태로 층을 출력한다.

  • show_shapes: True 설정 시 그림에 입/출력의 크기를 표시
  • to_file: 파일이름을 지정하면 이미지 파일로 저장
  • dpi: 해상도 지정
keras.utils.plot_model(model, show_shapes=True, to_file='cnn-architecture.png', dpi=300)

지금까지 만든 신경망 모델을 그림으로 확인해 보자.

 

첫번쨰 합성곱 층과 풀링 층

두번째 합성곱 층과 풀링 층과 나머지 층들

 

이제 모델을 컴파일 하고 훈련을 해보자.

adam 옵티마이저를 사용하고 ModelCheckpoint, EarlyStopping 콜백을 사용한다.

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

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-cnn-model.h5')
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])

patience를 2로 주었으므로 종료 시점의 epoch에서 2만큼 뒤에 있는 epoch인 10일 때가 최적의 모델이다.

 

손실 그래프를 그려서 조기 종료가 잘 이루어 졌는지 확인해보자.

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

잘 종료된 것을 확인할 수 있다.

 

이제 검증 세트에 대한 평가를 해보자.

model.evaluate(val_scaled, val_target)

이제 예측을 한번 해보자.

먼저 임의의 패션 데이터 이미지 1개를 시각화해서 어떤 이미지인지 확인하자.

plt.imshow(val_scaled[0].reshape(28, 28), cmap='gray_r')
plt.show()

가방 이미지다. 

 

모델이 알맞게 예측하는지 확인해 보자.

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

classes = ['티셔츠', '바지', '스웨터', '드레스', '코트',
           '샌달', '셔츠', '스니커즈', '가방', '앵클 부츠']
import numpy as np
print(classes[np.argmax(preds)])

가방으로 잘 예측하였다.

 

마지막으로 처음에 따로 빼놓았던 테스트 세트로 모델의 일반화 성능을 측정해보자.

test_scaled = test_input.reshape(-1, 28, 28, 1) / 255.0
model.evaluate(test_scaled, test_target)

테스트 세트의 검증 세트의 정확도는 0.9175 이다.

이 모델을 실전에 투입하면 약 91%의 성능을 기대할 수 있다.

 

Pupbani는 팀장에게 보고 하러 결과를 가지고 달려갔다.

728x90
반응형