블로그 이미지
devtang
Instagram : @taebr0 devtaehyeong@gmail.com

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2020. 3. 26. 17:47 AI/Keras

이번 게시물에서는 Keras를 이용하여 손글씨  데이터셋을 불러와서 모델 구성 및 학습하여 Keras의 간단한 기초과정을 이해하는 게시물입니다.

 

MNIST란 이미지 데이터 셋으로 사람이 직접 쓴 글씨체 0~9까지의 이미지들로 구성되어있습니다.

케라스 데이터셋 라이브러리를 이용하여 쉽게 훈련용 이미지를 load할 수 있습니다.

 

Windows10 환경에서 진행하였으며 기본 세팅 과정은 아래의 블로그에서 참조해주세요.

https://like-edp.tistory.com/3

 

Anaconda(아나콘다) 에서 Keras(케라스) 설치하기

반갑습니다. 이번 글에서는 아나콘다를 사용하여 케라스까지 설치해보는 작업을 진행하도록 하겠습니다. 아나콘다는 일반적으로 정말 다양한 라이브러리 패키지들을 모아놓은 소프트웨어인데, Python을 포함해 연..

like-edp.tistory.com

우선 keras 모듈을 import 하여 훈련에 필요한 손글씨 데이터 셋을 불러옵니다.

import keras
from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

딥러닝 모델을 학습하기 위해 train 과 test 2가지로 나눕니다.

train 은 훈련시킬 데이터이고 test는 훈련시킨 모델의 테스트용 데이터 입니다.

_images는 숫자 이미지의 정보이며 _label은 숫자 이미지의 이름입니다.

 

print(train_images[0])

import matplotlib.pyplot as plt
plt.imshow(train_images[0])
plt.show()

 

 

이미지데이터를 출력시켜 보았습니다. 출력시켜보면 배열안에 0~255 숫자 픽셀 데이터로 구성 되어있는 것을 알 수 있습니다. 추가적으로 matplotlib를 import 하여 train_images[0] 의 사진을 불러왔습니다.

 

print(train_images.shape)
print(len(train_labels))
print(train_labels)

print(test_images.shape)
print(len(test_labels))
print(test_labels)

train_image와 test_image 를 shape 명령어를 사용하여 각각의 배열 데이터의 크기를 확인할 수 있습니다.

print(train_images.shape) 

(60000,28,28)

60000 : 갯수가 6만개라는 뜻입니다.

28,28 : 하나의 배열은 28X28 로 이루어져 있습니다.

 

print(len(train_labels))

60000

train_labels 의 데이터의 길이가 60000이라는 뜻입니다.

 

이제 데이터 셋 성분을 보았으니 이 데이터들을 Normalize해줘야합니다.

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

reshape 로 출력 데이터를 같은 양식으로 통일하고 astype를 이용하여 픽셀값이 0~255사이 값이므로 255로 나누어 데이터를 0~1까지의 숫자로 변환합니다.

 

이미지 데이터들을 전처리 해주었으니  라벨 데이터 역시 One-hot encoding으로 변환 해줍니다.

 

One-hot encoding 이란?

표현하고 싶은 단어의 index에는 1의 값을 부여하고 , 다른 인덱스에는 0을 부여하는 표현 방식입니다.

print (train_labels[:10])
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
print (train_labels[:10])

train_labels 을 인코딩전에 출력하면

[ 5 0 4 1 9 2 1 3 1 4 ]

이렇게 표현이됩니다.

5를 encoding 한 결과값입니다.

[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]

배열 index (0~9)중 여섯번째가 5입니다. 정수 5 위치의 값이 1이며, 나머지값은 0으로 표현하게됩니다.

 

이제 데이터셋의 생성이 모두 완료되었습니다. 다음 단계는 모델을 구성하여 학습준비를 해야합니다.

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'))

models과 layers 를 import하여 Sequential()함수를 이용합니다.

이때 Dense 레이어를 이용하는데

Dense() 함수에 들어가는 인자는 다음과 같습니다.

 

Dense(512, activation='relu', input_shape=(28*28))

*512 는 출력 뉴런의 수를 설정합니다.

*input_shape 는 입력 뉴런의 수를 설정합니다. (행,열,채널 수) 로 구성됩니다.

*activation='relu' 

*relu : (ReLU, Rectified Linear Unit), 은닉층(hidden layer) 에서 주로 사용하는 활성화 함수입니다.

*softmax : 입력받은 값을 출력으로 0~1사이의 값으로 모두 정규화하며 출력 값들의 총합은 항상 1이 되는 특성을 가진 함수 입니다. 

 

이 게시물에서 구하고자 하는 문제는 입력 이미지가 주어졌을 때 0~9 까지 각 숫자와 얼마나 비슷한지에 대한 확률을 구하는 것입니다. 숫자 9를 인식하려는데 예를들어 9일확률 80%, 8일확률 5% 로 다른 숫자에 대해서 낮은 확률로 인식할 수 있습니다. 

 

network.add를 이용하여 두 개의 Dense 계층을 연속적으로 추가하며, 합계가 1이 되는 10개의 확률 점수의 배열을 반환합니다. 각 점수는 현재의 숫자 이미지가 10개 숫자 분류 각각에 속할 확률입니다.

 

 

network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

이제 .compile을 이용하여 학습하기전 설정을 합니다.

optimizer = 학습속도를 빠르고 안정적으로 하는 원리를 말합니다.

'Adam' , 'SGD', 등 다양한 알고리즘이 있지만 여기서 수행할 'rmsprop'은 각각의 가중치에 맞춰 학습률을 제어하는 기법입니다. 이 알고리즘은 학습률을 최근에 갱신된 가중치 기울기의 평균으로 나누는 방법입니다.

metrics 는 'accuracy' 를 이용하였으며 이는 훈련 및 시험 중에 모니터링할 측정값입니다.

 

이제 컴파일도 완료 되었으니 fit()함수를 이용하여 학습을 진행해보도록 합시다.

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

epochs 는 학습횟수를 의미합니다. 5를 입력하였으니 총 5번 학습을 반복합니다.

batch_size 는 몇번 학습해보고 해답을 맞출 건지 의미합니다. 즉 , 한번에 128개씩 훈련하는 것입니다.

 

test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)

학습할때의 훈련셋 검증셋의 손실 추이를 보기위한 코드입니다.

위의 사진을 보시면 총 5번 학습 진행하였으며 70000장의 사진중 60000장이 훈련에 사용됬으며 10000장이 검증셋으로 사용되어 테스트 정확도가 0.977로 나타났습니다.

 

참고사이트

https://keras.io/ko/optimizers/#_1

 

Optimizers - Keras Documentation

옵티마이저의 사용법 옵티마이저는 Keras 모델을 컴파일하기 위해 필요한 두 개의 매개변수(parameter) 중 하나입니다. from keras import optimizers model = Sequential() model.add(Dense(64, kernel_initializer='uniform', input_shape=(10,))) model.add(Activation('softmax')) sgd = optimizers.SGD(lr=0.01, de

keras.io

https://tensorflow.blog/4-%ED%85%90%EC%84%9C%ED%94%8C%EB%A1%9C%EC%9A%B0-%EC%8B%B1%EA%B8%80-%EB%A0%88%EC%9D%B4%EC%96%B4-%EB%89%B4%EB%9F%B4-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-first-contact-with-tensorflow/

 

4. 텐서플로우 단일 레이어 뉴럴 네트워크 – First Contact with TensorFlow

이 글은 스페인 카탈루냐 공과대학의 Jordi Torres 교수가 텐서플로우를 소개하는 책 ‘First Contack with TensorFlow’을 번역한 것입니다. 이 글은 원 도서의 라이센스(CC BY-NC-SA 3.0)와 동일한 라이센스를 따릅니다. 파이썬 3  notebook으로 작성한 이 섹션의 코드는 여기에서 보실 수…

tensorflow.blog

 

posted by devtang