목차
- 목표
- solution
- MINIST 데이터 설명
- 트레이닝 및 검증 데이터 레이블
- 데이터를 메모리에 로드(Keras 사용)
- MNIST 데이터 살펴보기
- 트레이닝을 위한 데이터 준비
- 모델 생성
- 모델 요약
- 모델 컴파일
- 모델 트레이닝
- 정확도 관찰
- 추론
- 메모리 지우기
목표
처음 접한 이미지를 정확한 클래스로 올바르게 분류
solution
딥러닝_시행착오를 통한 패턴 인식에 뛰어난 면모
MINIST 데이터 설명
0~9의 수기 문자로 구성된 70,000개의 회색조 이미지
딥러닝 계의 HELLOWORLD
트레이닝 및 검증 데이터 레이블
데이터 엔지니어링: 분석을 위한 데이터 준비과정
- X: 이미지 자체
- Y: 이미지의 올바른 레이블
➡ 모델 트레이닝을 위한 X,Y 필요
➡ 트레이닝 된 모델 검증 을 위한 X,Y 필요
x_train
: 뉴럴 네트워크를 트레이닝하는 데 사용되는 이미지
y_train
: x_train 트레이닝 중 모델의 예측을 평가하는 데 사용되는 올바른 이미지 레이블
x_valid
: 트레이닝된 모델의 성능 검증을 위해 따로 확보해 놓는 이미지
y_valid
: x_valid 트레이닝 후 모델의 예측을 평가하는 데 사용되는 올바른 이미지 레이블
데이터를 메모리에 로드(Keras 사용)
먼저 MNIST를 위한 Keras 데이터세트를 로드
- mnist 모듈: 트레이닝 및 검증을 위해 이미지와 레이블로 미리 분할되어 있음
# 데이터 불러옴
from tensorflow.keras.datasets import mnist
# the data, split between train and validation sets
# 훈련데이터와 검증데이터로 나눔
(x_train, y_train), (x_valid, y_valid) = mnist.load_data()
MNIST 데이터 살펴보기
다음 셀을 실행하면
- Keras가 트레이닝을 위해 60,000개의 이미지 ,검증(트레이닝 후)을 위해 10,000개의 이미지를 분할 확인 가능
- 각 이미지 자체가 28x28 차원의 2D 어레이임을 확인
x_train.shape
#(60000, 28, 28)
x_valid.shape
# (10000, 28, 28)
이러한 28x28 이미지가 0~255의 서명되지 않은 8비트 정수 값 모음으로 표현되는 것을 확인 가능.
- 0: 검은색
- 255: 흰색
- 0~255: 모든 값은 둘 사이의 회색조 값
x_train.dtype
# dtype('uint8')
x_train.min()
# 0
x_train.max()
# 255
Matplotlib를 사용하면 데이터세트에서 이러한 회색조 이미지 중 하나를 렌더링 가능.
import matplotlib.pyplot as plt
image = x_train[0]
plt.imshow(image, cmap='gray')
이 픽셀의 답이 3인지 5인지 알기 위해서는 정답인 y_train데이터를 불러오면 된다
y_train[0]
# 5
트레이닝을 위한 데이터 준비
딥러닝에서는 대부분의 경우 트레이닝을 위한 적합한 상태로 데이터를 변환 필요
[변환작업]
1) 이미지 데이터 평탄화: 모델에 입력되는 이미지 간소화
2) 이미지 데이터 정규화: 이미지 입력 값이 모델에서 더 쉽게 작동되게 함
3) 레이블 분류: 레이블 값이 모델에서 더 쉽게 작동되게 함
1) 이미지 데이터 평탄화
Reshpe: 2차원 이미지(28x28픽셀) ➡ 단일 어레이(각 이미지를 784개의 연속 픽셀(28x28 = 784))
x_train = x_train.reshape(60000, 784)
x_valid = x_valid.reshape(10000, 784)
확인
x_train.shape
# (60000, 784)
2) 이미지 데이터 정규화
딥러닝 모델은 0에서 1 사이의 부동 소수점 수를 처리하는데 유용
- 정규화: 정수 값을 0에서 1 사이의 부동 소수점 값으로 변환
- 여기서의 정규화: 모든 픽셀 값을 최대인 255로 나눔
x_train = x_train / 255
x_valid = x_valid / 255
3.1) 범주 인코딩
딥러닝에서는 이분법적인 정답추론을 시키는 것이 유리함
- O : 7-2 의 답은 4,9 둘 다 아니다
- X: 7-2 의 답은 9보다 4에 더 가깝다.
ex) one-hot encoding
이를 응용하여 데이터 범주 인코딩을 해보자
이를 0,1 바이너리를 이용하여 풀면,
이것이 범주 인코딩 즉, 범주 레이블로 이해되어야 하는 값을 모델이 범주 특성을 알 수 있는 표현으로 변환하는 것임
즉,
values = [‘red, green, blue, green’]
이 값을 트레이닝 값으로 사용하기엔 뉴럴 네트워크가 이를 이해하기 어려워 할 것이다.
그러므로,
values = [
[1, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 0, 1]
]
이렇게 변환(범주 인코딩)을 해준다
3.2) 레이블 범주 인코딩
Keras는 값을 범주 인코딩하는 유틸리티를 제공
- 이를 이용하여 트레이닝, 검증 레이블 모두 범주 인코딩 수행
import tensorflow.keras as keras
num_categories = 10
y_train = keras.utils.to_categorical(y_train, num_categories)
y_valid = keras.utils.to_categorical(y_valid, num_categories)
확인
y_train[0:9]
###
array([[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)
####
그럼 이제 트레이닝을 위한 데이터가 준비되었다.
모델 생성
이제 데이터로 트레이닝할 모델을 생성해야 함.
[기본 모델]
여러 개의 레이어로 이루어짐
3가지 주요 부분으로 구성
✔구성
1) 입력 레이어: 어느 정도 예상되는 형식으로 데이터를 수신
2) 여러 개의 히든 레이어: 각각 다수의 뉴런으로 구성
- 각 뉴런: 가중치로 네트워크의 추측에 영향을 미칠 수 있음
- 가중치: 네트워크가 수많은 반복을 통해 성능에 대한 피드백을 수신하고 학습하면서 업데이트하게 되는 값
3) 출력 레이어: 주어진 이미지에 대한 네트워크의 추측을 보여줌
0) 모델 인스턴스 화
모델을 찍어서 사용할 인스턴스 생성
- Keras의 순차 모델 클래스를 사용하여 데이터가 연속으로 통과할 일련의 레이어를 보유한 모델의 인스턴스를 인스턴스화
from tensorflow.keras.models import Sequential
model = Sequential()
1) 입력 레이어 생성
레이어는 밀집 연결되어 있음
- 포함된 각 뉴런과 가중치가 다음 레이어의 모든 뉴런에 영향을 줌
- Keras로 이를 수행하려면 Keras의 Dense 레이어 클래스를 사용
from tensorflow.keras.layers import Dense
인수
units
: 레이어 내 뉴런 수를 지정- 이번은 실험에서 선택한 512를 사용
- 올바른 뉴런 수를 선택: 데이터세트의 통계적 복잡성을 없애주는 일 ➡ 데이터 사이언스” 작업의 핵심
activation
: 활성화 함수 선택- 입력신호의 활성화 여부를 결정
- [relu] (https://yerimoh.github.io/DL2/#relu-%ED%95%A8%EC%88%98) 사용
input_shape
: 값은 수신되는 데이터의 모양을 지정- 여기서는 784개 값으로 이루어진 1D 어레이
model.add(Dense(units=512, activation='relu', input_shape=(784,)))
2) 히든레이어 생성
추측에 기여하는 더 많은 매개변수 즉, 정확한 학습을 위한 좀 더 예리한 기회를 네트워크에 제공
model.add(Dense(units = 512, activation='relu'))
3) 출력 레이어 생성
각 레이어의 값이 0에서 1사이의 확률이 되도록 함
- 활성 함수인 softmax 사용: 레이어의 모든 출력이 1에 추가되도록 함
- 출력: 이미지가 해당 특정 클래스에 속한다는 모델의 추측(확률)을 제공
model.add(Dense(units = 10, activation='softmax'))
모델 요약
Keras는 모델에 대한 읽을 수 있는 요약을 출력하는 모델 인스턴스 메서드 요약을 제공
- 트레이닝 가능한 매개변수의 수를 확인 가능: 이러한 각 매개변수는 트레이닝 도중에 조정 가능➡ 트레이닝된 모델의 추측에 기여
model.summary()
###
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 512) 401920
_________________________________________________________________
dense_1 (Dense) (None, 10) 5130
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________
###
모델 컴파일
실제로 데이터를 사용하여 모델을 트레이닝하기 전에 수행해야 할 마지막 단계
loss
: 손실함수 를 지정
* 트레이닝 중 모델에서 성능을 파악하는 데 사용됨accuracy
: 모델 트레이닝 동안 정확성 추적하도록 지정
model.compile(loss='categorical_crossentropy', metrics=['accuracy'])
모델 트레이닝
트레이닝 및 검증 데이터와 모델이 준비되었음
이제 트레이닝 데이터로 모델을 트레이닝하고 검증 데이터로 이를 검증해야 함
Keras로 모델을 맞추는(트레이닝하는) 경우에는 모델의 fit 메서드를 사용
그럼 다음 인수를 예상함
- 트레이닝 데이터
- 트레이닝 데이터의 레이블
- 전체 트레이닝 데이터세트에 대해 트레이닝해야 하는 횟수(에포크)
- 검증 또는 테스트 데이터 및 해당 레이블
history = model.fit(
x_train, y_train, epochs=5, verbose=1, validation_data=(x_valid, y_valid)
)
###
Epoch 1/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.1913 - accuracy: 0.9426 - val_loss: 0.0983 - val_accuracy: 0.9715
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0986 - accuracy: 0.9747 - val_loss: 0.1300 - val_accuracy: 0.9711
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0807 - accuracy: 0.9803 - val_loss: 0.1040 - val_accuracy: 0.9781
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0715 - accuracy: 0.9838 - val_loss: 0.1352 - val_accuracy: 0.9736
Epoch 5/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0647 - accuracy: 0.9858 - val_loss: 0.1116 - val_accuracy: 0.9814
###
정확도 관찰
관찰해야 할 것
5회의 에포크 각각에 대해,
- accuracy: 모든 트레이닝 데이터에 대한 에포크 동안의 모델 성능이 어땠는지를 명시
- val_accuracy: 모델을 트레이닝하는 데 전혀 사용되지 않는 검증 데이터에 대한 모델 성능이 어땠는지를 나타냄
추론
이 모델을 사용하여 처음 접하는 새로운 수기 이미지를 분류
메모리 지우기
다음 노트북으로 넘어가기 위한 필수 작업
import IPython
app = IPython.Application.instance()
app.kernel.do_shutdown(True)