3.2 케라스 소개

3. 신경망 시작하기 | 목차 | 3.3 딥러닝 컴퓨터 셋팅

 

이 책에서는 코드 예제를 위해 케라스(https://keras.io)7를 사용합니다. 케라스는 거의 모든 종류의 딥러닝 모델을 간편하게 만들고 훈련시킬 수 있는 파이썬을 위한 딥러닝 프레임워크입니다. 처음에 케라스는 신속하게 실험을 해야 하는 연구자들을 위해 개발되었습니다.

케라스의 특징은 다음과 같습니다.

  • 동일한 코드로 CPUGPU에서 실행할 수 있습니다.
  • 사용하기 쉬운 API를 가지고 있어 딥러닝 모델의 프로토타입을 빠르게 만들 수 있습니다.
  • (컴퓨터 비전을 위한) 합성곱 신경망, (시퀀스 처리를 위한) 순환 신경망을 지원하며 이 둘을 자유롭게 조합하여 사용할 수 있습니다.
  • 다중 입력이나 다중 출력 모델, 층의 공유, 모델 공유 등 어떤 네트워크 구조도 만들 수 있습니다. 이 말은 적대적 생성 신경망Generative Adversarial Network, GAN부터 뉴럴 튜링 머Neural Turing Machine까지 케라스는 기본적으로 어떤 딥러닝 모델에도 적합하다는 뜻입니다.8

케라스는 MIT 라이선스를 따르므로 상업적인 프로젝트에도 자유롭게 사용할 수 있습니다. ( 2018년 중반 현재) 파이썬 2.7에서 3.6까지의 어떤 버전과도 호환됩니다.

학술적인 연구원이나 스타트업과 대기업의 기술자에서 대학원생과 아마추어 연구자까지 20만 명의 사람들이 케라스를 사용합니다. 구글, 넷플릭스Netflix, 우버Uber, 썬CERN, 옐프Yelp, 스퀘어Square 그리고 다양한 분야의 스타트업 수백 개가 케라스를 사용합니다. 머신 러닝 경연 웹 사이트인 캐글Kaggle에서도 케라스의 인기가 높습니다. 최근에 거의 모든 딥러닝 경연 대회의 우승자들이 케라스 모델을 사용하고 있습니다.

097

그림 3-2 딥러닝 프레임워크에 대한 구글 웹 검색 트렌드9

3.2.1 케라스, 텐서플로, 씨아노, CNTK

케라스는 딥러닝 모델을 만들기 위한 고수준의 구성 요소를 제공하는 모델 수준의 라이브러리입니다. 텐서 조작이나 미분 같은 저수준의 연산을 다루지 않습니다. 그 대신 케라스의 백엔드 엔진backend engine에서 제공하는 최적화되고 특화된 텐서 라이브러리를 사용합니다. 케라스는 하나의 텐서 라이브러리에 국한하여 구현되어 있지 않고 모듈 구조로 구성되어 있습니다(그림 33 참고). 여러 가지 백엔드 엔진이 케라스와 매끄럽게 연동됩니다. 현재는 텐서플로, 씨아노, 마이크로소프트 코그니티브 툴킷Microsoft Cognitive Toolkit, CNTK 3개를 백엔드 엔진으로 사용할 수 있습니다. 향후에는 더 많은 딥러닝 엔진을 케라스에서 사용할 수 있을 것입니다. 10

098

그림 3-3 딥러닝 소프트웨어와 하드웨어 스택

텐서플로, CNTK, 씨아노는 딥러닝을 위한 주요 플랫폼 중 하나입니다. 씨아노(http://deeplearning.net/software/theano)는 몬트리올 대학 MILA 연구소에서 개발했고,11 텐서플로(https://www.tensorflow.org)는 구글에서 개발했으며, CNTK(http://github.com/Microsoft/CNTK)는 마이크로소프트에서 개발했습니다. 케라스로 작성한 모든 코드는 아무런 변경 없이 이런 백엔드 중 하나를 선택해서 실행시킬 수 있습니다. 개발하는 중간에 하나의 백엔드가 특정 작업에 더 빠르다고 판단되면 언제든지 백엔드를 바꿀 수 있어 아주 유용합니다. 가장 널리 사용되고 확장성이 뛰어나며 상용 제품에 쓸 수 있기 때문에 대부분의 딥러닝 작업에 텐서플로 백엔드가 기본으로 권장됩니다.

텐서플로(또는 씨아노나 CNTK)를 사용하기 때문에 케라스는 CPUGPU에서 모두 작동할 수 있습니다. CPU에서 실행될 때 텐서플로는 Eigen(http://eigen.tuxfamily.org)이라고 불리는 저수준 텐서 연산 라이브러리를 이용합니다. GPU에서는 NVIDIA CUDA 심층 신경망 라이브러리cuDNN라고 불리는 고도로 최적화된 딥러닝 연산 라이브러리를 이용합니다.

3.2.2 케라스를 사용한 개발: 빠르게 둘러보기

이미 케라스 모델의 예로 MNIST 예제를 보았습니다. 전형적인 케라스 작업 흐름은 이 예제와 비슷합니다.

  1. 입력 텐서와 타깃 텐서로 이루어진 훈련 데이터를 정의합니다.
  2. 입력과 타깃을 매핑하는 층으로 이루어진 네트워크(또는 모델)를 정의합니다.
  3. 손실 함수, 옵티마이저, 모니터링하기 위한 측정 지표를 선택하여 학습 과정을 설정합니다.
  4. 훈련 데이터에 대해 모델의 fit() 메서드를 반복적으로 호출합니다.

모델을 정의하는 방법은 두 가지인데, Sequential 클래스(가장 자주 사용하는 구조인 층을 순서대로 쌓아 올린 네트워크입니다) 또는 함수형 API(완전히 임의의 구조를 만들 수 있는 비순환 유향 그래프를 만듭니다)를 사용합니다.

Sequential 클래스를 사용하여 정의한 2개의 층으로 된 모델을 다시 보겠습니다(첫 번째 층에 입력 데이터의 크기가 전달된 점을 주목하세요).

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(784,)))
model.add(layers.Dense(10, activation='softmax'))

같은 모델을 함수형 API를 사용하여 만들어 보겠습니다.

input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32, activation='relu')(input_tensor)
output_tensor = layers.Dense(10, activation='softmax')(x)

model = models.Model(inputs=input_tensor, outputs=output_tensor)

함수형 API를 사용하면 모델이 처리할 데이터 텐서를 만들고 마치 함수처럼 이 텐서에 층을 적용합니다.

노트_ 함수형 API에 대한 자세한 가이드는 7장에 있습니다. 7장까지는 Sequential 클래스를 사용하여 예제를 만듭니다.

모델 구조가 정의된 후에는 Sequential 모델을 사용했는지 함수형 API를 사용했는지는 상관없습니다. 이후 단계는 동일합니다.

컴파일 단계에서 학습 과정이 설정됩니다. 여기에서 모델이 사용할 옵티마이저와 손실 함수, 훈련하는 동안 모니터링하기 위해 필요한 측정 지표를 지정합니다. 다음이 하나의 손실 함수를 사용하는 가장 흔한 경우의 예입니다.

from keras import optimizers

model.compile(optimizer=optimizers.RMSprop(lr=0.001),
              loss='mse',
              metrics=['accuracy'])

마지막으로 입력 데이터의 넘파이 배열을 (그리고 이에 상응하는 타깃 데이터를) 모델의 fit() 메서드에 전달함으로써 학습 과정이 이루어집니다. 이는 사이킷런Scikit-Learn이나 몇몇 다른 머신 러닝 라이브러리에서 하는 방식과 비슷합니다.12

model.fit(input_tensor, target_tensor, batch_size=128, epochs=10)

다음 몇 개의 장에서 여러 네트워크 구조가 각기 다른 문제에 어떻게 적용되는지, 어떻게 적합한 학습 설정을 선택하는지, 만족할 만한 결과를 얻기 위해 어떻게 모델을 수정하는지 설명하겠습니다. 3.4절, 3.5절, 3.6절에서 이진 분류, 다중 분류, 회귀에 대한 기초적인 세 가지 예를 살펴보겠습니다.

 


 

역주 케라스(κέρας)는 그리스어로 뿔을 의미합니다.
역주 뉴럴 튜링 머신은 신경망을 이용하여 튜링 머신을 구현하는 딥마인(DeepMind)의 2014년 논문(https://bit.ly/28RsmuQ)을 말합니다. 적대적 생성 신경망은 8.5절에서 자세히 설명합니다.
역주 최근에는 파이토치(PyTorch)가 텐서플로, 케라스 다음으로 관심을 많이 받고 있습니다.
10 역주 아마존 웹 서비스 팀에서 확장성이 좋은 딥러닝 프레임워크인 아파치 MXNet을 케라스의 백엔드에 추가하기 위해 작업하고 있으므로 네 번째 백엔드 엔진은 MXNet이 될 가능성이 높습니다.
11 역주 MILA 연구소는 2017년에 씨아노 버전 1.0을 마지막으로 개발을 중지한다고 발표했습니다. 현재 씨아노의 최신 버전은 1.0.1입니다.
12 역주 사이킷런의 API 중 학습을 하는 fit() 메서드와 예측을 만드는 predict() 메서드가 케라스에서 같은 이름과 역할로 사용됩니다.

 

3. 신경망 시작하기 | 목차 | 3.3 딥러닝 컴퓨터 셋팅

 

이 글은 도서출판 길벗에서 출간한  “케라스 창시자에게 배우는 딥러닝“의 1장~3장입니다. 이 책의 저작권은 (주)도서출판 길벗에 있으므로 무단 복제 및 무단 전제를 금합니다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.