컴퓨터가 사물을 보는 방법, CNN 실습 – 3편

지난 포스팅(컴퓨터가 사물을 보는 방법 1편, 2편)에서는 CNN(Convolution Neural Network)에서 사용될 수 있는 다양한 기법들과 함께 CNN의 학습이 어떤 방식으로 이루어지는지 알아보았습니다. CNN은 데이터(특히 이미지 데이터)에 합성곱, 풀링, 패딩 등의 작업을 거쳐 특징을 추출한 후 회귀 또는 분류를 수행하는 딥러닝 모델입니다. 오늘 포스팅에서는 지금까지 배운 기법들을 SAS Viya에서 구현하는 실습을 진행하도록 하겠습니다.

1. proc python을 이용한 CNN

SAS Viya를 사용하면 서버에 파이썬 환경을 손쉽게 설치할 수 있습니다. 환경 설치 후 파이썬 문법을 활용한 코딩을 할 수 있으며, whl 확장자 파일을 이용하여 필요한 패키지를 설치할 수 있습니다. 뿐만 아니라, 서버 라이브러리를 통해 데이터를 불러오거나 데이터를 라이브러리에 저장하는 것도 가능합니다. 본격적으로 SAS Viya의 파이썬 사용법에 대해 알아보도록 하겠습니다.

1.1.  기본 사용법

<코드 1> proc python의 기본 사용법

SAS Viya에서 파이썬 문법을 사용하려면 proc python 구문을 이용해야 합니다. submit은 파이썬 코드 블록의 시작을 의미합니다. 파이썬 코드는 submit과 endsubmit 사이에 작성되어야 합니다. 코드 작성 후 run으로 코드를 마무리 합니다.

<그림 1> 데이터 불러오기

<그림 1>은 proc python 구문을 이용하여 데이터를 불러오는 예제입니다. SAS.sd2df 명령어를 이용하여 sashelp 라이브러리의 cars 테이블을 불러옵니다. 불러온 데이터를 Data 변수에 할당하여 head를 살펴보았습니다. cars 테이블의 컬럼과 행, 데이터를 확인할 수 있습니다. SAS.df2sd(저장할 변수, “라이브러리.테이블명”) 명령어를 이용하면 proc python으로 가공한 데이터 프레임을 SAS 라이브러리에 저장할 수 있습니다.

1.2.  데이터 소개

<그림 2> 데이터 소개

예제로 사용할 데이터는 MNIST 숫자 이미지 데이터셋입니다. MNIST는 0부터 9까지의 한 자리 숫자를 손으로 쓴 이미지로 구성되어 있습니다. 각 이미지는 28x28 픽셀의 흑백 이미지로 되어 있으며, 총 70,000개의 이미지로 구성되어 있습니다. (28x28)의 2차원 데이터를 1x784의 1차원 벡터로 변환한 상태입니다.

1.3.  전처리

이제 본격적으로 파이썬 구문을 이용하여 전처리를 수행해 보도록 하겠습니다. 먼저 1차원 벡터의 데이터를 2차원 이미지로 변형시켜 줍니다. 이 때 사용되는 함수는 reshape입니다. 그리고 0~255의 픽셀값을 0~1로 조정해 줍니다. MNIST 데이터의 마지막 컬럼은 해당 행의 레이블 컬럼입니다. 레이블 값을 labels 변수로 따로 할당하여 줍니다. 그리고 Train, Test 데이터를 8:2 비율로 분류하여 줍니다.

<코드 2> proc python 전처리 코드

1.4.  모델 구성, 컴파일 및 학습

우선 모델의 아키텍쳐를 구성합니다. (28, 28, 1)의 데이터를 입력으로 받아 (3x3)의 커널을 이용하여 합성곱을 진행합니다. 그 후 flatten 함수를 이용하여 1차원 벡터로 변환합니다. Dense 함수를 이용하여 512개의 은닉 노드와 연결된 Fully connected layer를 구성합니다. 그 후 10개의 Softmax 출력층을 생성하여 각 숫자별 확률값을 최종 출력값으로 추출합니다. 다음으로 컴파일 단계에서 정규화 알고리즘, 손실함수, 평가지표 등을 설정합니다. 그 후 전처리 완료된 데이터를 이용하여 학습을 진행합니다. Train 데이터 중 25%를 Validation 데이터로 사용합니다.

<코드 3> proc python 학습 코드

1.5.  모델 평가

<그림 3> Accuracy and Loss 그래프

모델 학습시 history 변수로 저장한 학습 데이터를 이용하여 모델 평가를 할 수 있습니다. Test accuracy는 96%를 기록하였으며 Validation Accuracy를 고려했을 때 epoch은 10회 정도가 적당한 것으로 판단됩니다.

2.     CAS Language를 이용한 CNN

일상적으로 마주치는 회귀, 분류 문제는 1차원 벡터 형태의 데이터입니다. CNN은 이미지 데이터 뿐만 아니라 이런 숫자 데이터에도 적용 가능합니다. 이 때는 1D CNN이 사용됩니다. CAS Language를 이용한 CNN의 예제로 SASHELP 라이브러리에 내장된 BASEBALL 데이터를 이용하여 CNN 회귀를 진행해보도록 하겠습니다. 야구 선수의 안타, 득점, 타점 등의 변수를 이용하여 연봉을 예측하는 문제입니다.

2.1.  데이터 전처리

sashelp에 있는 baseball 테이블을 mycaslib에 생성합니다. 그리고 Train 75%, Validation 25%의 비율로 데이터를 분할합니다.

<코드 4> CAS Language 데이터 전처리

2.2. 모델 아키텍쳐 구성

모델이 저장될 테이블명을 “DLNN”으로 설정합니다. DLNN 테이블에는 모델에 관한 정보와 아키텍처 형태가 저장됩니다. AddLayer 명령어를 이용하여 아키텍처에 레이어를 추가할 수 있습니다. 첫 단계에서는 input layer를 추가합니다. STD 옵션으로 정규화를 할 수 있습니다. type 옵션의 인수로 FULLCONNECT, CONVO 등의 인수를 넣어 은닉층을 추가하거나 act 옵션에 “RELU”를 넣어 활성화 함수를 설정할 수 있습니다.

<코드 5> CAS Language 모델 아키텍쳐 구성

Buildmodel과 AddLayer에서 사용할 수 있는 옵션은 다음과 같습니다. 옵션을 잘 활용한다면 본인만의 아키텍쳐를 구성할 수 있습니다.

<표 1> Buildmodel, Addlayer의 Hyper parameter 설명

2.3. 모델 학습

아키텍처 구성 후 dlTrain 명령어를 이용하여 모델을 학습합니다. 저장되어 있는 “DLNN” 모델을 불러온 후 학습용 데이터로 baseball_part에서 _PARTIND_가 1인 데이터를 이용합니다. _PARTIND_가 2인 데이터는 Validation 데이터로 활용됩니다. modelWeights는 모델의 가중치가 저장되는 테이블 이름을 정의하는 명령어입니다. 모델에 사용할 독립변수들을 inputs의 인수로 설정하여 줍니다. 독립변수 중에 명목형 변수가 있다면 nominals의 인수로 넣어줍니다. 종속변수인 ‘logSalary’를 target의 인수로 지정합니다. optimizer 명령어를 이용하여 미니배치 사이즈, 학습 방법, learning rate와 epoch의 최대치를 설정합니다. 그 후 모델 학습을 진행합니다.

<코드 6> CAS Language 모델 학습

dlTrain과 optimizer에서 사용할 수 있는 옵션은 다음과 같습니다. 학습 설정을 어떻게 하느냐에 따라 모델의 성능이 좋아지거나 나빠질 수 있기 때문에 다양한 조건을 고려하여 설정 값을 조정할 필요가 있습니다.

<표 2> dlTrain, optimizer의 Hyper parameter 설명

<그림 4> 모델 평가 그래프

3. 정리

오늘 포스팅에서는 SAS viya를 이용해 CNN을 구성하는 방법에 대해 알아보았습니다. CNN은 이미지 데이터에 특화되어 있지만 숫자 데이터를 이용한 회귀, 분류 문제도 해결할 수 있습니다. SAS Viya에서 CNN을 구성하는 방법에는 크게 두 가지가 있습니다.

첫 번째는 proc python 구문을 이용하여 파이썬 코드를 작성하는 방법입니다. Viya 서버에 파이썬과 패키지를 설치한 후 이용 가능합니다. 파이썬 문법을 활용 가능하기 때문에 파이썬에 익숙한 유저라면 어려움 없이 접근할 수 있습니다.

두 번째는 SAS Viya에서 제공하는 CAS(Cloud Analytics Server) Language를 이용하는 방법입니다. 파이썬 문법과 비슷하게 모델을 선언한 후 레이어를 쌓아가는 방식으로 코드를 작성할 수 있습니다. optimizer 옵션을 설정한 후 학습을 진행할 수 있습니다.

지금까지 CNN의 이론과 실습에 대해 살펴보았습니다. 세 편의 포스팅을 통해서 CNN에 대해 조금이나마 이해하셨기를 바랍니다. 감사합니다.