딥러닝1.py

MNIST 손글씨 분류 - 기초 딥러닝

핵심 개념

  • MNIST 데이터셋 활용
  • Sequential 모델 구축
  • sparse_categorical_crossentropy (원핫인코딩 불필요)
  • 데이터 정규화 (0~255 → 0~1)
from tensorflow.keras.datasets import mnist  #우편번호 분리하려고 만든 데이테셋
#전체 7만개
import tensorflow as  tf
tf.random.set_seed(1234) #시드고정하기

#교재의 데이터 분석 순서 정리하기
#1.제공하는 데이터 불러오기
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

#이미 데이터가 만들어져 있다. 60000개의 훈련데이터셋, 10000개의 테스트셋
#신경망의 이미지는 3차원을 2차원으로 바꾸서 인식
#28 by 28 이미지가 60000 개가 있음
print( train_images.shape)  #이미지의 크기와 타입을 확인해보자
print(type(train_images))

print( train_labels.shape)
print( train_labels[:10])

#2.딥러닝 모델을 만든다
from tensorflow import keras
from tensorflow.keras import models
from tensorflow.keras import layers

#신경망 모델(네트워크) 만들기
model = keras.Sequential([
#층을 추가한다. - 입력층과 출력층 두개는 추가해야 한다
    layers.Dense(64, activation="relu"),
    layers.Dense(10, activation="softmax")
])

#sgd(경사하강법을 업그레이드함) rmsprop
#진동이 크지 않고 수렴 속도가 빠름.
#RNN에 적합합

#categorical_crossentropy : 원핫인코딩 필요함
#sparse_categorical_crossentropy : 정수형 레이블을 직접 사용할 때
model.compile( optimizer="rmsprop",
                 loss="sparse_categorical_crossentropy",
                 metrics=['accuracy'])


#입력은 2차원형태이어야 한다  3차원 -> 2차원으로 벼경한다
train_images = train_images.reshape( (60000, 28*28) )
#딥러닝은 스케일링 필요 - normalize 0~1사이에 머무르게 한다
train_images = train_images.astype('float32')/255

#다중이미지분류 - 딥러닝은 반드시 원핫인코딩으로 해서 전달해야 한다
#손실함수로 categorical_crossentropy 사용할때 - 이제 원핫인코딩 필요없음
# from tensorflow.keras.utils import to_categorical #케라스가 제공하는 원핫인코딩
# train_labels = to_categorical(train_labels)
# test_labels = to_categorical(test_labels)

test_images = test_images.reshape( (10000, 28*28))
test_images = test_images/255

#학습시작
hist =  model.fit (  train_images,
               train_labels,
               epochs=5, #총 학습횟수
               batch_size=128 #데이터가 클때 학습한번하자고
                             #모든데이터한번에 메모리에
                             #로딩 못함, batch_size 에서
                             #준만큼 읽어와서 실행
         )

train_loss, train_acc = model.evaluate( train_images, train_labels)
print("훈련셋 손실 {} 정확도 {}".format(train_loss, train_acc))
test_loss, test_acc = model.evaluate( test_images, test_labels)
print("테스트셋 손실 {} 정확도 {}".format(test_loss, test_acc))