케라스 창시자에게 배우는 딥러닝 2-1장

2020. 3. 8. 12:16Python/모두를 위한 딥러닝

[신경망의 수학적 구성 요소]

- 목차 -

2.1 신경망과의 첫 만남

2.2 신경망을 위한 데이터 표현

2.3 신경망의 톱니바퀴: 텐서 연산

2.4 신경망의 엔진: 그래디언트 기반 최적화

2.5 첫 번째 예제 다시 살펴보기

2.6 요약

- 핵심 내용 -

  • 첫 번째 신경망 예제 만들기
  • 텐서와 텐서 연산의 개념
  • 역전파와 경사 하강법을 사용하여 신경망이 학습되는 방법

 

필요한 수학적 개념

텐서, 텐서 연산, 미분 경사 하강법(Gradient descent) 등

하지만 이 장에서는 기술적으로 깊게 들어가지 않음

 

 

[2.1 신경망과의 첫 만남]

이 장에서는 케라스나 비슷한 라이브러리를 사용한 경험이 없다면 예제를 이해하지 못할 가능성이 높으므로 그냥 이런 것이 있다는 정도로만 알려주는 것 같다는 느낌이 들었습니다.(코드가 좀 이상하거나 요술처럼 보이더라고 걱정 말라고 직접 책에 적어놓으셨습다...)

 

 

첫번 째 예제로는 고전으로 취급받는 데이터셋인 MNIST를 사용합니다. 이 데이터셋은 머신러닝의 역사만큼 오래되었고 많은 연구에도 사용되었다고 합니다. (머신 러닝계의 "Hello World")

 

클래스와 레이블

  • 클래스(class): 머신 러닝에서 분류 문제의 범주(category)를 일컫는 말
  • 샘플(sample): 데이터 포인트
  • 레이블(label): 특정 샘플의 클래스

 

<MNIST는 케라스에 넘파이(Numpy) 배열 이미 포함되어 있습니다.>

 

1. 케라스에 데이터셋 적재

from keras.datasets import mnist #케라스 데이터셋에 포함되어 있는 mnist를 가져온다.
#train_images와 train_labels 모델이 학습해야 할 훈련 세트를 구성
#모델은 test_images와 test_labels로 구성된 테스트 세트에서 테스트 됨
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

- mnist.load_data()가 무슨 의미인지는 아직 잘 모르겠습니다.

- 이미지와 레이블은 1:1 관계로 구성되어 있다고 합니다.

 

훈련 데이터

>>> train_images.shape	# 28x28픽셀의 데이터 6만개를 가지고 있다.
 (60000, 28, 28)
>>> len(train_labels)	# mnist label의 길이는 6만이다.
 60000
>>> train_labels	# 6만개의 원소를 가진 numpy 타입의 배열(?)인 것 같다.
 array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)

테스트 데이터

>>> test_images.shape
 (10000, 28, 28)
>>> test_labels
 array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)

작업 순서

  1. 훈련 데이터(train_image와 train_labels)를 네트워크에 주입한다.
  2. 네트워크는 이미지와 레이블을 연관시킬 수 있도록 학습된다.
  3. test_images에 대한 예측을 네트워크에 요청한다.
  4. 예측이 test_labels와 맞는지 확인한다.

 

2. 신경망 만들기

 

[신경망 구조]

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)을 import

- 대부분의 딥러닝은 간단한 층을 연결하여 구성되어 있고, 점진적으로 데이터를 정제하는 형태를 띔

 

(...잘 모르겠지만 network에 models를 순차적으로 처리하는 것 같은 느낌?)

 

이 예제에서는 완전 연결(fully connected)된 신경망 층인 Dense 층 2개가 연속되어 있다고 한다. 그 중 relu는 설명되어 있지 않고, softmax는 10개의 확률 점수가 들어 있는 배열(모두 더하면 1)을 반환하는 층이라고 한다. (각 점수는 현재 숫자 이미지가 10개의 숫자 클래스 중 하나에 속할 확률)

 

 

[신경망의 컴파일 단계에 포함될 3가지]

network.compile(optimizer='rmsprop',
                loss='categorical_crossentropy',
                metrics=['accuracy'])
  1. 손실 함수(loss): 훈련 데이터에서 신경망의 성능을 측정하는 방법 - 옳은 방향으로 학습될 수 있도록 도와줌
  2. 옵티마이저(optimizer): 입력된 데이터와 손실함수를 기반으로 네트워크를 업데이트하는 매커니즘 
  3. 훈련과 테스트 과정을 모니터링할 지표(metrics): 2장에서는 정확도만 고려한다고 함

1장에서 설명했던 위의 3가지의 요소를 추가해주는 것 같다.

 

 

[이미지 데이터 준비]

train_images = train_images.reshape((60000, 28*28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28*28))
test_image = test_images.astype('float32') / 255

훈련 전에 데이터를 네트워크에 맞는 크기로 바꾸고 모든 값을 0과 1 사이로 스케일을 조정해야한다고 한다.

이 예제에서는 우리의 훈련 이미지는 [0, 255]사이의 값인 uint8 타입으로 되어 있는데 이  데이터를 0과 1 사이의 값을 가지는 float32 타입으로 바꿔줘야 한다고 한다.

 

 

[레이블 준비]

from keras.utils import to_categorical

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

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

Epoch 1/5
60000/60000 [==============================] - 5s 89us/step - loss: 1.4522 - acc: 0.6790
Epoch 2/5
60000/60000 [==============================] - 5s 78us/step - loss: 0.5720 - acc: 0.8554
Epoch 3/5
60000/60000 [==============================] - 5s 79us/step - loss: 0.4048 - acc: 0.8898
Epoch 4/5
60000/60000 [==============================] - 5s 80us/step - loss: 0.3493 - acc: 0.9025
Epoch 5/5
60000/60000 [==============================] - 5s 80us/step - loss: 0.3212 - acc: 0.9084

- 케라스에서는 fit 메서드를 호출하여 훈련 데이터에 모델을 학습시킨다.

  • loss는 손실함수로써 낮아질 수록 정확도가 높아진다고 한다.
  • acc는 정확도로 accurancy같다

 

>>> test_loss, test_acc = network.evaluate(test_images, test_labels)
 10000/10000 [==============================] - 1s 51us/step
 
>>> print('test_acc:', test_acc)
 test_acc: 0.8188

훈련 세트 정확도는 0.9084이고 테스트 세트의 정확도는 0.8188이 나왔는데 이 차이는 과대적합(overfitting) 때문이라고 한다.

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

 

 

책에서는 exercise_acc: 0.9894, test_acc: 0.9789, 나의 exercise_acc: 0.9084, test_acc: 0.8188가 나왔는데 무슨 이유 때문인지는 잘 모르겠다.

 

 

 

p.s. 손을 다쳐서 한동안 작성하지 못했는데 이제 시작하게 되었습니다. 늦었지만 열심히 따라가도록 노력하겠습니다.