반응형

오늘은 AI의 대표적인 데이터셋인 MNIST를 이용하여

손글씨 숫자 이미지를 인식하는 실습을 해보고자 한다.

 

스마트폰 앱에서 글씨를 캡쳐하면 실제 데이터로 변형되어 출력되는 것을 본적이 있을 것이다.

오늘은 이런 것이 어떻게 가능한 것인지 알아보고, 실습하는데 목적을 둔다.

 

*추후 모델과 기초 개념에 대해서도 다룰 예정이다.


0. 목표

우리는 위 숫자가 '8'이란 것을 안다. 어떻게 알게 되었는가?

 

어렸을 때 우린 1부터 9까지 숫자들의 모양을 학습하였고,

위 이미지와 우리가 알고있는 모양인 숫자 8과 일치시켜 답을 내놓을 수 있었을 것이다.

 

컴퓨터로는 어떻게 위 이미지를 인식하여 데이터를 처리할 수 있을까?

 

우리는 해당 포스팅을 통해 '손글씨 숫자 이미지를 인식하여 예측'해보는 모델을 만들어보고자 한다.

  • 1부터 9까지의 데이터를 학습하여 손글씨 이미지를 예측할 수 있는 '모델'을 만들고
  • 임의의 손글씨 이미지를 만들어 이 그림이 어떠한 숫자를 의미하는지 예측해 볼 것이다.

*참고로 이미지 데이터를 처리할때 높은 정확도를 도출하기 위해 CNN 방식을 많이 사용하지만 본 포스팅에선 CNN을 중점적으로 다루지 않는다. 추후 다룰 예정이다.

 


1. MNIST 데이터 셋

이번 포스팅에서도 다시 얘기하지만 Deep Learning의 핵심은 '좋은 데이터'이다.

 

이번은 AI에서 대표적인 손글씨 데이터 셋인 MNIST 데이터 셋에 대해 이야기해보겠다.

 

MNIST Dataset


MNIST는 다음과 같은 특징을 갖는다.

  • 대표 데이터 셋인 만큼 import하여 손쉽게 데이터를 불러올 수 있다.
  • 60,000개의 학습 데이터, 10,000개의 테스트 데이터로 나뉘어 있다.
  • 각 이미지는 28x28 크기로 784개의 픽셀을 가진다.

(1) 데이터를 불러오는 방법은 다음과 같다.

from keras.datasets import mnist


(2) 데이터 갯수는 다음과 같다.

(X_train, Y_class_train), (X_test, Y_class_test) = mnist.load_data()
print("학습셋 이미지 수 : %d 개" % (X_train.shape[0]))
print("테스트셋 이미지 수 : %d 개" % (X_test.shape[0]))

  • 첫번째 라인에서 X_train에는 학습할 60,000개의 각 784개 픽셀 정보가 배열 형태로 저장되게 되고
  • Y_class_train에는 60,000개 이미지 정답인 클래스 정보가 담기게 된다.
  • X_test와 Y_class_test는 테스트 데이터로 10,000개이고 형태는 위 학습데이터와 같다.

(3) 다음은 데이터 형태이다(X_train 데이터의 첫번째 원소).

# 이미지 형태 출력을 위한 pyplot 모듈 import
import matplotlib.pyplot as plt
# 위 60000개 데이터 배열에서 0번째 원소를 흑백으로 출력
plt.imshow(X_train[0], cmap='Greys')
plt.show()

################################

# 0번째 원소의 모든 데이터를 출력
for x in X_train[0]:
    for i in x:
        sys.stdout.write('%d  ' % i)
    sys.stdout.write('\n')

  • 위 그림을 보면 가로 28개 픽셀, 세로 28개 필셀의 집합으로 하나의 그림이 만들어 진 것을 볼 수 있다.
  • 흰색은 0, 검정색은 255 이렇게 각 픽셀의 색상을 데이터화하여 X_train의 원소에 담겨져 있는 것이다.

 

 


2. Training

# 딥러닝에 필요한 케라스 함수 호출
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense

# 필요 라이브러리 호출
import numpy
import tensorflow as tf

# 데이터 셋 호출
from keras.datasets import mnist

# 실행 시마다 같은 결과값 도출을 위한 시드 설정
numpy.random.seed(0)
tf.random.set_seed(0)

# 데이터를 불러와서 각 변수에 저장
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

# 학습에 적합한 형태로 데이터 가공
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255

# 클래스를 학습에 이용하기 위해 데이터 가공
Y_train = np_utils.to_categorical(Y_train, 10)
Y_test = np_utils.to_categorical(Y_test, 10)

# 딥러닝 모델 구조 설정(2개층, 512개의 뉴런 연결, 10개 클래스 출력 뉴런, 784개 픽셀 input 값, relu와 softmax 활성화 함수 이용)
model = Sequential()
model.add(Dense(512, input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))

# 딥러닝 구조 설정(loss 옵션을 다중 클래스에 적합한 categorical_crossentropy, 옵티마이저는 adam 설정)
model.compile(loss='categorical_crossentropy', optimizer='adam',
              metrics=['accuracy'])

# 모델 실행(X_test, Y_test로 검증, 200개씩 30번 학습)
model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, batch_size=200, verbose=2)

# 학습 정확도, 검증 정확도 출력
print('\nAccuracy: {:.4f}'.format(model.evaluate(X_train, Y_train)[1]))
print('\nVal_Accuracy: {:.4f}'.format(model.evaluate(X_test, Y_test)[1]))

# 모델 저장
model.save('Predict_Model.h5')

 

다음 부분에 설명이 필요할 것이다.

  • X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
  • 학습을 위해 각 데이터는 0-255에서 0-1사이의 숫자로 변환해야한다. 그래서 위 연산을 수행한다.
  • 위 함수를 아래 3줄로 풀어 출력하면 다음과 같다. 천천히 이해를 해보기 바란다.

  • np_utils.to_categorical(Y_train, 10)
  • 해당 클래스 정보도 0-10 값을 0, 1, 2, 3~~ 이렇게 저장할 수 있지만 앞서 말했듯이 0, 1값으로 저장해야 원할한 데이터 처리가 가능하다.
  • 5를 표현하기 위해 클래스 갯수를 가지는 리스트를 만들어 5번째 원소에만 1을 주는 방식으로 one-hot vector화하는 함수다.

 

이후 학습을 진행한다.

CNN을 사용하지 않았지만 높은 정확도를 보였다. 검증 정확도가 98%이다.

 

 

해당 모델은 다음과 같이 잘 저장되었다.

 

 

 


3. Testing

테스트를 위해 이미지를 하나 만들어보았다.

픽셀을 28x28로 만들고(어차피 resize해서 필요없긴하나 편의를 위해), 붓으로 숫자 8을 그려보았다.


이제 jupyter notebook에 업로드하고 다음과 같이 코딩한다.

# 딥러닝에 필요한 케라스 함수 호출
from keras.models import load_model
from keras.utils import np_utils

# 필요 라이브러리 호출(PIL은 이미지파일 처리위함)
from PIL import Image
import numpy as np

# test.png는 그림판에서 붓으로 숫자 8을 그린 이미지 파일
# test.png 파일 열어서 L(256단계 흑백이미지)로 변환
img = Image.open("test.png").convert("L")

# 이미지를 784개 흑백 픽셀로 사이즈 변환
img = np.resize(img, (1, 784))

# 데이터를 모델에 적용할 수 있도록 가공
test_data = ((np.array(img) / 255) - 1) * -1

# 모델 불러오기
model = load_model('Predict_Model.h5')

# 클래스 예측 함수에 가공된 테스트 데이터 넣어 결과 도출
res = model.predict_classes(test_data)
# 2021/10/02 수정 - 오류시 아래 명령어로 대체 가능합니다.
# res =(model.predict(test_data) > 0.5).astype("int32")

print(res)

 

출력 결과는 다음과 같다.

정확히 예측에 성공하였다.

학습 데이터가 좋아 쉽게 성공하였는데 이후에 CNN을 이용하여 실습해 보겠다.

 

 


4. 블랙박스 부수기

현재 우리는 블랙박스를 부수지 못하고있다.

인식, 예측엔 성공했지만 '어떻게' 이것이 가능한지는 원리적으로 알지 못한다.

아직 model.add(Dense(~~)) 부분도 상세히 설명하지 않았다.

 

해당 포스팅은 딥러닝이란 분야에 흥미를 불러일으키기 위한 목적을 가진다.

 

이후 글부터 '어떻게'에 초점을 맞추어 활성화 함수부터 모델에 대한 전반적인 개념에 대한 포스팅을 진행할 예정이다.

그리고 다시 해당 포스팅으로 돌아오면, 안보이던 코드(블랙 박스)가 하나하나 보이기 시작할 것이다.

 


같이 공부해요 ㅎㅎ

반응형
반응형

오늘은 공부한 것을 토대로 직접 테스트 데이터도 추가하여

폐암 환자의 수술 후 생존 여부를 예측해볼 것이다.

 

*추후 모델과 기초 개념에 대해서도 다룰 예정이다.


0. 목표

머신러닝은 '알고리즘을 이용하여 데이터를 분석하고, 학습하여 이러한 내용을 기반으로 판단, 예측하는 기술' 이다.

 

딥러닝도 머신러닝 범주에 속해있으며 우린 이를 이용해 미래의 일을 예측해보고자 한다.

 

이런 예측하는 기술은 어디에 사용할 수 있을까?

 

본 포스팅에서는 '폐암 환자의 수술 후 생존 여부'을 예측해보고자 한다.

  • 기존의 폐암 환자 데이터를 학습하여 수술 후 생존 여부를 예측할 수 있는 '모델'을 만들고
  • 가상의 환자 데이터(미래)를 만들어 수술 후 생존 여부를 예측해 볼 것이다.


 


1. 폐암 환자 데이터

AI에서 가장 중요한 부분이자 기반이 되야 하는 것이 '좋은 데이터'이다.

 

폐함 환자 생존률 데이터는 '모두의 딥러닝' 예제의 [ThoraricSurgery.csv]를 사용하였고,

직접 [test.csv]를 만들어 가상의 환자를 만들어 보았다.

* ThoraricSurgery.csv : 구글에 치면 다운받을 수 있는 깃허브 주소가 나온다.

 

[ThoraricSurgery.csv] 데이터의 구조를 살펴보자.

  • 데이터에는 470명의 환자 정보가 들어있다.
  • '속성' 정보는 [종양 유형, 폐활량, 기침, 흡연 여부 등] 각각의 17개의 환자의 정보가 담겨있다.
  • '클래스'에는 [수술 후 생존, 사망 여부] 정보가 담겨 있다.

[test.csv] 데이터 구조도 살펴보자.

  • 글쓴이가 만든 가상의 환자 정보이다.
  •  '속성' 정보는 [종양 유형, 폐활량, 기침, 흡연 여부 등] 위와 같이 17개의 환자의 정보가 담겨있다.
  • '클래스'[수술 후 생존, 사망 여부] 정보는 우리가 모델을 통해 예측해볼 것이다!


 


2. Training

# 딥러닝에 필요한 케라스 함수 호출
from keras.models import Sequential, load_model
from keras.layers import Dense

# 필요 라이브러리 호출
import numpy as np
import tensorflow as tf

# 실행 시마다 같은 결과값 도출을 위한 시드 설정
np.random.seed(0)
tf.random.set_seed(0)

# csv 파일을 읽어 ','기준으로 나눠 Dataset에 불러오기
Dataset = np.loadtxt("ThoraricSurgery.csv", delimiter=",")

# 환자 정보는 0-16번(17개)까지이므로 해당 부분까지 X에 담기
X = Dataset[:, 0:17]
# 수술 후 결과는 마지막 17번은 클래스로 Y에 담기
Y = Dataset[:, 17]

# 딥러닝 모델 구조 설정(3개층, 속성이 17개 input 값, relu와 sigmoid 활성화 함수 이용)
model = Sequential()
model.add(Dense(30, input_dim=17, activation='relu'))
model.add(Dense(15, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 딥러닝 실행(오차함수는 평균제곱오차, 최적화함수는 adam 이용)
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=30, batch_size=5)

# 만들어진 모델 저장
model.save('Predict_Model.h5')

 

중간에 Dataset을 출력한 사진이다.

다음과 같이 470명 환자의 17가지 정보가 들어간 이중 리스트가 만들어졌다.

 

중간 X와 Y를 출력한 사진이다.

X엔 환자 정보가, Y엔 마지막 컬럼인 생존여부부분이 들어간 것을 볼 수 있다.

 

모델의 정확도이다.

5개 단위(batch-size)로 30번(epochs) 학습시켜 85.74% 정확도를 가진 모델을 만들었다.

 

그리고 다음과 같이 잘 저장되었다.


3. Testing

# 딥러닝에 필요한 케라스 함수 호출
from keras.models import load_model
from keras.utils import np_utils

# 필요 라이브러리 호출
import numpy as np

# csv 파일을 읽어 ','기준으로 나눠 Dataset에 불러오기
Dataset = np.loadtxt("test.csv", delimiter=",")

# 환자 정보는 0-16번(17개)까지이므로 해당 부분까지 X에 담기
X = Dataset[:, 0:17]
# 수술 후 결과 정보인 예측값 변수 초기화
Y = []

# 모델 불러오기
model = load_model('Predict_Model.h5')

# X 값에 대한 predict_classes 함수 실행결과 Y에 저장
Y = model.predict_classes(X)

print('Predict : ', Y)

 

중간 Dataset 변수를 출력한 사진이다.

3명의 가상 환자 정보가 잘 들어간 것을 알 수 있다.

 

마지막 예측 결과 사진이다.

3명의 가상 환자에 대해 다음과 같은 결과를 도출했다.

  • 1번 가상 환자 : 수술 후 사망 예상
  • 2번 가상 환자 : 수술 후 사망 예상
  • 3번 가상 환자 : 수술 후 생존 예상

이라는 결과를 내놓았다.


4. 신뢰성

여기서 한가지 밝힐 사실이 있다.

이 가상 환자 세명은 사실 [ThoraricSurgery.csv] 데이터의 환자의 정보를 참고하여 만들었다.

두명은 수술 후 사망했던 환자 정보유사한 속성 정보를 집어넣었고

마지막 한명은 수술 후 생존했던 환자 정보유사하게 속성 정보를 집어넣었다.

 

보시다시피 결과는 예상과 같았다.

이러한 결과는 모델에 대한 정확도를 보여주는 또 한가지의 지표가 되었다.


 

AI를 이용하면 다음과 같이 기존 데이터를 이용해 미래의 일을 예측해볼 수 있다.

하지만 그만큼 어려운 분야인 만큼 많은 공부를 필요로 한다.

계속해서 공부해나가다 보면 우리 모두 좋은 성과를 도출해낼 수 있을 것이다.

반응형
반응형

당분간 딥러닝 관련 포스팅을 진행할 예정이다.

기초부터 원리, 실데이터를 이용한 실습까지 차근차근 진행해볼 예정이다.

딥러닝 공부를 위한 실습 환경 조성부터 진행해보자.


0. 환경 확인

 본인은 Windows 10 64bit 기준으로 설명한다.

실습시 GPU는 이용하지 않고 CPU를 이용할 예정이다.


1. 아나콘다 설치

  • 아나콘다3를 설치한다.

  • Add Anaconda3 to my PATH enviroment variable을 체크해줘서 환경변수 설정을 해주자.

  • 시작 - 검색에 anaconda를 검색하여 나타나면 설치가 완료된 것이다.

 


2. 텐서플로, 케라스 설치

  • Anaconda Prompt를 '관리자 권한으로 실행'한다.

  • 환경을 생성한다.
    > conda create -n [작업환경명] python=[버전] [필요라이브러리명], ...
    > ex:) conda create -n saynot python=3.8 numpy pandas matplotlib spyder 

  • 환경을 활성화한다.
    > activate [작업환경명]

  • 텐서플로를 설치한다.
    > pip install tensorflow

  • 텐서플로가 제대로 설치되었는지 확인한다.
    > python - import tensorflow as tf - print(tf.__version__) 입력 시 버전 출력되면 설치 확인

  • 케라스를 설치한다.
    > pip install keras

  • 케라스가 잘 설치 되었는지 확인한다.
    > python - import keras 입력 시 Using TensorFlow backend 문구나 에러문구 출력안되면 설치완료

 


3. 주피터 노트북 설치

마지막으로 주피터 노트북을 설치해서 코딩 환경을 조성한다.

  • 주피터 노트북 설치한다.
    > pip install jupyter

  • 주피터 노트북을 실행한다.
    > jupyter notebook
    > 메모장 or 페이지 or 도스상에 주피터 노트북 링크가 뜨게 되는데 해당 링크를 복사하여 크롬에 붙여넣기한다.

  • 주피터 노트북 페이지 접속하여 테스트해보기.
    > New - Python 3
    > 라인에서 파이썬 코드 입력후 Run 클릭

  • 저장 버튼은 항상 필수!!



4. 추후 접속 시

  • Anaconda Prompt (관리자 권한 실행) - activate [작업환경명] - jupyter notebook 순으로 접속하면 된다.

이제 실습환경 구축이 끝났으니 다음 챕터부터 딥러닝을 본격적으로 공부해 보겠다.

저작권 및 오타 지적 환영!

 

반응형
반응형

본인은 BoB 프로젝트 도중 딥러닝을 이용하는 프로젝트를 진행하였다.

관련 지식을 공부하던 중 AI에 대한 흥미가 생겨 앞으로 관련된 포스팅을 여럿 해보고자 한다.


1. 개요

 다들 아시다 싶이 현재는 바야흐로 AI 전성시대이다.

많은 제품들에서 AI를 사용하고 있으며, 앞으로는 더 많아질 것이다.

일반 제품뿐만아니라 안랩, 이스트시큐리티에서도 AI 스타트 기업을 인수하거나

AI를 적용한 백신을 출시하는 등 관심도가 높아지고 있다.

 

컨퍼런스에서도 이를 알 수 있는데, 최근 기술, 보안 컨퍼런스만 보아도 AI에 대한 다양한 주제를 다루고 있다.

 

왼쪽부터 2019 삼성SDS컨퍼런스, 삼성테크토닉컨퍼런스, 데프콘 컨퍼런스

이처럼 많은 영역에선 인공지능에 대해 다루고, 연구하고 있다.

슬픈 이야기지만 앞으로 우리들이 AI를 공부하지 않으면 조금씩 뒤쳐질 것이라 생각한다.

이제부터 우리는 AI가 무엇이고, 인공지능과 딥러닝이 무엇인지 알고있어야한다.

본 포스팅에선 이를 '간략히' 설명하고자한다.

 

 

2. 인공지능

인공지능 용어 창안자(위키피디아)

"인공지능? 뭔가 먼 미래의 기술같아."

 

인공지능(Artificial Intellignece)은 사실 최근에 등장한 개념이 아니다. 1956년에 존매카시 교수가 개최한 다트머스 회의에서 처음 등장한 개념이며, 지금까지 계속된 연구활동 끝에 최근들어 주목받게 된것이다.

 

인공지능은 다양한 정의가 존재하며 '사람의 지능을 필요로하는 작업을 수행할 수 있는 컴퓨터 시스템'이라고 보면 된다.

이후 연구 활동이 지속되며 다양한 방법론이 등장하였고 이 과정에서 등장한 것이 머신러닝과 딥러닝이다.



3. 머신러닝

머신러닝은 '알고리즘을 이용하여 데이터를 분석하고, 학습하여 이러한 내용을 기반으로 판단, 예측하는 기술'을 뜻한다.

일반적인 프로그램은 직접 과정에 대한 코딩을 진행하여, 결과를 얻어내지만 머신러닝은 그렇지 않다.

 

그림으로 설명하면 다음과 같다.

기존 프로그래밍에선 데이터를 가지고 프로그래밍을 하여 답이란 결과를 얻어낸다.

하지만 머신러닝은 데이터와 답을 가지고 학습하고 교육하여 규칙을 도출해낸다.

그래서 이 규칙을 가지고 향후 새로운 데이터에 대해 규칙을 적용하여 예측하고 판단하는 결과를 낼 수 있다.


4. 딥러닝

딥러닝은 머신러닝연구자들이 만들어낸 하나의 개념이다.

딥러닝은 우리들 '뇌의 뉴련의 형태 정보 입출력 계층을 만들어 데이터를 학습하는 방식'이다.

인공신경망에서 발전한 형태라 보면 된다.

 

물론 처음에 엄청난 데이터량과 연산을 필요로하여 관련된 연구가 활발하지 않았다.

그러나 최근 하드웨어 성능과 알고리즘, 인터넷에 대한 빠른 발전으로 딥러닝 연구가 활기를 찾았다.

이러한 과정에서 CNN(Convolutional neural network), RNN(Recurrent Neural Network) 등 다양한 신경망 알고리즘이 등장하여 지금까지도 연구되고 있다.

 

 

심층적이고 논리적인 구조로 여러번의 과정과 학습을 거치는 기술인 만큼 높은 예측, 판단률(정확도)를 보이고 있다.

AI 기술의 핵심은 정확한 예측, 판단률이다. 그래서 현재 딥러닝이 가장 주목을 받고 있다.

 

5. 마치며

이제 우리는 딥러닝이 머신러닝에서 파생된 것이고, 머신러닝은 미래를 예측하고 판단하기 위한 기술이라는 것을 알았다. 현재 이러한 기술을 통해 글자인식, 목소리 인식이 가능하며 암을 예측하고, 심지어 폐 사진으로 코로나를 진단하고 있다.

 

 

이처럼 우리도 각자 이러한 기술을 어디에 사용할 수 있을지 고민해보는 시간을 가졌으면 좋겠다.


앞으로 계속해서 AI 관련 포스팅을 진행할 것이다.

반응형

+ Recent posts