일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- supervised learning
- 지도학습
- 해커톤
- LG Aimers
- gpt
- 딥러닝
- GPT-4
- PCA
- 분류
- 오블완
- LG
- Machine Learning
- deep learning
- regression
- LG Aimers 4th
- 머신러닝
- Classification
- LLM
- AI
- 티스토리챌린지
- ChatGPT
- OpenAI
- 회귀
- Today
- Total
SYDev
Chapter 02-1 : 신경망과의 첫 만남 본문
케라스 파이썬 라이브러리를 사용하여 손글씨 숫자 분류를 학습하는 신경망 예제를 살펴보자.
문제
- 흑백 손글씨 이미지(28X28 픽셀)를 10개의 범주(0에서 9까지)로 분류
- 머신 러닝 커뮤니티에서 고전으로 취급받는 데이터셋인 MNIST 사용
문제 해결 과정
- 클래스(class): 머신 러닝에서 분류 문제의 범주
- 샘플(sample): 데이터 포인트
- 레이블(label): 특정 샘플의 클래스
MNIST 데이터셋은 넘파이(Numpy) 배열 형태로 케라스에 이미 포함됨
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
- train_images, train_labels가 모델이 학습해야 할 훈련세트(training set) 구성
- 학습된 모델은 test_images, test_labels로 구성된 테스트 세트(test set)에서 테스트
- 이미지는 넘파이 배열로 인코딩됨, 레이블은 0부터 9까지의 숫자 배열
- 이미지와 레이블은 일대일 관계
훈련 데이터
>>> train_images.shape
(60000, 28, 28)
>>> len(train_labels)
60000
>>> train_lables
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
테스트 데이터
>>> test_images.shape
(10000, 28, 28)
>>> len(test_labels)
10000
>>> test_lables
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
from keras import models
from keras import layers
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
- 층(layer): 신경망의 핵심 구성 요소로 일종의 데이터 처리 필터이다. 어떤 데이터가 들어가면 더 유용한 형태로 출력
- 층은 주어진 문제에 더 의미있는 표현(representation)을 입력된 데이터로부터 추출
- 대부분의 딥러닝 -> 간단한 층을 연결하여 구성, 점진적으로 데이터를 정제하는 형태
- 해당 예에서는 조밀하게 연결된(혹은 완전 연결(fully connected)된) 신경망 층인 Dense 층 2개가 연속됨
- 두 번째(마지막) 층은 10개의 확률 점수가 들어 있는 배열(모두 더하면 1)을 반환하는 소프트맥스(softmax)층
- 각 점수는 현재 숫자 이미지가 10개의 숫자 클래스 중 하나에 속할 확률
신경망이 훈련 준비를 마치기 위해 컴파일 단계에 포함될 세 가지가 더 필요
- 손실 함수(loss function): 훈련 데이터에서 신경망의 성능을 측정하는 방법, 네트워크가 옳은 방향으로 학습되도록 도움
- 옵티마이저(optimizer): 입력된 데이터와 손실 함수를 기반으로 네트워크를 업데이트
- 훈련과 테스트 과정을 모니터링할 지표
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
훈련 시작 전, 데이터를 네트워크에 맞는 크기로 조정
앞선 훈련 이미지 : [0, 255] 사이의 값인 uint8 타입의 (60000, 28, 28) 크기를 가진 배열
조정된 데이터: [0, 1]사이의 값을 가지는 float 32 타입의 (60000, 28 * 28) 크기인 배열
넘파이 차원에서 차원을 나누는 것은 결국에 사람이 보기 편하기 위해서 임의로 나누는 것일 뿐, 컴퓨터에서 데이터를 읽어들일 때는 결국에 010101010과 같은 2진수 배열의 1차원 배열로 읽어들이기 때문에 (60000, 28 ,28), (60000, 28*28), (60000*28*28) 문제 없이 다른 차원의 배열로 바꿀 수 있다.
train_images = train_images.reshape((60000, 28*28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28*28))
test_images = test_images.astype('float32') / 255
이후 레이블을 범주형으로 인코딩
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
케라스에서 fit 메서드를 호출하여 훈련 데이터에 모델을 학습
>>> network.fit(train_images, train_labels, epochs=5, batch_size=128)
Epoch 1/5
469/469 [==============================] - 7s 13ms/step - loss: 0.2661 - accuracy: 0.9219
Epoch 2/5
469/469 [==============================] - 5s 10ms/step - loss: 0.1080 - accuracy: 0.9679
Epoch 3/5
469/469 [==============================] - 5s 11ms/step - loss: 0.0709 - accuracy: 0.9797
Epoch 4/5
469/469 [==============================] - 5s 12ms/step - loss: 0.0507 - accuracy: 0.9847
Epoch 5/5
469/469 [==============================] - 5s 10ms/step - loss: 0.0388 - accuracy: 0.9889
- 훈련 데이터에 대한 네트워크의 손실과 정확도가 표시됨
- 훈련 데이터에 대해 0.989의 정확도 달성
데이터 세트에서도 모델이 잘 작동하는지 확인
>>> test_loss, test_acc = network.evaluate(test_images, test_labels)
313/313 [==============================] - 1s 3ms/step - loss: 0.0630 - accuracy: 0.9806
>>> print('test_acc:', test_acc)
test_acc: 0.9805999994277954
- 테스트 세트 정확도 : 0.981
- 훈련 세트 정확도 : 0.989
- 과대 적합에 의해서 훈련 정확도와 테스트 정확도 사이에 차이가 발생
- 과대 적합(overfitting): 머신 러닝 모델이 훈련 데이터보다 새로운 데이터에서 성능이 낮아지는 경향
여기까지 예제를 통해서 학습 모델이 어떻게 생성되는지 알아봤는데 아직 잘 이해가 안 되고, 모르겠는 내용들이 많다. 해당 과정을 보고 이해하는 정도에서 그치고, 나머지 부분에 대해서는 챕터를 넘어가면서 차차 알아가보자.
출처 : 프랑소와 숄레, <케라스 창시자에게 배우는 딥러닝>, (주)도서출판 길벗, 2018.10.22
'Machine Learning, Deep Learning > 케라스 창시자에게 배우는 딥러닝' 카테고리의 다른 글
Chapter 02-2: 신경망을 위한 데이터 표현 (0) | 2023.07.23 |
---|---|
MLDL Chapter 01-1 : 딥러닝의 기초 (0) | 2023.07.19 |