2019.02.12

떠오르는 심층 신경망 API, "케라스" 알아보기

Martin Heller | InfoWorld
심층 신경망(deep neural networks)이 유행이라고 하지만 주요 프레임워크의 복잡성으로 인해 머신러닝을 처음 접하는 개발자는 심층 신경망을 다루기가 어려운 실정이다. 그동안 신경망 모델을 구축하기 위한 고수준 API를 개선하고 간소화하는 것을 목표로 몇 가지 제안이 나왔는데, 각 제안은 얼핏 서로 비슷해 보이지만 세부적인 면에서 차이점이 있다.
 
ⓒ Getty Images Bank 

케라스(Keras)는 주요 고수준 신경망 API 가운데 하나로, 파이썬(Python)으로 작성됐으며 여러 백엔드 신경망 엔진을 지원한다.


케라스와 텐서플로우와의 관계

텐서플로우(TensorFlow) 프로젝트가 향후 예정된 텐서플로우 2.0 릴리스를 위한 고수준 API로 케라스를 채택했음을 감안하면 케라스는 최고라고 단정하지는 못하더라도 성공한 API라고 할 수 있다. 이번 기사에서는 케라스의 원칙과 구현 방법을 알아보면서 이 API가 저수준 딥러닝 API에 비해 더 나은 이유가 무엇인지를 살펴본다.

텐서플로우 1.12에서도 공식 텐서플로우 시작하기 자습서에는 텐서플로우에 내장된 고수준 케라스 APItf.keras가 사용된다. 반면 텐서플로우 코어 API의 경우 텐서플로우 계산 그래프, 텐서, 연산, 세션을 다뤄야 하는데, 텐서플로우를 처음 접하는 사람에게는 이해하기가 어려운 부분이 있다. 저수준 텐서플로우 코어 API를 사용할 경우 얻는 이점도 있으므로(대부분 디버깅 관련) 고수준과 저수준 텐서플로우 API를 필요에 따라 섞어 사용하면 된다. 


케라스 원칙

케라스는 ▲사용자 친화성 ▲모듈형 ▲손쉬운 확장 ▲파이썬과의 연계를 기본 원칙 삼아 개발됐다. "기계가 아닌 사람을 위해 설계됐으며 인지 부하를 낮추기 위한 모범 사례에 따른다."

신경층(neural layer), 비용 함수(cost function), 옵티마이저(optimizer), 초기화 방식(initialization scheme), 활성화 함수(activation function), 정규화 방식(regularization scheme) 모두 독립적인 모듈이며 결합을 통해 새로운 모델을 만들 수 있다. 새로운 모듈을 새 클래스와 함수로 간단히 추가할 수 있다. 모델은 별도의 모델 구성 파일이 아닌 파이썬 코드로 정의된다.


케라스가 중요한 이유

케라스를 사용하는 가장 큰 이유의 바탕은 케라스의 기본 원칙, 이 가운데서도 사용자 친화성이라는 원칙에 있다. 배우기 쉽고 모델을 구축하기 쉽다는 점 외에, 케라스는 폭넓은 도입, 광범위한 프로덕션 배포 옵션 지원, 최소 5개 백엔드 엔진과의 통합(텐서플로우, CNTK, 테아노, MXNet, PlaidML), 여러 GPU 및 분산 학습 지원이라는 강점을 제공한다. 또한 구글, 마이크로소프트, 아마존, 애플, 엔비디아, 우버를 비롯한 쟁쟁한 기업들이 지지한다는 점도 중요하다.


케라스 백엔드, 텐서플로우

케라스는 엄밀히 말해 텐서 곱(tensor products), 합성곱(convolutions)과 같은 저수준 작업을 자체적으로 수행하지 않고 백엔드에 의존한다. 케라스는 여러 백엔드 엔진을 지원하지만 주 백엔드이자 기본 백엔드는 텐서플로우이며, 가장 큰 케라스 지지 기업도 구글이다. 케라스 API는 텐서플로우에 tf.keras로 패키징되며 앞서 언급한 바와 같이 텐서플로우 2.0부터 주 텐서플로우 API가 된다.

백엔드를 변경하려면 $HOME/.keras/keras.json 파일을 편집해서 theano 또는 CNTK와 같은 다른 백엔드 이름을 지정하면 된다. 또는 셸이나 파이썬 코드에서 os.environ["KERAS_BACKEND"] 속성을 사용해 환경 변수 KERAS_BACKEND를 정의해 구성된 백엔드를 덮어쓰는 것도 가능하다.


케라스 모델

모델은 핵심 케라스 데이터 구조다. 케라스의 두 가지 주 모델 유형은 시퀀셜(Sequential) 모델, 그리고 함수 API에 사용되는 모델(Model) 클래스다.

- 케라스 시퀀셜 모델
시퀀셜 모델은 계층의 선형적인 스택이며 계층은 아주 단순하게 기술이 가능하다. 다음은 케라스 문서에 있는 model.add()를 사용해 시퀀셜 모델에 두 개의 밀집 계층을 정의하는 예제다.

import keras
from keras.models import Sequential
from keras.layers import Dense

#Create Sequential model with Dense layers, using the add method
model = Sequential()

#Dense implements the operation:
#        output = activation(dot(input, kernel) + bias)
#Units are the dimensionality of the output space for the layer,
#     which equals the number of hidden units
#Activation and loss functions may be specified by strings or classes
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))

#The compile method configures the model’s learning process
model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

#The fit method does the training in batches
# x_train and y_train are Numpy arrays --just like in the Scikit-Learn API.
model.fit(x_train, y_train, epochs=5, batch_size=32)

#The evaluate method calculates the losses and metrics
#     for the trained model
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

#The predict method applies the trained model to inputs
#     to generate outputs
classes = model.predict(x_test, batch_size=128)


이 코드의 주석은 읽어볼 가치가 있다. 또한 예를 들어 저수준 텐서플로우 API에 비해 거추장스러운 부분이 훨씬 적다는 것도 눈여겨볼 만하다. 각 계층 정의에 한 줄의 코드가 필요하고, 컴파일(학습 프로세스 정의)에 한 줄의 코드가 필요하며, 피팅(학습), 평가(손실 및 메트릭 계산), 학습된 모델에서의 예측 출력에서 각각 한 줄의 코드를 사용한다.

- 케라스 함수 API
케라스 시퀀셜 모델은 간소하지만 모델 토폴로지는 제한된다. 케라스 함수 API는 다중 입력/다중 출력 모델, 방향성 비순환 그래프(DAG), 그리고 공유된 계층이 있는 모델과 같은 복잡한 모델을 만드는 데 유용하다.

함수 API는 시퀀셜 모델과 같은 계층을 사용하지만 조합 측면에서 더 높은 유연성을 제공한다. 함수 API에서 먼저 계층을 정의한 다음 모델을 생성하고 컴파일하고 피팅(학습)한다. 평가와 예측은 기본적으로 시퀀셜 모델과 동일하므로 다음 샘플 코드에서는 생략했다.

from keras.layers import Input, Dense
from keras.models import Model

# This returns a tensor
inputs = Input(shape=(784,))

# a layer instance is callable on a tensor, and returns a tensor
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# This creates a model that includes
# the Input layer and three Dense layers
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(data, labels)  # starts training


케라스 계층

앞선 예제에서는 Dense 계층만 사용했다. 케라스에는 폭넓은 사전 정의된 계층 유형이 있으며, 자체 계층을 작성할 수도 있다.

핵심 계층은 Dense(내적 더하기 바이어스), Activation(함수 또는 신경 모양 전송), Dropout(각 학습 업데이트에서 입력 단위의 일부를 무작위로 0으로 설정해서 오버피팅 방지), Lambda(임의 표현을 Layer 객체로 래핑) 및 기타 여러 가지를 포함한다. 컨볼루션 계층(필터를 사용해서 특징 맵 생성)은 1D에서 3D로 실행되며, 각 차원수에 대한 자르기(cropping) 및 전치 컨볼루션(transposed convolution) 계층과 같은 가장 일반적인 변형을 포함한다. 사람의 시각 피질 기능을 본 딴 2D 컨볼루션은 일반적으로 이미지 인식에 사용된다.

풀링(다운스케일링) 계층은 1D에서 3D로 실행되며 최대 및 평균 풀링과 같은 가장 일반적인 변형을 포함한다. 로컬로 연결된 계층은 가중치가 공유되지 않는다는 점을 제외하면 컨볼루션 계층와 같은 방식으로 작동한다. 반복 계층은 단순(완전히 연결된 반복), 게이트, LSTM 등을 포함한다. 이는 언어 처리 등의 응용 분야에 유용하다. 노이즈 계층은 오버피팅을 방지하는 데 도움이 된다.


케라스 데이터셋 

케라스는 keras.datasets 클래스를 통해 7가지 일반적인 딥러닝 샘플 데이터셋을 제공한다. 여기에는 cifar10 및 cifar100 소형 컬러 이미지, IMDB 영화 리뷰, 로이터 뉴스와이어 주요 기사, MNIST 필기 숫자, MNIST 패션 이미지, 보스턴 주택 가격이 포함된다. 


케라스 애플리케이션과 예제

케라스는 10가지 잘 알려진 모델도 제공한다. 이미지넷(ImageNet)으로 사전 학습된 이 모델은 케라스 애플리케이션이라고 하며, Xception, VGG16, VGG19, ResNet50, InceptionV3, InceptionResNetV2, MobileNet, DenseNet, NASNet, MobileNetV2TK다. 이런 모델을 사용해 이미지 분류를 예측하고 특징을 추출하고 다양한 클래스 집합으로 모델을 세부 튜닝할 수 있다.

기존 모델의 세부 튜닝은 학습 속도를 높이기 위한 좋은 방법이다. 예를 들어 원하는 대로 계층을 추가하고 기본 계층을 동결해서 새 계층을 학습시킨 다음 기본 계층 일부의 동결을 해제해서 학습을 세부 튜닝할 수 있다. 계층을 동결하려면 layer.trainable = False를 설정하면 된다.

케라스 예제 저장소에는 40개 이상의 샘플 모델이 있다. 샘플 모델은 시각 모델, 텍스트 및 시퀀스, 생성 모델 등을 다룬다.


케라스 배포

케라스 모델은 다른 어떤 딥러닝 프레임워크보다 더 폭넓은 플랫폼에 배포가 가능하다. 지원되는 플랫폼에는 iOS(CoreML 사용: 애플이 지원함), 안드로이드(텐서플로우 안드로이드 런타임 사용), 브라우저(Keras.js와 WebDNN 사용), 구글 클라우드(텐서플로우 서빙 사용), 파이썬 웹앱 백엔드, JVM(DL4J 모델 가져오기 사용), 라즈베리 파이가 포함된다.

케라스를 시작하는 이라면 이 문서를 읽고, 코드 리포지토리를 살펴보고 텐서플로우(또는 다른 백엔드 엔진)와 케라스를 설치하고 케라스 시퀀셜 모델 시작하기 자습서부터 시도해 보면 된다. 그 다음부터 다른 자습서를 보고 최종적으로 케라스 예제를 살펴보면 된다. editor@itworld.co.kr 


2019.02.12

떠오르는 심층 신경망 API, "케라스" 알아보기

Martin Heller | InfoWorld
심층 신경망(deep neural networks)이 유행이라고 하지만 주요 프레임워크의 복잡성으로 인해 머신러닝을 처음 접하는 개발자는 심층 신경망을 다루기가 어려운 실정이다. 그동안 신경망 모델을 구축하기 위한 고수준 API를 개선하고 간소화하는 것을 목표로 몇 가지 제안이 나왔는데, 각 제안은 얼핏 서로 비슷해 보이지만 세부적인 면에서 차이점이 있다.
 
ⓒ Getty Images Bank 

케라스(Keras)는 주요 고수준 신경망 API 가운데 하나로, 파이썬(Python)으로 작성됐으며 여러 백엔드 신경망 엔진을 지원한다.


케라스와 텐서플로우와의 관계

텐서플로우(TensorFlow) 프로젝트가 향후 예정된 텐서플로우 2.0 릴리스를 위한 고수준 API로 케라스를 채택했음을 감안하면 케라스는 최고라고 단정하지는 못하더라도 성공한 API라고 할 수 있다. 이번 기사에서는 케라스의 원칙과 구현 방법을 알아보면서 이 API가 저수준 딥러닝 API에 비해 더 나은 이유가 무엇인지를 살펴본다.

텐서플로우 1.12에서도 공식 텐서플로우 시작하기 자습서에는 텐서플로우에 내장된 고수준 케라스 APItf.keras가 사용된다. 반면 텐서플로우 코어 API의 경우 텐서플로우 계산 그래프, 텐서, 연산, 세션을 다뤄야 하는데, 텐서플로우를 처음 접하는 사람에게는 이해하기가 어려운 부분이 있다. 저수준 텐서플로우 코어 API를 사용할 경우 얻는 이점도 있으므로(대부분 디버깅 관련) 고수준과 저수준 텐서플로우 API를 필요에 따라 섞어 사용하면 된다. 


케라스 원칙

케라스는 ▲사용자 친화성 ▲모듈형 ▲손쉬운 확장 ▲파이썬과의 연계를 기본 원칙 삼아 개발됐다. "기계가 아닌 사람을 위해 설계됐으며 인지 부하를 낮추기 위한 모범 사례에 따른다."

신경층(neural layer), 비용 함수(cost function), 옵티마이저(optimizer), 초기화 방식(initialization scheme), 활성화 함수(activation function), 정규화 방식(regularization scheme) 모두 독립적인 모듈이며 결합을 통해 새로운 모델을 만들 수 있다. 새로운 모듈을 새 클래스와 함수로 간단히 추가할 수 있다. 모델은 별도의 모델 구성 파일이 아닌 파이썬 코드로 정의된다.


케라스가 중요한 이유

케라스를 사용하는 가장 큰 이유의 바탕은 케라스의 기본 원칙, 이 가운데서도 사용자 친화성이라는 원칙에 있다. 배우기 쉽고 모델을 구축하기 쉽다는 점 외에, 케라스는 폭넓은 도입, 광범위한 프로덕션 배포 옵션 지원, 최소 5개 백엔드 엔진과의 통합(텐서플로우, CNTK, 테아노, MXNet, PlaidML), 여러 GPU 및 분산 학습 지원이라는 강점을 제공한다. 또한 구글, 마이크로소프트, 아마존, 애플, 엔비디아, 우버를 비롯한 쟁쟁한 기업들이 지지한다는 점도 중요하다.


케라스 백엔드, 텐서플로우

케라스는 엄밀히 말해 텐서 곱(tensor products), 합성곱(convolutions)과 같은 저수준 작업을 자체적으로 수행하지 않고 백엔드에 의존한다. 케라스는 여러 백엔드 엔진을 지원하지만 주 백엔드이자 기본 백엔드는 텐서플로우이며, 가장 큰 케라스 지지 기업도 구글이다. 케라스 API는 텐서플로우에 tf.keras로 패키징되며 앞서 언급한 바와 같이 텐서플로우 2.0부터 주 텐서플로우 API가 된다.

백엔드를 변경하려면 $HOME/.keras/keras.json 파일을 편집해서 theano 또는 CNTK와 같은 다른 백엔드 이름을 지정하면 된다. 또는 셸이나 파이썬 코드에서 os.environ["KERAS_BACKEND"] 속성을 사용해 환경 변수 KERAS_BACKEND를 정의해 구성된 백엔드를 덮어쓰는 것도 가능하다.


케라스 모델

모델은 핵심 케라스 데이터 구조다. 케라스의 두 가지 주 모델 유형은 시퀀셜(Sequential) 모델, 그리고 함수 API에 사용되는 모델(Model) 클래스다.

- 케라스 시퀀셜 모델
시퀀셜 모델은 계층의 선형적인 스택이며 계층은 아주 단순하게 기술이 가능하다. 다음은 케라스 문서에 있는 model.add()를 사용해 시퀀셜 모델에 두 개의 밀집 계층을 정의하는 예제다.

import keras
from keras.models import Sequential
from keras.layers import Dense

#Create Sequential model with Dense layers, using the add method
model = Sequential()

#Dense implements the operation:
#        output = activation(dot(input, kernel) + bias)
#Units are the dimensionality of the output space for the layer,
#     which equals the number of hidden units
#Activation and loss functions may be specified by strings or classes
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))

#The compile method configures the model’s learning process
model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])

#The fit method does the training in batches
# x_train and y_train are Numpy arrays --just like in the Scikit-Learn API.
model.fit(x_train, y_train, epochs=5, batch_size=32)

#The evaluate method calculates the losses and metrics
#     for the trained model
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

#The predict method applies the trained model to inputs
#     to generate outputs
classes = model.predict(x_test, batch_size=128)


이 코드의 주석은 읽어볼 가치가 있다. 또한 예를 들어 저수준 텐서플로우 API에 비해 거추장스러운 부분이 훨씬 적다는 것도 눈여겨볼 만하다. 각 계층 정의에 한 줄의 코드가 필요하고, 컴파일(학습 프로세스 정의)에 한 줄의 코드가 필요하며, 피팅(학습), 평가(손실 및 메트릭 계산), 학습된 모델에서의 예측 출력에서 각각 한 줄의 코드를 사용한다.

- 케라스 함수 API
케라스 시퀀셜 모델은 간소하지만 모델 토폴로지는 제한된다. 케라스 함수 API는 다중 입력/다중 출력 모델, 방향성 비순환 그래프(DAG), 그리고 공유된 계층이 있는 모델과 같은 복잡한 모델을 만드는 데 유용하다.

함수 API는 시퀀셜 모델과 같은 계층을 사용하지만 조합 측면에서 더 높은 유연성을 제공한다. 함수 API에서 먼저 계층을 정의한 다음 모델을 생성하고 컴파일하고 피팅(학습)한다. 평가와 예측은 기본적으로 시퀀셜 모델과 동일하므로 다음 샘플 코드에서는 생략했다.

from keras.layers import Input, Dense
from keras.models import Model

# This returns a tensor
inputs = Input(shape=(784,))

# a layer instance is callable on a tensor, and returns a tensor
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# This creates a model that includes
# the Input layer and three Dense layers
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(data, labels)  # starts training


케라스 계층

앞선 예제에서는 Dense 계층만 사용했다. 케라스에는 폭넓은 사전 정의된 계층 유형이 있으며, 자체 계층을 작성할 수도 있다.

핵심 계층은 Dense(내적 더하기 바이어스), Activation(함수 또는 신경 모양 전송), Dropout(각 학습 업데이트에서 입력 단위의 일부를 무작위로 0으로 설정해서 오버피팅 방지), Lambda(임의 표현을 Layer 객체로 래핑) 및 기타 여러 가지를 포함한다. 컨볼루션 계층(필터를 사용해서 특징 맵 생성)은 1D에서 3D로 실행되며, 각 차원수에 대한 자르기(cropping) 및 전치 컨볼루션(transposed convolution) 계층과 같은 가장 일반적인 변형을 포함한다. 사람의 시각 피질 기능을 본 딴 2D 컨볼루션은 일반적으로 이미지 인식에 사용된다.

풀링(다운스케일링) 계층은 1D에서 3D로 실행되며 최대 및 평균 풀링과 같은 가장 일반적인 변형을 포함한다. 로컬로 연결된 계층은 가중치가 공유되지 않는다는 점을 제외하면 컨볼루션 계층와 같은 방식으로 작동한다. 반복 계층은 단순(완전히 연결된 반복), 게이트, LSTM 등을 포함한다. 이는 언어 처리 등의 응용 분야에 유용하다. 노이즈 계층은 오버피팅을 방지하는 데 도움이 된다.


케라스 데이터셋 

케라스는 keras.datasets 클래스를 통해 7가지 일반적인 딥러닝 샘플 데이터셋을 제공한다. 여기에는 cifar10 및 cifar100 소형 컬러 이미지, IMDB 영화 리뷰, 로이터 뉴스와이어 주요 기사, MNIST 필기 숫자, MNIST 패션 이미지, 보스턴 주택 가격이 포함된다. 


케라스 애플리케이션과 예제

케라스는 10가지 잘 알려진 모델도 제공한다. 이미지넷(ImageNet)으로 사전 학습된 이 모델은 케라스 애플리케이션이라고 하며, Xception, VGG16, VGG19, ResNet50, InceptionV3, InceptionResNetV2, MobileNet, DenseNet, NASNet, MobileNetV2TK다. 이런 모델을 사용해 이미지 분류를 예측하고 특징을 추출하고 다양한 클래스 집합으로 모델을 세부 튜닝할 수 있다.

기존 모델의 세부 튜닝은 학습 속도를 높이기 위한 좋은 방법이다. 예를 들어 원하는 대로 계층을 추가하고 기본 계층을 동결해서 새 계층을 학습시킨 다음 기본 계층 일부의 동결을 해제해서 학습을 세부 튜닝할 수 있다. 계층을 동결하려면 layer.trainable = False를 설정하면 된다.

케라스 예제 저장소에는 40개 이상의 샘플 모델이 있다. 샘플 모델은 시각 모델, 텍스트 및 시퀀스, 생성 모델 등을 다룬다.


케라스 배포

케라스 모델은 다른 어떤 딥러닝 프레임워크보다 더 폭넓은 플랫폼에 배포가 가능하다. 지원되는 플랫폼에는 iOS(CoreML 사용: 애플이 지원함), 안드로이드(텐서플로우 안드로이드 런타임 사용), 브라우저(Keras.js와 WebDNN 사용), 구글 클라우드(텐서플로우 서빙 사용), 파이썬 웹앱 백엔드, JVM(DL4J 모델 가져오기 사용), 라즈베리 파이가 포함된다.

케라스를 시작하는 이라면 이 문서를 읽고, 코드 리포지토리를 살펴보고 텐서플로우(또는 다른 백엔드 엔진)와 케라스를 설치하고 케라스 시퀀셜 모델 시작하기 자습서부터 시도해 보면 된다. 그 다음부터 다른 자습서를 보고 최종적으로 케라스 예제를 살펴보면 된다. editor@itworld.co.kr 


X