MLOps 프로젝트/도서 '케라스 창시자에게 배우는 딥러닝'

1부 2.1 신경망과의 첫 만남

youjin86 2021. 8. 23. 14:37

1부 딥러닝의 기초

2장 딥러닝이란 무엇인가?


2.1 신경망과의 첫 만남

class(클래스)

머신 러닝에서 분류 문제의 범주(category)

 

label(레이블)

특정 샘플(데이터 포인트)의 클래스

 

layer(층)

신경망의 핵심 구성 요소

주어진 문제에 더 의미있는 표현을 입력된 데이터로부터 추출

 

학습 작업 순서

1. 훈련 데이터인 train_images와 train_labels을 네트워크에 주입

2. 네트워크가 이미지와 레이블을 연관시킬 수 있도록 학습

3. test_images에 대한 예측을 네트워크에 요청

4. 예측이 test_labels와 맞는지 확인

 

MNIST 데이터셋

케라스 파이썬 라이브러리 사용

넘파일 배열 형태이며 흑백 손글씨 숫자 이미지(28*28 픽셀)를 10개의 범주(0~9)로 분류

 

이미지와 레이블은 1 대 1관계

image - 넘파이 배열로 인코딩

label - 0~9의 숫자 배열

 

1. keras에서 MNIST 데이터셋 적재

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

training set 구성 - train_images와 train_labels

test set 구성 - test_images와 test_labels

 

2. 신경망 구조

신경망 층에서 마지막 층

확률 점수가 들어 있는 배열(모두 더하면 1)을 반환

 

확률 점수 : 클래스 중 하나에 속할 확률

from keras import models
from keras import layers

#완전 연결된 신경망 층인 Dense 층 2개가 연속되어 있음.
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))

#마지막 층은 10개의 확률 점수가 들어 있는 배열을 반환하는 softmax층
network.add(layers.Dense(10, activation='softmax'))

 

 

각 점수는 현재 숫자 이미지가 10개의 숫자 클래스 중 하나에 속할 확률임.

 

3. 컴파일 단계

손실함수, 옵티마이저, 훈련과 테스트 과정을 모니터링할 지표가 필요

network.compile(optimizer='rmsprop', #옵티마이저
                loss='categorical_crossentropy', #손실 함수
                metrics=['accuracy']) # 훈련과 테스트 과정을 모니터링 할 지표, 여기선 정확도 고려

 

손실함수(loss function)

훈련 데이터에서 신경망의 성능을 측정하는 방법

네트워크가 옳은 방향으로 학습할 수 있도록 도와줌.

 

옵티마이저(optimizer)

입력된 데이터와 손실 함수를 기반으로 네트워크를 업데이트하는 메커니즘

 

훈련과 테스트 과정을 모니터링할 지표

여기선 정확도(정확히 분류된 이미지의 비율)만 고려

 

 

4. 이미지 데이터 준비

훈련을 시작하기 전에 데이터를 네트워크에 맞는 크기로 바꿈.

모든 값을 0과 1 사이로 스케일을 조정

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

우리의 훈련 이미지는 [0, 255] 사이의 값인 uint8 타입의 (60000, 28, 28) 크기를 가진 배열로 저장되어 있음.

이 데이터를 0과 1 사이의 값을 가지는 float32 타입의 (60000, 28 * 28) 크기의 배열로 바꿔줌.

 

5. 레이블 준비

레이블을 범주형으로 인코딩

from keras.utils import to_categorical

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

 

6. 모델 학습

fit 메서드를 호출하여 훈련 데이터에 모델을 학습

network.fit(train_images, train_labels, epochs=5, batch_size=128)

훈련 데이터에 대한 네트워크의 손실과 정확도인 두 개의 정보가 출력

훈련 데이터에 대해 0.989(98.9%)의 정확도가 달성됨.

 

7. 테스트

test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)

테스트 세트의 정확도는 97.8%로 나옴.

훈련 정확도와 테스트 정확도 사이의 차이는 과대적합 때문

 

과대적합 : 머신 러닝 모델이 훈련 데이터보다 새로운 데이터에서 성능이 낮아지는 경향