2020. 3. 8. 12:16ㆍPython/모두를 위한 딥러닝
[신경망의 수학적 구성 요소]
- 목차 -
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)
작업 순서
- 훈련 데이터(train_image와 train_labels)를 네트워크에 주입한다.
- 네트워크는 이미지와 레이블을 연관시킬 수 있도록 학습된다.
- test_images에 대한 예측을 네트워크에 요청한다.
- 예측이 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'])
- 손실 함수(loss): 훈련 데이터에서 신경망의 성능을 측정하는 방법 - 옳은 방향으로 학습될 수 있도록 도와줌
- 옵티마이저(optimizer): 입력된 데이터와 손실함수를 기반으로 네트워크를 업데이트하는 매커니즘
- 훈련과 테스트 과정을 모니터링할 지표(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. 손을 다쳐서 한동안 작성하지 못했는데 이제 시작하게 되었습니다. 늦었지만 열심히 따라가도록 노력하겠습니다.
'Python > 모두를 위한 딥러닝' 카테고리의 다른 글
모두를 위한 딥러닝 시즌2 (Deep Learning Zero To All) (0) | 2020.04.03 |
---|---|
케라스 창시자에게 배우는 딥러닝 2-2장 (0) | 2020.03.14 |