이번 글에서는 딥러닝 모델 구현코드의 기본 형태를 알아보겠습니다.
사용언어는 파이썬이며 딥러닝용 라이브러리는 Tensorflow에 포함된 Keras를 기본으로 합니다.
차후 PyTorch를 이용한 실습코드도 다룰 예정이니 필요하신 분은 그 때 참고해 주세요.
그리고 파이썬 및 기타 기본 라이브러리(numpy, pandas, matplotlib 등)의 사용법은 프로그래밍 카테고리에서 다룰 예정이니 그 쪽에서 확인해 주세요.
설명의 수준은 프로그래밍 입문자, 초보자를 기준으로 합니다.
그럼 딥러닝 모델의 기본 형태를 살펴보도록 하죠.
import numpy as np
from tensorflow import keras
from tensorflow.keras import optimizers
from tensorflow.keras.layers import Dense, Input
model = keras.Sequential()
model.add(Input(1))
model.add(Dense(10, activation='tanh'))
model.add(Dense(10, activation='tanh'))
model.add(Dense(1))
model.compile(optimizer="SGD", loss="mse")
x = np.arange(-1,1,0.01)
y = x**2
model.fit(x, y, epochs=1000, verbose=0, batch_size=20)
result_y = model.predict(x)
아주 간단하죠?
위의 코드가 가장 기본적인 코드입니다.
그럼 하나하나 설명을 드리겠습니다.
import numpy as np
numpy는 파이썬에서 가장 많이 사용되는 라이브러이의 하나입니다.
다양한 수치계산에 관련된 기능들을 제공합니다.
코드 구현 시에 상당히 자주 호출되기때문에 일반적으로 np라는 새 이름을 지정하여 호출합니다.
위의 구문은 이러한 numpy 라이브러리를 np라는 보조이름을 지정한 후 코드에 포함시키겠다.. 라는 의미입니다.
파이썬은 다양한 라이브러리의 지원이 강점이므로 이 외에도 많은 라이브러리들을 import(포함)하여 사용할 것입니다.
from tensorflow import keras
from tensorflow.keras import optimizers
from tensorflow.keras.layers import Dense, Input
역시 라이브러리를 import하기 위한 구문입니다.
이번 코드에서 tensorflow와 Keras를 import 합니다.
원래 Keras는 Tensorflow와 별개로 개발된 라이브러리이지만 지금은 Tensorflow에 포함되었습니다.
이번 구문은 앞에서 본 import 구문과 형태가 다르죠.
from [A] import [B] 구문은 A라는 라이브러리에서 B라는 모듈을 import하겠다.. 라는 의미입니다.
그럼 첫 줄의 의미는 tensorflow 라이브러리에서 keras모듈을 import하겠다..라고 이해할 수 있겠죠.
두 번째 줄은 tensorflow 라이브러리의 keras 모듈에서 오류 보정을 통해 가중치를 갱신하기 위한 함수로 사용되는 SGD(Stochastic Gradient Discent, 확률적 경사하강법) 등이 구현된 optimizers 모듈을 끄집어내어서 import 하겠다.. 라는 의미가 되겠군요(말이 길군요..).
마찬가지 방식으로 세 번째 줄은 tensorflow 라이브러리의 keras 모듈에 포함된 layers 모듈에서 Dense와 Input 이라는 레이어의 구현 모듈을 끄집어내어서 import 하겠다..는 뜻입니다.
Dense는 빽빽한, 가득 찬.. 등의 의미를 가진 단어로 tensorflow.keras.layers에서 제공하는 완전연결층(Fully Connected Layer)을 구현한 레이어 모듈입니다.
Input은 말 그대로 입력을 위한 레이어 모듈이죠.
이렇게 해서 기본적으로 사용할 라이브러리와 모듈들을 모두 코드에 포함시켰습니다.
그럼 이제 딥러닝 모델을 구성해야 되겠죠.
model = keras.Sequential()
model.add(Input(1))
model.add(Dense(10, activation='tanh'))
model.add(Dense(10, activation='tanh'))
model.add(Dense(1))
먼저 keras가 제공하는 Sequential 이라는 클래스로 model 이라는 변수를 하나 만듭니다.
이 model 이 우리가 구현할 딥러닝 모델의 형태가 됩니다.
처음 만들어진 model 변수는 형태만 잡혀있는 텅 빈 모델입니다.
keras.Sequential 모델은 레이어의 스택을 순서대로 만들어서 적용하는 모델인데 여기에 add 함수를 통해서 다양한 층, 즉 레이어를 순서대로 하나씩 스택에 채워넣도록 합니다.
우리가 만들고자 하는 모델은 노드가 1개인 입력층 1개, 그리고 노드(퍼셉트론)가 10개인 은닉층이 2개(여기서 은닉층은 완전연결층으로 하겠습니다), 마지막으로 출력을 위한 노드 1개의 출력층 1개로 구성할 것입니다.
그리고 은닉층의 각 레이어들은 활성화함수로 tanh를 사용하도록 합니다.
이렇게 모델의 구성이 끝났습니다.
이번엔 이제 막 구성한 모델을 사용할 수 있도록 컴파일을 시킵니다.
model.compile(optimizer="SGD", loss="mse")
일반적인 경우, 프로그래밍에서 컴파일한다는 것은 사람이 작성한 프로그램 코드를 기계인 컴퓨터가 이해할 수 있는 기계어로 번역, 변환하는 것을 말하죠.
여기서 사용하는 model.compile 도 사용목적은 같습니다.
단 기계어로 번역하라는 의미보다는 해당 모델은 어떤 최적화함수(Optimizer)를 사용하고 어떤 손실함수(Loss Function)를 사용할 것이지를 지정하여 이 후에는 model을 바로 동작시킬 수 있도록 만드는 것입니다.
compile 함수에서는 optimizer, loss 외에도 처리 과정에 어떤 일이 발생했는지 보여주는 Log기 기록된 metrics를 지정할 수 있습니다.
세 가지를 모두 지정하는 코드는 아래와 같습니다.
model.compile(optimizer="SGD", loss="mse", metrics=["accuracy"])
metrics에는 Log로 저장하려는 여러가지 값을 지정할 수 있습니다(그래서 배열형태로 주어집니다).
컴파일도 끝났으니 이제 필요할 때마다 호출해서 원하는 기능을 실행하기만 하면 됩니다.
실행하기 전에 학습, 검증, 테스트 등에 사용할 데이터를 지정해야 되겠죠.
일반적으로 제일 앞쪽에 데이터를 준비하는 코드를 많이 배치합니다만.. 여기선 설명의 흐름을 위해서 실제 사용하는 시점 바로 앞에 배치했습니다.
x = np.arange(-1,1,0.01)
y = x**2
입력데이터 x는 "-1"부터 "1"사이의 값을 0.01 간격으로 배열(Array)를 생성하여 사용합니다.
배열의 생성을 위해서 numpy (np로 표시)의 arange 함수를 사용했습니다.
arange 함수는 범위(range) 안의 값을 배열(array)로 만들라는 명령입니다.
결과 비교를 위한 정답지, 즉 우리가 원하는 기대값인 y는 x제곱을 값으로 가지는 2차방정식이네요.
데이터가 설정되었으니 모델의 학습을 시작합니다.
model.fit(x, y, epochs=1000, verbose=0, batch_size=20)
모델의 학습은 "fit"이라는 함수를 사용합니다.
강의 중에 딥러닝 모델은 엄밀히 말하면.. 또는 다르게 표현하면 최적화 함수라고 설명드렸었죠?
같은 의미라고 보시면 되겠네요.
모델에 입력데이터와 출력데이터를 주고 원하는 결과가 나오도록 모델을 딱 맞춰라.. 최적화 시켜라.. (fit)라는 의미라고 보시면 이해가 쉬울 것입니다.
입력 데이터는 x, 기대 출력 데이터는 y로 지정했습니다.
epochs는 모델의 학습에 몇 epoch을 지정할 것인가.. 를 의미하는데 1 epoch이란 입력된 모든 데이터를 1번 학습 완료시킨 것을 말합니다.
epochs=1000 이라고 했으니 모든 데이터를 총 1000번 반복해서 학습시키라는 의미가 되죠.
verbose는 학습 과정에서 진행 내용을 출력하기 위한 모드를 설정합니다.
0은 출력안함, 1은 Progress Bar(진행바)로 출력, 2는 각 epoch마다 한 줄씩 출력하라는 의미입니다.
필요에 따라서 선택하시면 됩니다.
batch_size는 몇 개의 데이터를 학습하고 가중치를 갱신할 것인지를 지정하는 변수입니다.
batch_size=20 이라면 20개의 데이터를 학습할 때마다 가중치를 갱신하라는 것입니다.
기본값은 32입니다.
이제 학습이 끝났으니 테스트를 해 봐야겠죠.
result_y = model.predict(x)
model에 x라는 데이터를 넣고 그 결과를 예측해 보라는 명령입니다.
사실은 여기에 학습에서 사용되었던 x를 넣으면 안되고 테스트, 또는 실제로 사용할 데이터를 넣어야 하는데 일단 따로 만들어놓지 않았기 때문에 그냥 x를 사용했습니다.
단지 딥러닝 모델의 구현 기본 형태를 익히기 위한 것이니 그렇게 이해해 주세요.
그럼 마지막으로 결과를 확인해 보겠습니다.
plt.scatter(x,y) # 정답
plt.scatter(x,y_,color='r') # 결과
plt.show()
파란 선은 정답, 빨간 선은 예측값입니다.
비슷하게 나왔죠?
그래프를 그리는 코드는 프로그래밍 카테고리에서 다룰 예정이니 그 쪽에서 확인해 주세요.
이것으로 딥러닝 모델의 기본 형태를 살펴보았습니다.
'AI 기반 기술' 카테고리의 다른 글
[AI 실습] AI & 딥러닝 실습 코드 개발 및 공유 (0) | 2020.12.04 |
---|---|
CNN 모델 구현코드의 기본형태를 알아보자(with Keras) (0) | 2020.12.03 |
구글 Colab을 이용해서 실습을 해 봅시다. (0) | 2020.11.25 |
딥러닝 서버 환경 구축(4): 텐서플로우 2.x를 위해서 그냥 virtualenv로.. (0) | 2020.09.15 |
딥러닝 서버 환경 구축(3): 텐서플로우 2.x 와 아나콘다-주피터노트북의 문제점 (0) | 2020.09.13 |