반응형
- 딥러닝에 대해서 공부할 때에는 다음의 책과 함께 했습니다. 챕터 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) 때문입니다. 이는 머신 러닝 모델이 훈련 데이터보다 새로운 데이터에서 성능이 낮아지는 경향을 말합니다.
이렇게 첫 번째 딥러닝 경험을 해보았습니다.
몇 줄 쓰지 않은 코드지만 아직은 낯설고 그렇습니다.
다음 포스팅에서는 조금 더 코드의 의미에 대해 알아보도록 하겠습니다.
감사합니다.
'Python > Deep Learning' 카테고리의 다른 글
[DL]_텐서 + 텐서 = ????????? - 브로드캐스팅 (0) | 2023.08.31 |
---|---|
[DL]_텐서, 텐서 하는 그 텐서가 뭔데? (0) | 2023.08.28 |