본문 바로가기
Python/Deep Learning

[DL]_나도 신경망을 만들 수 있다고? - 기본 예제 실습

by ssolLEE 2023. 8. 27.
반응형

  • 딥러닝에 대해서 공부할 때에는 다음의 책과 함께 했습니다. 챕터 1에서는 인공지능과 머신러닝, 그리고 딥러닝에 대한 자세한 설명과 흐름을 얘기해주어 비교적 친숙하게 학습을 시작할 수 있었습니다. 감사합니다!

  • 딥러닝 실습은 구글에서 제공하는 Colaboratory에서 하겠습니다. 
  • 하기전에 항상 다음과 같이 세팅을 GPU로 바꿔주세요.

신경망과의 첫 만남

  • 책의 2장에 해당하는 부분을 실습해보겠습니다. 
  • 흑백 손글씨 숫자 이미지(28 * 28 픽셀)을 10개의 범주(0~9)로 분류를 해보겠습니다. 
  • 우리는 MNIST 데이터셋을 사용할 것입니다. 
    • 딥러닝계의 "Hello World"
    • 1980년대 미국 국립표준기술연구소에서 수집한 6만 개의 훈련 이미지와 1만 개의 테스트 이미지로 구성됨
  • 클래스와 레이블
    • 머신 러닝에서 분류 문제의 범주(category)를 클래스(class)라고 합니다. 
    • 데이터 포인트는 샘플(sample)이라고 합니다.
    • 특정 샘플의 클래스를 레이블(label)이라고 합니다.

 

케라스에서 MNIST 데이터셋 적재하기

from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

  • 데이터의 형태를 확인해보면, 훈련 데이터는 3차원 배열에 6만 장의 이미지 데이터가 있습니다.
  • 테스트 데이터는 3차원 배열에 1만 장의 이미지 데이터가 있습니다. 

신경망 구조

from keras.api._v2.keras import activations
from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Dense(512, activation = "relu"),     # 입력
    layers.Dense(10, activation = "softmax")    # 출력. 10 : 예측할 범주의 갯수
]
  • 층(layer) : 데이터 정제 필터
  • 위의 코드에서는 완전 연결된 신경망 층인 Dense 층 2개가 연속되어 있습니다. 

컴파일 단계

  • 컴파일 단계는 어떤 형태로 훈련시킬 것인가를 정의하는 것입니다. 
    • 옵티마이저(optimizer) : 성능을 향상시키기 위해 입력된 데이터를 기반으로 모델을 업데이트하는 메커니즘
    • 손실 함수(loss function) : 훈련 데이터에서 모델의 성능을 측정하는 방법. 모델이 옳은 방향으로 학습될 수 있도록 도와줌
    • 훈련과 테스트 과정을 모니터링할 지표 : 여기서는 정확도(정확히 분류된 이미지의 비율)만을 고려하겠음 
model.compile(optimizer="rmsprop",
              loss = "sparse_categorical_crossentropy",
              metrics = ["accuracy"])

이미지 데이터 준비하기

  • 데이터를 모델에 맞는 크기로 바꿉니다.
  • 연산할 때 데이터타입이 안맞을 경우 오류가 생기므로, 데이터타입을 바꿉니다.
    • 0과 1 사이의 값을 가지는 float32 타입으로 변경
  • 신경망은 입력 데이터의 스케일에 민감하여 적절한 데이터 전처리 과정이 필요합니다. 
    • 이미지의 경우 보통 픽셀의 최댓값인 255로 나누어 사용합니다. 
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype("float32") / 255
test_images = test_images.reshape((10000, 28 * 28))
train_images = train_images.astype("float32") / 255

 

모델 훈련하기 - fit()

  • epoch는 각 데이터를 모델에서 몇 번 복습할 것인지에 대한 횟수입니다. 
    • 값이 커질수록 적합한 파라미터를 찾을 확률이 올라갑니다. 
    • 그렇다고 너무 값이 커버리면 과적합이 발생할 수 있습니다. 
  • batch_size는 연산 한 번에 들어가는 데이터의 크기입니다. 
    • 값이 너무 크면 학습 속도가 느려지고 메모리 부족 현상이 일어날 수도 있습니다. 
    • 값이 너무 작으면 모델이 불안정할 수 있습니다. 
model.fit(train_images, train_labels, epochs=5, batch_size = 128)

  • 훈련 데이터에 대한 모델의 손실과 정확도가 출력이 되었습니다. 
  • 훈련 데이터에 대해 98.9%의 정확도를 달성했습니다. 

모델을 사용하여 예측 만들기

  • 위에서 훈련된 모델을 사용하여 새로운 숫자 이미지에 대한 클래스 확률을 예측하겠습니다. 
test_digits = test_images[0:10]
predictions = model.predict(test_digits)
predictions[0]
print(predictions[0].argmax()) 
print(predictions[0][7])
print(test_labels[0])
  • 첫 번째 테스트 숫자는 인덱스 7에서 가장 높은 확률 값을 얻었습니다. 따라서 모델의 예측 결과는 7이 됩니다. 
  • test_labels[0]을 출력하여 예측과 테스트 데이터값을 비교해보면 일치하는 것을 알 수 있습니다. 

 

새로운 데이터에서 모델 평가하기

test_loss, test_acc = model.evaluate(test_images, test_labels)
print("테스트 정확도", test_acc)

  • 테스트 세트의 정확도는 97.9%로 나왔습니다. 훈련 세트 정확도인 98.9% 보다는 약간 낮습니다. 
  • 이 차이는 과대적합/과적합(overfitting) 때문입니다. 이는 머신 러닝 모델이 훈련 데이터보다 새로운 데이터에서 성능이 낮아지는 경향을 말합니다. 

 

 

이렇게 첫 번째 딥러닝 경험을 해보았습니다.

몇 줄 쓰지 않은 코드지만 아직은 낯설고 그렇습니다.

다음 포스팅에서는 조금 더 코드의 의미에 대해 알아보도록 하겠습니다. 

감사합니다.