작업 순서
- 학습시킬 준비를 한다.(신경망 만들기, compile, 전처리)
- train_images와 train_labels를 네트워크에 주입한다.
- 네트워크는 이미지와 레이블을 연관시킬 수 있도록 학습한다.
- test_images에 대한 예측을 네트워크에 요청하면 그 예측이 test_labels와 맞는지 확인할 것이다.
1. tesorflow 사이트 초보자용 가이드 (연습1)
tensorflow사이트 www.tensorflow.org/tutorials/quickstart/beginner?hl=ko
import pandas as pd
!pip install tensorflow-gpu==2.0.0-rc1
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 #픽셀값 범위(0~225)를 0~1 사이로 조정해 전처리
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)), #각 이미지는 28x28 픽셀
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test) #테스트
tf.keras.layers.Flatten : input_shape인 28*28(2차원 배열)의 이미지 포맷을 28*28=784 픽셀의 1차원 배열로 변환함. 이미지에 있는 픽셀의 행을 펼쳐서 일렬로 늘리는 것. 이 층에서는 학습되는 가중치는 없고 데이터만 변환함.
tf.keras.layers.Dense : 이 층은 밀집 연결(densely-connected)층 또는 완전 연결(fully-connected)층 이라고 부른다. 위 코드의 첫 번째 Dense 층은 128개의 노드, 두번째 Dense 층은 10개의 노드를 갖는다. .
tf.keras.layers.Dropout(0.2) : overfitting을 방지하기 위한 방법 중 하나로 입력층과 은닉층의 총 노드 수의 0.2%를 생략 하고 학습함. 주로 0.2~0.5를 많이 사용함.
활성화 함수 'softmax'는 주로 클래스 값이 3개 이상인 데이터에 마지막 Dense(출력값)에 주로 쓰인다. 위 코드를 보면 총 10개의 확률을 반환(전체 확률의 합은 1)하며, 각 노드는 현재 이미지가 10개의 클래스 중 하나에 속할 확률을 출력한다.
model.compile : 모델을 훈련하기 전에 필요한 몇 가지 설정이 추가된다.
optimizer : 데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정
loss : Loss function. 훈련하는 동안 모델의 오차를 측정. 모델의 학습이 올바른 방향으로 향하도록 이 함수를 최소화해야함.
metrics : 훈련 단계와 테스트 단계를 모니터링하기 위한 지표 설정. accuracy(정확도), MSE, MAE (오차의평균) 등이 있음.
epochs : 지금까지의 과정 반복 횟수
2. [케라스 창시자에게 배우는 딥러닝] MNIST 예제 (연습2)
# MNIST 데이터 불러오기
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# train data
print("<train data - 28*28픽셀의 60,000개 이미지>\n")
print(train_images.shape)
print(len(train_labels))
print(train_labels)
print("\n--------------\n")
# test data
print("<test data - 28*28픽셀의 10,000개 이미지>\n")
print(test_images.shape)
print(len(test_labels))
print(test_labels)
# 간단한 신경망 만들기
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개의 숫자 클래스 중 하나에 속할 확률이다.
# 신경망을 compile하는 단계
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
- 옵티마이저(optimizer) : 입력된 데이터와 손실 함수를 기반으로 네트워크를 업데이트하는 메커니즘
- 손실 함수(loss function) : 훈련 데이터에서 신경망의 성능을 측정하는 방법으로 네트워크가 옳은 방향으로 학습될 수 있도록 도와줌.
- 지표 : 훈련과 테스트 과정을 모니터링 할 수 있다. 여기에서는 accurac 지표를 사용함.
# 데이터 전처리
from keras.utils import to_categorical
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
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
train_images.shape
(6000, 784)
- 훈련을 하려면 데이터를 네트워크에 주입해야 하기 때문에, 데이터를 네트워크에 맞는 크기로 바꾼다. (reshape)
- 모든 값을 0과 1 사이로 스케일 조정한다. 현재 훈련 이미지는 [0,255] 사이의 값인 uint8 타입의 (60000, 28, 28) 크기를 가진 배열로 저장되어 있기 때문에 255로 나누면 모든 값이 0~1 값이 된다.
- 레이블을 범주형으로 인코딩한다. (to_categorical)
# 학습(fit)
network.fit(train_images, train_labels, epochs=5, batch_size=128)
- loss, accuracy : 훈련 데이터에 대한 네트워크 손실과 정확도
- epochs : 학습의 반복 횟수(train data 6만개를 5번 반복 학습)
- batch_size : 데이터를 몇 개로 나눠 학습할 것인지 (6만개 데이터를 1번 학습할 때마다 128개씩 나눠서 학습)
- 훈련 데이터에 대해 정확도 98.96% 달성
# 예측(evaluate)
test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc : ', test_acc)
- 테스트 데이터에 대한 정확도 97.99%
- 훈련 정확도보다 테스트 정확도가 좀 더 낮은데 과대적합(overfitting)이 일어났기 때문이다.
'딥러닝 (Deep Learning) > 딥러닝 분석연습' 카테고리의 다른 글
뉴스 기사 분류 : 로이터(Reuters) 데이터셋 (병목현상, 레이블을 벡터로 바꾸는 방법들 2가지) (0) | 2021.04.27 |
---|---|
영화 리뷰 분류 : IMDB(Internet Movie Database) (0) | 2021.04.26 |
Keras 정의, 특징, 사용법 (0) | 2021.04.21 |
tensorflow.keras 손글씨 MNIST (0) | 2021.04.07 |