딥러닝 (Deep Learning)/딥러닝 분석연습

MNIST - practice1,2 + 자세한 설명

DS지니 2021. 4. 11. 21:02
728x90
반응형

작업 순서

  1. 학습시킬 준비를 한다.(신경망 만들기, compile, 전처리)
  2. train_images와 train_labels를 네트워크에 주입한다.
  3. 네트워크는 이미지와 레이블을 연관시킬 수 있도록 학습한다.
  4. test_images에 대한 예측을 네트워크에 요청하면 그 예측이 test_labels와 맞는지 확인할 것이다.

 


 

1. tesorflow 사이트 초보자용 가이드 (연습1)

tensorflow사이트 www.tensorflow.org/tutorials/quickstart/beginner?hl=ko 

 mnist 이미지

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)

github.com/gggggeun/study/blob/main/5.%20%EB%94%A5%EB%9F%AC%EB%8B%9D(deep%20learning)/MNIST(practice1).ipynb

 

gggggeun/study

Contribute to gggggeun/study development by creating an account on GitHub.

github.com

 

# 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)이 일어났기 때문이다.
728x90
반응형