- 딥러닝은 기계학습 분야에서 활발하게 연구되고 있는 분야로, 이미지 분류, 음성 인식, 자연어 처리 등 다양한 분야에서 활용되고 있습니다. 이번 글에서는 손글씨 숫자 데이터인 MNIST데이터셋을 활용하여 간단한 딥러닝 모델을 구축해보겠습니다.
교재 홍보
- 다음의 교재의 내용을 참고하였습니다.
- 교재 구매 : https://www.yes24.com/Product/Goods/112012471
케라스 창시자에게 배우는 딥러닝 개정 2판 - 예스24
단어 하나, 코드 한 줄 버릴 것이 없다!단 한 권의 딥러닝 책을 선택한다면 바로 이 책이다!케라스 창시자이자 구글 딥러닝 연구원인 저자는 ‘인공 지능의 민주화’를 강조한다. 이 책 역시 많
www.yes24.com
1. 데이터 불러오기
- tensorflow의 keras.datasets 모듈로부터 mnist 데이터셋을 불러온다.
- 데이터셋은 학습 데이터와 테스트 데이터로 나뉘어져 있다.
from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
- 아래의 코드로 불러온 데이터의 배열과 데이터 타입을 확인한다.
# 데이터 형태 확인
train_images.shape
test_images.shape
train_labels[:5]
test_labels[:5]
2. 신경망 모델 정의
- 신경망 레이어 두개로 이루어진 모델을 정의해준다.
- 이미지 데이터를 입력으로 받아 입력 레이어에서 시작해 512개의 유닛을 가진 은닉레이어를 거쳐 10개의 유닛을 가진 출력 레이어로 이어짐으로써 10개의 확률 점수를 가진 배열을 출력하는 모델이다.
- 입력 레이어와 은닉레이어는 relu, 출력 레이어는 softmax 활성화 함수를 사용한다.
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
layers.Dense(512, activation='relu'), # 입력
layers.Dense(10, activation='softmax') # 출력, 10이 의미하는 것은 예측할 범주의 개수
])
3. 모델 컴파일
- 신경망 모델이 훈련을 마칠 수 있도록 컴파일 해준다.
model.compile(optimizer = 'rmsprop', # 성능향상을 위해 입력데이터 기반으로 모델을 업데이트 해줌
loss = 'sparse_categorical_crossentropy', # 모델의 성늘을 측정하는 방법을 설정
metrics = ['accuracy']) # 훈련과 테스트 과정의 모니터링 지표로 정확도 설정
4. 데이터 전처리
- 데이터를 모델에 입력하기 위해 크기를 조정해준다.
train_images = train_images.reshape(60000, 28 * 28)
train_images = train_images.astype('float32') / 255 # 28*28 = 784의 사이즈를 [0, 255]로 rescale해주는 것을 의미
test_images = test_images.reshape(10000, 28 * 28)
test_images = test_images.astype('float32') / 255 # 28*28 = 784의 사이즈를 [0, 255]로 rescale해주는 것을 의미
5. 모델 학습
- 모델학습을 위해 train데이터를 모델에 입력해주고 배치크기는 128로 하여 5 에포크 동안 학습시킵니다.
model.fit(train_images, train_labels, epochs=5, batch_size=128)
# 에포크는 학습 과정에서 데이터셋을 몇번 사용하여 모델을 학습할지를 의미한다.
# 배치크기는 한 번의 에포크에서 사용되는 데이터 샘플의 수를 의미한다.
- 실행 결과 모델 훈련 시 에포크마다 손실함수와 정확도가 개선됨을 볼 수 있다.

6. 숫자 이미지 예측
- 학습된 모델에 테스트 데이터를 입력해보고, 이에 대한 출력값을 확인한다.
test_digits = test_images[0:5] # 테스트 이미지 중 5개 이미지를 가져와 test_digits에 할당
predictions = model.predict(test_digits) # test_digits를 모델에 집어넣고 이에 대한 출력결과를 predictions에 할당
predictions[0] # predictions[0]은 입력 이미지 중 첫번째에 대한 예측 결과
- 실행 결과 다음의 출력값을 얻을 수 있는데 가장 큰 값의 인덱스가 첫번째 이미지가 될 확률이 높은 숫자 데이터이다.

- 다음의 코드를 통해 실제로도 그러한지 확인해보자.
predictions[0].argmax()
# 첫번째 이미지에 대한 모델의 출력 결과에서 값이 가장 큰 인덱스를 반환해주고, 여기서는 7이 도출
predictions[0][7]
# 첫번째 이미지가 7이 될 확률을 반환한다 여기서는 0.99995625
test_labels[0]
# 실제로 테스트 데이터의 첫번째 이미지의 라벨을 확인해본다. 7이 나옴으로써 옳게 예측했음을 알 수 있다.
7. 모델 평가
- 테스트 데이터를 이용해 모델을 평가해본다.
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('테스트 정확도', test_acc)'DeepLearning' 카테고리의 다른 글
| CNN_강아지 vs 고양이 (0) | 2023.08.30 |
|---|---|
| CNN_MNIST (0) | 2023.08.29 |
| 다중 분류 모델_Reuter (0) | 2023.08.29 |
| 이진 분류 모델_IMDB데이터 (0) | 2023.08.28 |
| tensorflow를 통한 선형 분류기 구현 (0) | 2023.08.25 |
